RK算法

RK算法全程Rabin-Karp,該算法的2位發明者Rabin和Karp的名字組合而成。該算法的核心思想就是通過比較2個字符串的hashcode來判斷是否包含對方。

由於該算法核心思想是計算字符串的hashcode,因此必須保證hash算法針對不同的字符串得出不同的值,例如:abc、bca、acb這3種相同字符不同排序的情況下,保證這3種字符串的hashcode不同。

實際應用:下面有2個字符串,如何判斷主串包含有模式串呢?

主串:ABCDqwertydcs

模式串:rtydc

答:

第一步:計算模式串的hashcode。僞代碼如下:

hashcode1 = hash(rtydc);

第二步:生成主串當中第一個等長子串的hashcode

由於模式串長度爲5,因此必須把主串按照長度爲5的規則進行切割,例如:ABCDq、BCDqw、CDqwe等等。

hashcode2 = hash(ABCDq);

第三步:比較兩個hashcode是否相等

如果兩個hashcode不相等,則繼續重複執行第二步;

如果兩個hashcode相等,然後再拆分每個字符進行比對進一步確保字符相等,如果每個字符都相等則終止流程;

 

 

另外還有一個問題就是hash的次數,如果按照第二步流程,相當於對主串進行了O(n)次hash運算,那是不是可以優化呢?

可以優化的,我們仔細看一下:

ABCDqwertydcs按照5個長度依次分割:

ABCDq

BCDqw

CDqwe

Dqwer

qwert

那麼,我們可以得出結論:

新hashcode = 舊hashcode - hash(上一個字符) + hash(下一個字符)

基於上面的公式,除了第一次,剩餘計算hash的時候只計算2個字符,而不是一個字符串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章