说我有以下代码
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)
答案 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 混淆。