Rabin-Karp大白话解析

1.什么是Rabin-Karp算法

什么是Rabin-Karp算法,它是一个常见的字符串匹配算法,通常学过数据结构的人知道,常见的字符串匹配算法有BF,KMP算法,其中KMP算法性能是比较优良的,在这里讲的是Rabin-Karp(简称RK)算法,性能也是很好的,利用了hashcode的思想,将比较的字符串进行求hashcode的值,我们知道,若两个字符不同,他们的hashcode值可能相同(几率很小),若两者hashcode值不同,必推出两个字符串不同,所以利用这个思想就设计了RK算法。

2.RK算法解析

        现在举个例子假如有两个字符串,T和P,T为主串,P为待匹配的模式串

        

T和P串都是待匹配的数值字符串,虽然都是数字,但都是字符型数字。那么这里就采取如下步骤来解决该字符串匹配问题

  1. 分别计算T串前四位的hashcode值和P串的hashcode值,其中我们可以引入一个权值r=10,来计算着几位字符串的hashcode,其中 "1256"的hashcode值为tval=('1'-'0')*10^3+('2'-'0')*10^2+('5'-'0')*10^1+('6'-'0')*10^0=1256,同理"5689"的hashchode值为pval=5689
  2. 计算pval与tval的值是否相同,若不同,则T的下一次要求的字符串为"2568",即整体字符串往左移动一位,这样新得到的hashcode值怎么计算啊,是否为上一步的tval=(tval-('1'-'0')*h)*r+('8'-'0')  (这里h代表最高位的n次幂的值,即h=10^3)。总的来说就是上一次的值,减去最高位的值乘以权值,然后再加上最低位的值。
  3. 再一次比较pval和tval的值,若相同,则说明匹配成功,否则则匹配失败,匹配失败则会继续上一步操作,直到T的待匹配字符串长度小于p的字符串长度,这标记匹配失败

3.RK的算法引入的问题

 由刚才的算法可知,会有几个问题需要考虑:

  • 若待匹配字符串长度过长,权值过大,那么求得的hashcode值必会导致溢出,现有的数据类型不能保存的问题
  • 若hashcode取值过大通常会考虑模一个素数,虽然解决了溢出问题,但是会导致hash冲突

所以为了解决以上两个问题,我们需要改进以上算法

 4.RK的算法遗留问题解决

    1.每次hashcode值过大的时候我们可以进行取余运算,模一个素数,这样会使得既定的hashcode值不会很大

    2.模运算之后的hashcode值势必会有一定几率导致两个不同的字符求得的hashcode值取值相同,所以我们要引入解决冲突的办法,若求得的两个串的的hashcode值相同,我们可以从头到尾进行比较这两个字符串是否相同,来解决hash冲突的问题。

 5.RK的算法实现

 

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页