Algorithm 有人能给我解释一下拉宾卡普算法吗;什么是复杂性?

Algorithm 有人能给我解释一下拉宾卡普算法吗;什么是复杂性?,algorithm,time-complexity,big-o,string-matching,rabin-karp,Algorithm,Time Complexity,Big O,String Matching,Rabin Karp,我试图理解为什么Rabin-Karp算法的最坏运行时间是O(nm),而平均运行时间是O(n+m) 有人能帮我吗?很好地解释了算法的时间复杂性 可以说,哈希计算函数的有效性(将其理解为在恒定时间内动态重用已计算的哈希值的能力)是算法时间复杂度计算期间的决定因素 让我们看看散列计算是如何产生这种差异的 对于以下情况,时间复杂度为O(nm): call hash(s[1..m]) // O(m) additive for index from 1 to n-m+1

我试图理解为什么Rabin-Karp算法的最坏运行时间是O(nm),而平均运行时间是O(n+m)

有人能帮我吗?

很好地解释了算法的时间复杂性

可以说,哈希计算函数的有效性(将其理解为在恒定时间内动态重用已计算的哈希值的能力)是算法时间复杂度计算期间的决定因素

让我们看看散列计算是如何产生这种差异的


对于以下情况,时间复杂度为
O(nm)

call hash(s[1..m])                  // O(m) additive
for index from 1 to n-m+1           // O(n)
    //Code to check if substring matches
    call hash(s[index+1..index+m])  // Inefficient hash function, takes O(m), just like naive string matching
call hash(s[1..m])                  // O(m) additive
for index from 1 to n-m+1           // O(n)
    //Code to check if substring matches
    call hash(s[index+1..index+m])  //Efficient hash function which takes only O(1), applies Rolling Hashing
O(nm)
相比,添加剂
O(m)
在很大程度上被忽略

给予,
O(m)+O(n)*O(m)
=
O(nm)


对于以下情况,时间复杂度为
O(n+m)

call hash(s[1..m])                  // O(m) additive
for index from 1 to n-m+1           // O(n)
    //Code to check if substring matches
    call hash(s[index+1..index+m])  // Inefficient hash function, takes O(m), just like naive string matching
call hash(s[1..m])                  // O(m) additive
for index from 1 to n-m+1           // O(n)
    //Code to check if substring matches
    call hash(s[index+1..index+m])  //Efficient hash function which takes only O(1), applies Rolling Hashing
给出,
O(m)+O(n)*O(1)
=
O(m)+O(n)
=
O(m+n)
拉宾·卡普是最坏的O(nm)情况,因为它可能会在每个点(其中有
n
)发现假阳性,并且可能需要多达
m
的比较来验证匹配,因为您需要实际比较字符串

即使是不应该发生的半合理的散列函数,但对于任何散列函数,都可以创建一个显示上述病态行为的查询(即搜索的字符串和子字符串)

因此,尽管R-K预计时间复杂度为O(n),但最坏的情况是时间复杂度为O(nm)。(注意:由于
m
必须不大于
n
n+m
2n
为界,因此O(n+m)与O(n)相同。)

如果问题是找到所有匹配的子字符串,那么产生O(nm)行为就更容易了,这是经常使用R-K的另一个上下文。在这种情况下,在由
n
as组成的字符串中搜索由
m
as组成的子字符串肯定需要
nm
时间,因为子字符串需要在源字符串中的每一点进行匹配


还有其他算法可用于查找n中仍然线性的所有子字符串,即使在病理情况下也是如此。

这是的副本,但不允许我使用该问题,因为答案既没有被接受,也没有经过投票。谢谢您的帮助!现在我了解了最坏情况下的运行时间复杂性。但我仍然不了解该算法的平均情况。你能解释一下吗?@user6812711:我概述的场景非常罕见。通常情况下,只有很少或没有误报,并且仅通过查看第一个或两个字符来识别少数误报。所以几乎所有的时间都是O(n)来找到正确的字符串,O(m)来验证它的正确性。正如我在回答中解释的,因为
m