這一節介紹一下由rabin和karp提出的rk演算法。
1,rk演算法的基本思想
hash!
如果兩個字串hash後的值不相同,則它們肯定不相同;如果它們hash後的值相同,它們不一定相同。
rk演算法的基本思想就是:將模式串p的hash值跟主串s中的每乙個長度為|p|的子串的hash值比較。如果不同,則它們肯定不相等;如果相同,則再諸位比較之。
2,rk演算法的求解過程
將我們用來比較的字串的全集設為∑=,設∑的長度為d=|∑|,則主串和模式串都可以看作是d進製數。例如只由數字組成的字串,它的全集∑=,d=10。
設模式串為p,其長度為m,主串為s,其長度為n。則模式串p可以看作是乙個m位的d進製數a,主串s可以看作是乙個n位的d進製數。我們的模式匹配過程就是將a與主串中的每個長度為m的d進製數s[t…t+m-1] (t=0,1,2,…,n-m+1)的值做比較,所以整個模式匹配過程就變成了兩個d進製數之間的比較過程。例如模式串為123,主串為65127451234,就是將十進位制數123跟十進位制數651, 512, 127, 274, 745, 451, 512, 123的逐個比較過程。
明確了匹配過程,下面就是求解a和求解s[t…t+m-1] (t=0,1,2,…,n-m+1)的過程:
1)求解a。根據多項式計算方法,a = p[m-1] + d * (p[m-2] + d * (p[m-3] + …+ d * (p[1] + d*p[0])…))
2)求解s[t…t+m-1]。為了方便表示,我們設s[t…t+m-1] = st,則s[t+1…t+m] = st+1
假設已求得st,現在要求st+1,需要注意的是st+1是st去掉高位資料,其餘的m-1位乘以d後再在最低位加一位得到。於是
st+1 = d * (st – dm-1*s[t]) + s[t+m]
公式比較晦澀,舉個例子看看吧。比如上面例子中主串是65127451234。s2=127,那麼s3=10×(127-102×1)+ 4 = 274
現在的問題是,如果a的值太大,比較的過程會比較耗時,這個時候我們可以將這個大數mod q(q是乙個大素數),同理,st也mod q,將兩個取模之後的數相比較。
3,rk演算法的實現
14,演算法的複雜度分析#define q 144451
2#define d 2634
int ismatch(char *s, int i, char *p, intm)5
1213
/*14
* 字串匹配的rk演算法
15* author:rabin & karp
16* 實現:cobbliu
17* 若成功匹配返回主串中的偏移,否則返回-1
18*/
19int rk(char *s, char *p)
2036
37for(i = 0; i != n-m; i++)
4344
return -1
;45 }
如果選擇的素數q>=m, 則rk演算法的期望執行時間為o(n+m), 如果m<
字串模式匹配 BF演算法和RK演算法
bf演算法 暴力匹配演算法,也叫樸素匹配演算法 效能不是很高。我們在主串中,檢查起始位置分別是0.1.2 n m且長度為n m 1個子串,看有沒有跟模式串匹配的。在a中查詢b,a就是主串,b就是模式串,且a b 最壞的時間複雜度為o n m 但是實際上,這也是常用的,1.模式串和主串的長度都不會太長...
獨樹一幟的字串匹配演算法 RK演算法
參加了雅虎2015校招,筆試成績還不錯,誰知初面第一題就被問了個字串匹配,要求不能使用kmp,但要和kmp一樣優,當時瞬間就呵呵了。後經過面試官的一再提示,也還是沒有成功在面試現場寫得。現將該演算法記錄如下,思想絕對是字串匹配中獨樹一幟的 字串匹配 存在長度為n的字元陣列s 0.n 1 長度為m的字...
串的模式匹配演算法
子串的定位操作通常稱做串的模式匹配,這也是串的乙個很要的操作。一,一般定位子串位置演算法 演算法基本思想 從主串的第1個字元起和模式的第乙個字元進行比較,若相等,則再比較主串和模式串的後續字元。否則將主串的後續字元和模式串的第乙個字元進行比較,在網上找的一張 return i t.length 找到...