大O表示法中这个嵌套for循环的运行时是什么?
for(i = 1 to k)
{
for(j = i+1 to k)
{}
}
它小于O(k ^ 2)但我无法弄明白。
答案 0 :(得分:4)
您的问题与系列和 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 to k
替换j = 1 to k
?
答案:是的。这很棘手,所以让我们考虑一下。对于i == 1
,内循环的动作运行了多少次?答:它运行k-1
次。同样,对于i == 2
,内循环的动作运行了多少次?答:它运行k-2
次。最终,对于i == k
,内循环的动作运行了多少次?答:它运行零次。因此,在i
的所有值上,内循环的动作运行了多少次?答案:(k-1) + (k-2) + ... + 0
,这就是前面提到的总和 S(k)。