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個字符,而不是一個字符串。