当前位置: 代码迷 >> 综合 >> Rabin-Karp大白话解析
  详细解决方案

Rabin-Karp大白话解析

热度:39   发布时间:2024-03-06 23:54:25.0

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冲突

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