字串匹配 Karp Rabin演算法

2021-09-06 18:34:08 字數 3505 閱讀 4432

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中保證不出現...