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,这相当于仅递增i2.因此,迭代的总数是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复杂度不关心常数.