2016-11-26 119 views
-1
for i = 1 to n do 
    for j = 1 to i do 
     for k = 1 to j do 

“n”的时间复杂度是多少?给定片段的时间复杂度是多少?

+1

你在这个问题上做了什么工作?例如,你可以说明'j'的复杂性和确切的公式吗?有关'k'的确切公式,使复杂性变得很明显,请参阅[四面体数字](https://en.wikipedia.org/wiki/Tetrahedral_number)。 –

+0

看起来像n^3。虽然我在时间复杂性方面非常糟糕,所以我可能是错的。而且,这些标签中的大部分都是不相关的。 – byxor

+0

我已经按照建议移除了标签。 @BrandonIbbotson –

回答

1

最内圈将明显运行j次。假设它包含价值100个单位时间的操作,这将是:

T_inner(j) = j 

环路中间将运行i倍,即

T_middle(i) = Sum {j from 1 to i} T_inner(j) 
      = Sum {j from 1 to i} j 
      = i/2 * (1 + i) 

最后:

T_outer(n) = Sum {i from 1 to n} T_middle(i) 
      = Sum {i from 1 to n} (i/2 * (1 + i)) 
      = 1/6 * n * (1 + n) * (2 + n) 
      = 1/6 n^3 + 1/2 n^2 + 1/3 n 

这显然是O(n^3)

注意:这只会计算最内侧块中的操作。它忽略了执行循环所需的操作。但是如果你包含这些,你会发现时间复杂度是一样的。

+0

谢谢! @NicoSchertler,它的工作原理:) –

+0

所以通常当算法的复杂性被讨论时,他们是否考虑循环所需的操作,还是它总是被忽略? –

+0

维护循环所需的操作将始终与迭代次数(加上初始化操作)成比例。所以,这与向内部块添加恒定量相似。最终,这并不会改变复杂性。 –

相关问题