分析嵌套for循环算法

时间:2017-02-08 22:54:36

标签: algorithm loops time-complexity

说我有以下代码

def func(A,n):
  for i = 0 to n-1:
    for k = i+1 to n-1:
      for l = k+1 to n-1:
        if A[i]+A[k]+A[l] = 0:
          return True

A是数组,n表示A的长度。

当我读到它时,代码检查A中是否有任何3个连续的整数总和为0.我将时间复杂度视为

T(n)=(n-2)(n-1)(n-2)+ O(1)=>为O(n ^ 3)

这是正确的,还是我错过了什么?我很难找到关于这个的阅读材料(我自己拥有CLRS)

1 个答案:

答案 0 :(得分:0)

您的功能有误:它检查是否有任何三个元素加起来为了0.为了缩短执行时间,它只按索引顺序考虑它们:i< k<学家

你对复杂性是正确的。尽管每个循环都采用快捷方式,但该快捷方式仅仅是迭代次数的标量除数。每个循环仍然 O (n)。

至于编码,你已经完成了大部分工作 - 而Stack Overflow不是编码服务。给你最好的一击;如果这不起作用并且你被卡住了,请发布另一个问题。

如果您真的想自学一种新技术,请查看Python的itertools包。您可以使用它来生成三元组中的所有组合。然后,您可以在每种情况下仅检查总和(三倍)。实际上,您可以使用any方法检查是否有任何一个三元组总和为0,这可能会将您的函数体缩减为单行Python代码。

我会把这项研究留给你。你将在途中学习其他整洁的东西。

增加OP的评论。

让我们将N设置为4,看看会发生什么:

i = 0
for k = 1 to 3
    ... three k loop
i = 1
for k = 2 to 3
    ... two k loops
i = 2
for k = 3 to 3
    ... one k loop

k循环执行次数是n-1:3 + 2 + 1的“三角形”数。设m = n-1;公式为T(m)= m(m-1)/ 2。

现在,您将相同的逻辑传播到 l 循环。对于k = 1,2,3,你在 l 上运行T(k)循环。如果我记得,这个三阶“金字塔”公式是P(m)= m(m-1)( M-2)/ 6

就n而言,这是 1 上的(n-1)(n-2)(n-3)/ 6个循环。当你将其乘以时,你会在 n 中得到一个简单的立方公式。

这是n = 5的序列:

0 1 2
0 1 3
0 1 4
    change k
0 2 3
0 2 4
    change k
0 3 4
    change k
    change k
  change l
1 2 3
1 2 4
    change k
1 3 4
    change k
    change k
  change l
2 3 4

BTW, l 是一个糟糕的变量名称,很容易与 1 混淆。