Oma*_*r N 54 algorithm complexity-theory big-o time-complexity asymptotic-complexity
我知道这个算法的大O复杂性O(n^2)
,但我不明白为什么.
int sum = 0;
int i = 1; j = n * n;
while (i++ < j--)
sum++;
Run Code Online (Sandbox Code Playgroud)
即使我们j = n * n
在开始时设置,我们在每次迭代期间递增i并递减j,所以迭代的结果数量是否应该小于n*n
?
Mil*_*kic 114
在每次迭代期间,您递增i
和递减j
,这相当于仅递增i
2.因此,迭代的总数是n ^ 2/2,并且仍然是O(n ^ 2).
Ben*_*bin 53
big-O复杂性忽略了系数.例如:O(n)
,O(2n)
和O(1000n)
,都是相同的O(n)
运行时间.同样,O(n^2)
并且O(0.5n^2)
都是O(n^2)
运行时间.
在你的情况下,你实际上每次通过循环将循环计数器递增2(因为j--
效果相同i++
).所以你的运行时间是O(0.5n^2)
,但这与O(n^2)
你删除系数时的相同.
m3t*_*n0b 11
您将获得完全n*n/2
循环迭代(或者(n*n-1)/2
如果n
是奇数).在大O符号中我们有,O((n*n-1)/2) = O(n*n/2) = O(n*n)
因为常数因素"不计算".
Sal*_*ali 10
你的算法相当于
while (i += 2 < n*n)
...
Run Code Online (Sandbox Code Playgroud)
哪个是O(n^2/2)
相同的,O(n^2)
因为大O复杂度不关心常数.