Python 字符串搜索算法-字符串匹配的复杂性
我正在尝试解决'String search algorithm'的问题,但许多网站的答案似乎很复杂('Naive String search'与O(m(n-m+1)),下面我的算法有什么问题,它的最坏情况复杂度是O(n),而KMP也有O(n)因此我肯定错了,但在哪里呢Python 字符串搜索算法-字符串匹配的复杂性,python,string,algorithm,md5,Python,String,Algorithm,Md5,我正在尝试解决'String search algorithm'的问题,但许多网站的答案似乎很复杂('Naive String search'与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 + si
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
,因为在最坏的情况下,它需要对字符进行len(s1)
比较
散列 这是: 哈希函数是可用于映射数据的任何函数 任意大小到固定大小的数据。哈希返回的值 函数称为哈希值、哈希代码、摘要或 哈希。一种用途是一种称为哈希表的数据结构,广泛用于计算机软件中,用于快速查找数据 在这里,我们遇到了这种方法的第一个问题。哈希函数接受任意大小的值,并返回固定大小的值。接下来,至少有一个哈希值具有多个值,可能更多。作为一个简单的示例,假设您的哈希函数总是生成一个一字节长的输出。这意味着有256p可能的输出。在对257项进行散列后,您将始终确定至少有2项具有相同的散列。为了尽可能长时间避免这种情况,一个好的散列函数将尽可能将输入映射到所有可能的输出上
因此,如果散列不相等,您可以确定字符串不相等,但反之亦然。两个不同的字符串可以具有相同的散列。您假设
s2[index:index+size]==s1
是O(1)。是吗?如何在小于O(len(s1))的时间内计算s2[index:index+size]
的散列时间?可以使用滚动散列(这正是拉宾·卡普所做的)来实现这一点,但你似乎建议python应该以某种方式为你做这件事。涵盖了这一点。@PaulHankin thx,我天真地认为字符串搜索是如此简单,只是眨眼就完成了。让我花一些时间阅读他们多年的研究。好的,那么字符串比较的复杂性是O(n),但为什么是这样,不能同时计算字符串和比较的哈希值,这将是O(1)@garg10可能是的,但哈希值可能会冲突,所以您看到的是一个在时间O(n)内运行的算法我不太了解散列算法的内部结构,但由于散列的一个属性是,如果字符串中的任何字符发生变化,它应该会发生变化,因此您需要查看字符串中的所有字符来计算散列,这意味着它至少是O(n)
,其中n
是要散列的字符串的长度。此外,字符串的散列不会告诉您关于子字符串散列的任何信息,因此您必须对长度m
的所有子字符串执行此操作。散列对于唯一字符串不应该是唯一的吗?这取决于。大多数散列具有固定的位数,而string可以有任意长度。用数学术语来说,你把一个可数无限集(所有可能的字符串)映射到一个有限集(所有可能的长度为k的散列)。实际上,现在我想起来了,我不确定是否有可变长度的散列。