For loop for循环的运行时

For loop for循环的运行时,for-loop,runtime,For Loop,Runtime,这个用大O表示法嵌套的for循环的运行时是什么 for(i = 1 to k) { for(j = i+1 to k) {} } 它比O(k^2)小,但我无法计算。你的问题与级数s(k)=0+1+2+…+密切相关(k-2)+(k-1)。可以证明S(k)=(k*(k-1))/2=(k*k)/2-k/2。[如何?将总和重新排序为S(k)={0+(k-1)}+{1+(k-2)}+{2+(k-3)}+..这说明了如何进行排序。] 因此,算法阶数是否小于O(k*k)?记住,像1/2这样的

这个用大O表示法嵌套的for循环的运行时是什么

for(i = 1 to k)
{
    for(j = i+1 to k)
    {}
}

它比O(k^2)小,但我无法计算。

你的问题与级数s(k)=0+1+2+…+密切相关(k-2)+(k-1)。可以证明S(k)=(k*(k-1))/2=(k*k)/2-k/2。[如何?将总和重新排序为S(k)={0+(k-1)}+{1+(k-2)}+{2+(k-3)}+..这说明了如何进行排序。]

因此,算法阶数是否小于O(k*k)?记住,像1/2这样的常数系数不会影响大O符号


问:那么它相当于将
j=i+1到k
替换为
j=1到k


答:对。这很棘手,所以让我们仔细想想。对于
i==1
,内部循环的操作运行多少次?答:它运行
k-1
次。同样,对于
i==2
,内部循环的操作运行多少次?答:它运行
k-2
次。最终,对于
i==k
,内部循环的操作运行多少次?答:它运行零次。因此,在
i
的所有值上,内部循环的操作运行了多少次?回答:
(k-1)+(k-2)+…+0
,即上述总和S(k)

所以这相当于用j=1替换j=i+1?不,这很棘手,但让我们仔细想想。对于
i==1
,内部循环的操作运行多少次?答:它运行
k-1
次。同样,对于
i==2
,内部循环的操作运行多少次?答:它运行
k-2
次。最终,对于
i==k
,内部循环的操作运行多少次?答:它运行零次。因此,在
i
的所有值上,内部循环的操作运行了多少次?回答:
(k-1)+(k-2)+…+0
,这只是前面提到的总和S(k)。我的意思是它在时间复杂度方面是等价的。因为两者都给出O(k^2)界。其中j=i+1给出了O(k*(k-1)/2=O(k^2),j=1是O(k*(k+1)/2)=O(k^2)。我明白了。没错。你不会这么想,但是用j=i+1代替j=1消除了大约一半的内部循环动作调用,但它并没有消除更多;所以你是正确的。是的,这有点不直观。谢谢!