数据结构和算法学习笔记-字符串匹配(BF RK)

字符串匹配

单模式串匹配算法:BF算法和RK算法 BM算法和KMP算法
多模式串匹配算法:Trie树和AC自动机

BF算法 =Brute Force= 暴力匹配算法,也叫朴素匹配算法

主串(n)和模式串(m) n>m
我们要对比m个字符,要对比n-m+1次 最坏时间复杂度O(n*m)
1.串不长,遇到不能匹配的字符的时候就可以退出了,大部分情况下效率比最差情况高很多
2.思路简单,实现简单。符合KISS(Keep it Simple and Stupid)原则

RK算法=Rabin-Karp

通过哈希算法对主串中n-m+1个字串分别求哈希值,然后逐个与模式串的哈希值比较大小。先不考虑哈希冲突的情况
不过,通过哈希算法计算字串的哈希值的时候,我们需要遍历字串中每个字符。尽管模式串与子串比较的效率提高了,但是算法整体的效率并没有提高。有没有方法可以提高哈希算法计算子串哈希值的效率呢?
哈希算法设计=》用k进制数来表示一个子串,K进制数转化成十进制数
查找前后两个字串之间的关系和计算公式,然后用查表的方式来处理指数计算。

整个RK算法包含两部分,计算子串哈希值和模式串哈希值与子串哈希值之间的比较。第一部分,可以通过设计特殊的哈希算法,只需要扫描一遍主串就能计算出所有子串的哈希值了,所以时间复杂度O(n)
模式串哈希值与每个子串哈希值之间的比较的时间复杂度O(1),总共需要比较n-m+1个子串的哈希值,所以,这部分的时间复杂度也是O(n)。整体时间复杂度O(n)

这里还有一个问题就是,模式串很长,相应的主串张的子串也会很长,通过上面的哈希算法计算得到的哈希值就可能很大,如果超过了计算机中整型值可以表示的范围,那该如何解决呢?

你可能感兴趣的:(数据结构和算法,BF,RK,字符串匹配)