(三)Rabin Karp字串查詢演算法

2021-07-29 23:16:23 字數 1000 閱讀 8525

不同於傳統的字元比較,本演算法的核心在於雜湊。

先計算出子串 pat 的乙個雜湊值,然後從文字 txt 中,從 i = 0 開始,計算從當前 i 開始的子串長度的字串的雜湊,比如 pat = 『250』,txt = 『230240250』,計算的是 『230』、』302』、』024』的雜湊,依次類推,與』250』的雜湊值進行比較,如果雜湊值相同,再比較兩個字串是否匹配,當然會有雜湊衝突,但是可以把衝突機率降低,忽略不計,該演算法是線性時間,前提是使用了rabin-karp發明的求雜湊值的演算法。

除留餘數法

// 取餘操作有乙個基本性質,每次算數操作之後取餘,等價於所有算數操作都結束後再取餘

long jp_hash(char *key, int m)

return result;

}

以上,子串 pat 的雜湊值求完了。

然後

匹配過程中 txt 子串的雜湊值計算,即在 i 的基礎上計算 i+1 的雜湊值。如圖:

核心演算法是:

int jp_search(char *txt, char *pat) 

}return n; // 查詢失敗

}

比較難理解的應該是計算 txt_hash 的兩句,這裡還是應用了取餘操作的基本原則,第二句裡的txt_hash本來應該是數的值,但等價於該值取餘之後的餘數,所以第一句計算的是新子串的餘數,即上乙個txt_hash減去第乙個字元的餘數,然後第二句是加上新字元再次求餘數即txt_hash,+q是防止 txt_hash - rm * txt[i-m] % q 這裡出現負數。

參考:《演算法》第四版

字串 Rabin Karp指紋字串查詢演算法

暴力字串匹配 brute force string matching 是子串匹配演算法中最基本的一種,它確實有自己的優點,比如它並不需要對文字 text 或模式串 pattern 進行預處理。然而它最大的問題就是執行速度太慢,所以在很多場合下暴力字串匹配演算法並不是那麼有用。我們需要一些更快的方法來...

子字串查詢之Rabin Karp演算法

1.1 演算法簡介 m.o.rabin和r.a.karp發明了一種基於雜湊的字串查詢演算法。我們只需要計算模式串的雜湊函式,然後利用相同的雜湊函式計算文字中所有可能的m個字元的子字串雜湊值並尋找匹配。如果找到了乙個雜湊值和模式字串相同的子字串,再繼續驗證是否相同。這是乙個有趣的演算法,重點不在於其只...

4042 Rabin Karp字串匹配

時間限制 1000ms 記憶體限制 65536kb 描述現在有乙個僅由小寫字母組成的字串s,假定將字母a,b,c.z依次編號為1,2,3.26,現在要在s中找到所有長度為m的且字母編號和為q的子串。輸入第一行輸入n,表示測試資料的個數,以下n行每行包含乙個測試資料 一行測試資料由三部分組成 字串s ...