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

你可能感兴趣的:(算法)