1、使用hash函式
2、預處理階段時間複雜度o(m),常量空間
3、查詢階段時間複雜度o(mn)
在大多數實際情況下,hash法提供了避免二次方比較時間的一種簡單的方法. 不同於檢查文字中的每乙個位置是否匹配,只檢查模式串和指定文字視窗的相似性似乎更高效. hash函式被用來檢查兩個字串的相似度.
有利於字串匹配的hash函式應該有如下的效能:
1. 高效可計算;
2. 對字串高度識別;
3. hash(y[j+1 .. j+m]) 必須要很容易計算 hash(y[j .. j+m-1]) 和y[j+m]:
hash(y[j+1 .. j+m])= rehash(y[j], y[j+m], hash(y[j .. j+m-1]).
對於乙個單詞w 長度為m,hash(w) 定義如下:
hash(w[0 .. m-1])=(w[0]*2m-1+ w[1]*2m-2+···+ w[m-1]*20) mod q
其中q 是乙個很大的數.
rehash(a,b,h)= ((h-a*2m-1)*2+b) mod q
karp-rabin 演算法的預處理階段由計算hash(x)構成. 在常量空間和o(m) 執行時間內完成.
在搜尋階段,使用hash(y[j .. j+m-1]) 0
karp-rabin演算法的搜尋階段的時間複雜度為:o(m
n) (例如在a
n 中搜尋 a
m).期望比較次數為:o(n+m).
預處理階段: hash[y]=17597
搜尋階段:
第1次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[0 .. 7]) = 17819
第2次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[1 .. 8]) = 17533
第3次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[2 .. 9]) = 17979
第4次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[3 .. 10]) = 19389
第5次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[4 .. 11]) = 17339
第6次嘗試 g
catc
gcag
agag
tata
cagt
acg1
2345
678g
caga
gag hash(y[5 .. 12]) = 17597
第7次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[6 .. 13]) = 17102
第8次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[7 .. 14]) = 17117
第9次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[8 .. 15]) = 17678
第10次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[9 .. 16]) = 17245
第11次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[10 .. 17]) = 17917
第12次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[11 .. 18]) = 17723
第13次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[12 .. 19]) = 18877
第14次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[13 .. 20]) = 19662
第15次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[14 .. 21]) = 17885
第16次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[15 .. 22]) = 19197
第17次嘗試 g
catc
gcag
agag
tata
cagt
acgg
caga
gag hash(y[16 .. 23]) = 16961
上面的例子中karp-rabin 演算法執行8個字元的比較.
//completed on 2014.10.7 8:45
//language: c99
////
//#define rehash(a, b, h) ((((h) - (a)*d) << 1) + (b))
int kr(char *x, int m, char *y, int
n)
/*搜尋
*/j = 0
;
while (j <= n-m)
}
字串匹配經典算
最近在刷資料結構,看到了字串匹配演算法kmp,bm,kp等,感覺是面試中應該要會的知識點,就先記錄下來了,方便之後的複習檢視 1.kmp演算法 kmp演算法是在暴力演算法之上做了一些改進,不會重複的比對當前比對失敗的字首,即利用了匹配串本身的資訊來構造乙個查詢表next,該錶能夠指導當次匹配失敗下,...
字串匹配
題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...
字串匹配
time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...