字符串搜索算法 - 字符串匹配的复杂性

时间:2016-12-11 14:30:54

标签: python string algorithm md5

我正在尝试解决'字符串搜索算法',但许多网站的答案似乎很复杂('天真字符串搜索' 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已知休息一样。

1 个答案:

答案 0 :(得分: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

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