字符串匹配-最好/最坏情况下的大复杂度

问题描述

我对此有些困惑,并不十分了解如何解决。我看过YouTube等。而且不知道如何回答。

def PatternMatch(text,searchspace):
    for pattern in searchspace:
          for offset in range(text.length):
              match = True
              for cmp in range(min(pattern.length,text.length-offset)):
                  if (text[offset+cmp] != pattern[cmp]):
                      match = False
                      break
              if (match) return offset
    return -1

此算法返回文本T中k个> 0个模式P的数组中任何模式首次出现的偏移,如果T中没有出现P中的任何模式,则返回-1。P的格式为["string","string","striiing"]

如果我们假设仅当P中最短模式的长度小于或等于T的长度时才调用该算法,那么PatternMatch的最佳和最差情况big-Oh复杂度是多少?我将如何解决这个问题?

解决方法

让我们假设k个等长m的模式和一个长度为n的文本。

最好的情况似乎很容易:如果与第一个模式的第一次比较立即成功,则在m个字符比较之后返回答案,其中m是第一个模式的长度。无论如何,如果所有模式测试尽快得出结论“不匹配”,您将获得更快的结果,这可以通过n-m+1字符比较来实现,因此总共进行了k(n-m+1)比较之后。尽管不太可能,k(n-m+1) < m还是可以的。

最坏的情况要困难一些。我们可以想象它发生在所有模式的匹配失败时,因此需要执行k匹配。现在,断定不匹配的最大时间是所有偏移量均导致失败,同时尽可能进行字符串比较。

xxxxxxxy内搜索类似xxxxxxxxxxxxxxxxxxxx的模式时会发生这种情况:字符串比较必须始终完整执行。

因此,我们得出k(n-m+1)m字符比较的最坏情况。如果长度不是恒定的,则精确分析将变得非常困难。

,

根据模式和测试字符串的大小,这确实有很大的不同。我假设两者的长度均为n(为了简化计算,因为实际情况应具有相同的时间复杂度),并且正在测试k个字符串 每次字符比较需要O(1)时间,并且您要为每个匹配的字符串执行n个长度为1..n的字符串比较(即1..n个字符比较)。这是(n ^ 2 + n)/ 2个比较= O(n ^ 2)。由于这些测试有k个,因此复杂度为O(n ^ 2k)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...