Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字符串搜索算法-字符串匹配的复杂性_Python_String_Algorithm_Md5 - Fatal编程技术网

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

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

我正在尝试解决'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 + size] == s1:
            print 'Pattern found at index %s'%(index)
            index += size
        else:
            index += 1
好的,我假设s2[index:index+size]==s1是O(1),也就是O(n),现在我原来的问题变成

  • 为什么不计算并比较两个字符串的哈希值,如果两个哈希值相等,那么字符串应该相等
  • 我不明白它们怎么会发生冲突。这不取决于哈希算法吗。比如
    MD5
    有已知的断点
原始问题 我不认为您的代码具有复杂性O(n),而是O(mn)。此检查:
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的散列)。实际上,现在我想起来了,我不确定是否有可变长度的散列。