【发布时间】: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