Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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_Asymptotic Complexity - Fatal编程技术网

Python 试图找出我的函数的运行时间

Python 试图找出我的函数的运行时间,python,asymptotic-complexity,Python,Asymptotic Complexity,我有这个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)):

我有这个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(输入大小)。有什么想法吗?

如果您不确信它是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)。

O(n^4)看起来正确-记住,对于非常大的输入,大O是最糟糕的情况复杂性。@TomDalton感谢您的回答。在第一个嵌套for循环中,运行时是否只有O(n)?或者变化的范围使它变成了其他东西吗?注意
t\u end
的循环是冗余的
t_end=t_start+s_end-s_start
或者您的子字符串将具有不同的长度,使得
s[s_start:s_end]==t[t_start:t_end]
不可能。这是一个很好的答案。我试着用算术数列来计算它,但结果使我自己更加困惑。谢谢你的澄清。我认为你遗漏了一个因子n。比较
s[s_start:s_end]==t[t_start:t_end]
也是一个O(n)操作:(在最坏的情况下)它必须沿着两个序列按元素进行比较。这使得复杂性为O(n^5),而不是O(n^4)。@BenjaminHodgson这是一个很好的观点。我已经更新了我的答案。@donutjuice请查看评论和更新的答案。