常用的数据结构
字符串
在了解什么是字符串之前我们先了解什么是字符。数字、字母、字、符号等等都是字符,如8、H、h、国、&等。将字符连接起来便成了字符串。
存储方式
- 顺序存储,字符串的顺序存储结构,是用一组地址连续的存储单元来存储串中的字符序列,一般是用定长数组来实现。有些语言会在串值后面加一个不计入串长度的结束标记符,比如 \0 来表示串值的终结。
- 链式存储,字符串的链式存储结构,与线性表是相似的,但由于串结构的特殊性(结构中的每个元素数据都是一个字符),如果也简单地将每个链结点存储为一个字符,就会造成很大的空间浪费。因此,一个结点可以考虑存放多个字符,如果最后一个结点未被占满时,可以使用 “#” 或其他非串值字符补全
RK算法(字符串Hash)
哈希( Has**h )是一种神奇的查找算法,广泛运用于计算机领域,它的强大在于设计得好的哈希算法可以使对一个对象的查找时间复杂度降为 O(1) ,这是朴素查找的 O(n) 和二分查找的 O(logn) 所远不能及的。
每一个字符都有它对应的 ASCII 码,也就是说,一个字符可以表示为一个数字。我们可以运用这一点特性,将输入的字符串转换为一个 P 进制数。并且可以对它用M取模,防止长度越界。
Hash冲突的解决方案
- 开放定址法,即当一个关键字和另一个关键字发生冲突时,使用某种探测技术在哈希表中形成一个探测序列,然后沿着这个探测序列依次查找下去。当碰到一个空的单元时,则插入其中。
- 链地址法,将哈希地址相同的记录存储在一张线性链表中。
BF算法(朴素模式匹配)
BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;
若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。时间复杂度为O(m*n)
BM算法
坏字符规则
有主串axcgfggf,模式串axf。模式串从后往前匹配,那么主串中第三个c则是坏字符,因为前面的两个都能和模式串匹配,但是它匹配不上。
(1)模式串与主串从后向前匹配
(2)发现坏字符后,如果坏字符不存在于模式串中:将模式串的头字符与坏字符后一位对齐
(3) 发现坏字符后,如果坏字符存在于模式串中:将模式串中坏字符最后一次出现的位置与坏字符对齐
后移位数=坏字符的位置 - 搜索次中上一次出现的位置(注意这里的后移位数指从主串0的位置开始,如果模式串中不存在坏字符,则上一次出现的位置为-1)
但如果主串是aaaaaaaaaaaaaaa,模式串是baaaaaaaaaa,根据si-ix计算出来的是负数,还会倒退。
好后缀规则
后移位数 = 好后缀的位置 - 搜索词中上一次出现位置(好后缀取最后那个字符的下标)
像上面的