我正在尝试解决'字符串搜索算法',但许多网站的答案似乎很复杂('天真字符串搜索' 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
已知休息一样。 答案 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。
因此,如果哈希值不相等,则可以确定字符串不相等,反之则不然。 两个不同的字符串可以具有相同的哈希值。