我知道这个算法的大O复杂度是O(n^2)
,但我无法理解为什么。
int sum = 0;
int i = 1; j = n * n;
while (i++ < j--)
sum++;
即使我们在开始时设置j = n * n
,我们在每次迭代期间递增i并递减j,所以不应该得到的迭代次数远远少于n*n
?
答案 0 :(得分:114)
在每次迭代期间,您递增i
并递减j
,这相当于仅将i
递增2.因此,迭代总数为n ^ 2/2且仍为为O(n ^ 2)。
答案 1 :(得分: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)
相同。
答案 2 :(得分:11)
您将完全n*n/2
次循环迭代(如果(n*n-1)/2
为奇数,则为n
。
在大O符号中,我们有O((n*n-1)/2) = O(n*n/2) = O(n*n)
,因为常数因素并不算数&#34;。
答案 3 :(得分:10)
您的算法等同于
while (i += 2 < n*n)
...
O(n^2/2)
与O(n^2)
相同,因为大O复杂度并不关心常量。
答案 4 :(得分:4)
设m是迭代次数。然后,
i + m = n ^ 2 - m
给出,
m =(n ^ 2-i)/ 2
在Big-O表示法中,这意味着O(n ^ 2)的复杂性。
答案 5 :(得分:4)
是的,这个算法是O(n ^ 2)。
为了计算复杂性,我们有一个表格的复杂性:
O(1)
O(log n)
上)
O(n log n)
O(N²)
为O(n ^ A)
O(一^ n)的
为O(n!)
每行代表一组算法。一组在O(1)中的算法,它也在O(n)和O(n ^ 2)等中,但不是相反的。所以,你的算法实现了n * n / 2个句子。
O(n)&lt; O(nlogn)&lt; O(n * n / 2)&lt; O(N²)
因此,包含算法复杂性的算法集合为O(n²),因为O(n)和O(nlogn)较小。
例如: 对于n = 100,sum = 5000. =&gt; 100 O(n)&lt; 200 O(n·logn)&lt; 5000(n * n / 2)&lt; 10000(N ^ 2)
对不起我的英语。
答案 6 :(得分:0)
即使我们在开始时设置j = n * n,我们在每次迭代期间递增i并递减j,所以不应该得到的迭代次数比n * n小很多?
是的!这就是为什么它是O(n ^ 2)。按照相同的逻辑,它是 lot 小于n * n * n
,这使得它成为O(n ^ 3)。按类似的逻辑,它甚至是O(6 ^ n)。
big-O为您提供有关上限的信息。
我相信你试图问为什么复杂性是theta(n)或omega(n),但如果你只是想了解大O是什么,你真的需要理解它首先在函数上给出上界。