Karp-Rabin算法

时间:2018-10-31 05:49:08

标签: rabin-karp

下图来自:6.006-Introduction to algorithms

enter image description here

在完成麻省理工学院OCW提供的课程6.006-算法入门时,我遇到了Rabin-Karp算法。

有人可以帮助我了解为什么需要第一个rs()== rt()吗?如果使用过,那我们是否也应该先用蛮力检查一下弦是否相等,然后继续前进?为什么从t [0]进行散列然后尝试查找其他字符串匹配项时,我们不考虑字符串的相等性?

在图像中,rs()用于散列值,而rs.skip [arg]假定该字符串为“ arg”,则删除该字符串的第一个字符

1 个答案:

答案 0 :(得分:1)

  

有人可以帮助我了解为什么需要第一个rs()==rt()吗?

我假设您的意思是范围循环之前的那个。如果字符串的长度相同,则范围循环将不运行(空范围)。支票对于支付这种情况是必要的。

  

如果使用过,那我们是否也应该先用蛮力检查一下弦是否相等,然后继续前进?

不确定您的意思。找到匹配的哈希后,发布的代码保留为空白(带有...)。让我们不要忘记那一点,我们必须比较字符串以确认我们确实找到了匹配项。而且,取决于(未显示)实现是否继续搜索直到结束。

  

为什么从t [0]开始进行散列然后尝试查找其他字符串匹配项时,我们不考虑字符串的相等性?

我真的不明白这一点。请注意,前两个循环是为输入字符串填充滚动哈希。然后检查我们在这一点上是否有匹配项,然后循环逐对更新滚动哈希,然后进行比较。从头到尾检查整个t