天天看點

使用遞歸哈希進行精确模式串比對

字元串處理是每個程式設計者都必須掌握的知識,主要看看字元串的搜尋查找功能。

現在的程式設計語言如C/C++/Java等都提供了對字元串子串的查找功能,具體如下:

(1)C:strchr,strstr。

(2)C++:find,rfind,find_first_of,find_first_not_of等等。

(3)Java:indexOf,lastIndexOf等。

下面說明一種使用遞歸哈希進行字元串搜尋/查找的方法:

(1)遞歸哈希

  維護一個視窗,大小為n。如下公式即為起始位置為x,長度為n的視窗的哈希數值。

使用遞歸哈希進行精确模式串比對

  遞歸哈希主要展現在哈希數值的更新操作,減少重複的計算。下面是遞歸哈希的更新公式。

  

使用遞歸哈希進行精确模式串比對

因為視窗[x,x+n)與[x+1,x+n+1)有n個相同的字元,在上的更新公式中我們可以看到,更新就是把“頭元素”的哈希數值去掉,在加上一個新增的視窗元素。

(2)使用遞歸哈希進行字元串比對

  設模式串為pattern,文本為text,設定視窗大小Plen與模式串的長度相同。每次保持文本中Plen長度字元串的哈希值,當哈希值與模式串的哈希值相等時,進行字元串的具體校驗。如果校驗相等,報告結果。

使用遞歸哈希進行精确模式串比對
使用遞歸哈希進行精确模式串比對

View Code

執行輸出:

使用遞歸哈希進行精确模式串比對