字符匹配算法-RK算法
-
R-K算法流程:
思想是构造一个hash函数,字符串作为输入,hash值相同的字符串有极大可能匹配。检测流程基本和暴力匹配是一样的,但是为什么效率可以达到O(n)呢?n为待匹配字符串长度,因为在[i,i+m-1]检测失败后,进行[i+1,i+m]检测时,计算hash值可以直接通过前者的hash值计算得到,时间复杂度为O(1).所以最终复杂度可以达到O(n).
该算法效率关键在于hash函数的设置,减少冲突。
hash函数为:hash(Si-m+1…Si) = Si-m+1xm-1 + Si-m+2xm-2 + … + Si-1*x + Si则 hash(Si-m+2…Si+1) = Si-m+2xm-1 + Si-m+3xm-2 + … + Six + Si+1 = (hash(Si-m+1…Si) - Si-m+1xm-1) * x + Si+1
代码:
int strStr(string haystack, string needle) { int hs_l=haystack.length(); int nd_l=needle.length(); if(nd_l==0)return 0; if(hs_l<nd_l || hs_l==0) return -1; unsigned int base=1; unsigned int x=7; unsigned int vas=(unsigned char