我有这个python代码用于查找最长的子字符串。我试图找出它的渐近运行时间并且我已经得到了答案,但我不确定它是否正确。这是代码:
def longest_substring(s, t):
best = ' '
for s_start in range(0, len(s)):
for s_end in range(s_start, len(s)+1):
for t_start in range(0, len(t)):
for t_end in range(t_start, len(t)+1):
if s[s_start:s_end] == t[t_start:t_end]:
current = s[s_start:s_end]
if len(current) > len(best):
best = current
return best
显然这个功能的运行时间非常慢。它就是这样设计的。我的方法是因为有一个for循环有3个嵌套的for循环,运行时就像O(n ^ 4)。我不确定这是否正确,因为并非每个循环都在迭代输入大小。此外,假设s = t = n(输入大小)。有什么想法吗?
答案 0 :(得分:2)
如果您不相信它是O(n ^ 5),请尝试计算仅为字符串s
(即外部两个循环)运行的循环数。当s_start == 0
时,内循环运行n + 1
次;当s_start == 1
时,内循环运行n
次,依此类推,直到s_start = n - 1
,内循环运行两次。
总和
(n + 1) + (n) + (n - 1) + ... + 2
是公式为
的算术系列((n + 1) + 2) * n / 2
是O(n ^ 2)。
另一个n因子来自s[s_start:s_end] == t[t_start:t_end]
,即O(n)。