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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值