【发布时间】:2019-11-07 02:19:37
【问题描述】:
子字符串搜索的 CPython 实现(例如通过in)由以下算法实现。
def find(s, p):
# find first occurrence of p in s
n = len(s)
m = len(p)
skip = delta1(p)[p[m-1]]
i = 0
while i <= n-m:
if s[i+m-1] == p[m-1]: # (boyer-moore)
# potential match
if s[i:i+m-1] == p[:m-1]:
return i
if s[i+m] not in p:
i = i + m + 1 # (sunday)
else:
i = i + skip # (horspool)
else:
# skip
if s[i+m] not in p:
i = i + m + 1 # (sunday)
else:
i = i + 1
return -1 # not found
至少,根据 CPython 实现的作者 (?) 所写的this source(取自this older answer)。
同一来源提到了该算法的最坏情况复杂度为O(nm),其中n 和m 是两个字符串的长度。我对这个界限是否紧密感兴趣。我的问题是:
是否有 Python
in中使用的算法的对抗性示例?我们能否给出一个字符串对序列(pattern, string),以便运行pattern in string需要二次(或至少是超线性)时间?
演示朴素子字符串搜索的二次最坏情况运行时的标准示例,其中string = 'a'*n 和pattern = 'a'*m + b does not work。
【问题讨论】:
-
您愿意考虑的算法的空间复杂度是多少?例如,有一个简单的 O(1) 时间子字符串搜索算法需要 O(n^2) 额外空间(前提是您显然没有计算构建数据结构的摊销成本)。
-
@Patrick87,我对考虑不同的字符串搜索算法不感兴趣。我对在提供的链接中描述的 CPython 中实现的特定一个感兴趣,以及它的最坏情况时间复杂度是多少。更具体地说,我有兴趣找到“实现”最坏情况时间复杂度的一系列字符串。
-
我没有对此投票,但是我认为通过首先关注问题并减少文本,可以大大改善问题。例如。这个算法最差的时间复杂度是多少,什么字符串和子字符串会导致它?
-
@wihlke,谢谢你的建议,我已经更新了问题,以关注实际问题,而不是我问这个问题的细节。
标签: python string algorithm time-complexity complexity-theory