Algorithm 算法的时间复杂度-n还是n*n?
我试图找出这个算法的θ复杂度。 (a是整数列表)Algorithm 算法的时间复杂度-n还是n*n?,algorithm,time-complexity,Algorithm,Time Complexity,我试图找出这个算法的θ复杂度。 (a是整数列表) 一方面,我可以说附录< /代码>正在执行 n< /代码>(数组的长度),所以代码> POP,最后我要考虑的是代码> 条件,最多可以执行 2N次。p> 由此我可以说这个算法最多是4*n,所以它是θ(n) 但这不是摊销分析吗 另一方面,我可以这样说: 有两个嵌套循环。for循环正被执行n次。while循环最多可以执行n次,因为我必须在每次迭代中删除项。所以复杂性是θ(n*n) 我想计算θ,但不知道这两个选项中哪一个是正确的。你能给我一些建议吗?答案是
一方面,我可以说<代码>附录< /代码>正在执行<代码> n< /代码>(数组的长度),所以<>代码> POP,最后我要考虑的是<>代码> 条件,最多可以执行<代码> 2N次。p> 由此我可以说这个算法最多是
4*n
,所以它是θ(n)
但这不是摊销分析吗
另一方面,我可以这样说:
有两个嵌套循环。for
循环正被执行n次。while
循环最多可以执行n次
,因为我必须在每次迭代中删除项。所以复杂性是θ(n*n)
我想计算θ,但不知道这两个选项中哪一个是正确的。你能给我一些建议吗?答案是THETA(n)
,你的论点是正确的
这不是摊销分析
要进行摊销分析,您必须查看内部循环。如果忽略算法的其余部分,则很难说出while的执行速度。天真的方法是O(N),这是正确的,因为这是最大的迭代次数。然而,因为我们知道执行的总数是O(N)(你的论点),并且这将被执行N次,我们可以说内部循环的复杂性是O(1)摊销。θ是(N),不在摊销分析中;我现在还没有正式的证据,但稍后我会提出一个。很酷的问题,顺便说一句。
def sttr(a):
for i in xrange(0,len(a)):
while s!=[] and a[i]>=a[s[-1]]:
s.pop()
s.append(i)
return s