如何解决字符串匹配-最好/最坏情况下的大复杂度
我对此有些困惑,并不十分了解如何解决。我看过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)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。