【问题标题】:String searching algorithm - Complexity of string matching字符串搜索算法 - 字符串匹配的复杂性
【发布时间】:2016-12-11 14:30:53
【问题描述】:

我正在尝试解决 'String search algorithm',但许多网站的答案似乎很复杂('Naive string search' with O( m(n-m+1) ),下面我的算法有什么问题,它的最坏情况复杂度为 O(n),而 KMP 也有 O(n ) 所以我肯定是错的,但是在哪里呢?

def find(s1, s2):
    size = len(s1)
    index = 0 
    while ( index != len(s2)):
        if s2[index : index + size] == s1:
            print 'Pattern found at index %s'%(index)
            index += size
        else:
            index += 1

好的,所以我假设 s2[index : index + size] == s1 是 O(1),即 O(n),所以现在我原来的问题变成了,

  • 为什么不计算和比较两个字符串的哈希值,如果两个哈希值相等,字符串应该相等。
  • 我不明白它们怎么会发生碰撞。这不依赖于哈希算法。就像MD5 有已知的中断。

【问题讨论】:

  • 你假设 s2[index : index + size] == s1 是 O(1)。是吗?
  • 如何在小于 O(len(s1)) 的时间内计算出s2[index:index+size] 的哈希值?可以使用滚动哈希来做到这一点(这正是 Rabin-Karp 所做的),但您似乎建议 python 应该以某种方式为您做到这一点。 en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm 涵盖了这个。
  • @PaulHankin thx,我天真地认为字符串搜索如此简单,只需眨眼即可完成。让我花点时间阅读他们多年的研究成果。

标签: python string algorithm md5


【解决方案1】:

原始问题

我不认为您的代码复杂度为 O(n),而是 O(mn)。此检查:s2[index : index + size] == s1,因为在最坏的情况下,它需要对字符进行len(s1) 比较。


散列

这里是Wikipedia's definition of a hash function

散列函数是任何可用于映射数据的函数 任意大小到固定大小的数据。哈希返回的值 函数被称为散列值、散列码、摘要或简称 哈希。一种用途是一种称为哈希表的数据结构,广泛用于计算机软件中用于快速数据查找。

在这里,我们遇到了这种方法的第一个问题。哈希函数接受任意大小的值,并返回一个固定大小的值。在pigeonhole principle 之后,至少有一个具有多个值的散列,可能更多。举个简单的例子,假设你的散列函数总是产生一个字节长的输出。这意味着有 256 个可能的输出。对 257 个项目进行哈希处理后,您将始终确定至少有 2 个项目具有相同的哈希值。为了尽可能长时间地避免这种情况,一个好的哈希函数会将输入映射到所有可能的输出上,尽可能为uniformly

因此,如果哈希值不相等,您可以确定字符串不相等,但反之亦然。 两个不同的字符串可以有相同的哈希值。

【讨论】:

  • 好的,所以字符串比较的复杂度是O(n),但是为什么会这样,不能计算字符串和比较的哈希值,那就是O(1)
  • @garg10may 是的,但是哈希值可能会发生冲突,因此您正在寻找一种在 O(n) 预期时间内运行的算法,而不是最坏的情况,并且它已经有了一个名称:Rabin--卡普。
  • 我对散列算法的内部了解不多,但是由于散列的属性之一是如果字符串中的任何字符发生更改,它应该会更改,因此您需要查看字符串中的所有字符来计算哈希,这意味着它至少是O(n),其中n 是您正在哈希的字符串的长度。此外,字符串的哈希不会告诉您任何有关子字符串哈希的信息,因此您必须对长度为 m 的所有子字符串执行此操作。
  • 对于唯一字符串,散列不应该是唯一的吗?
  • 这取决于。大多数哈希具有固定数量的位,而字符串可以具有任意长度。在数学术语中,您将一个可数无限集(所有可能的字符串)映射到一个有限集(所有可能的长度为 k 的散列)。其实,现在想起来,我不确定是否有变长哈希。
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多