我明白了:
for (int i=0; i<n; i++)
此时间复杂度为O(n)
。
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
for (k=0; k<n; k++)
这是O(n^3)
对吧?
i=1
do
//......
i++
while (i*2 <n)
这是O(n)
吗?或者它是O(n/2)
?
答案 0 :(得分:1)
O(n/2)
仅 O(n)
,系数为1/2。系数可以是100亿,它仍然是O(n)
,而不是例如O(n^(1.0001))
这是一个不同的复杂性类。
答案 1 :(得分:1)
O(n 3 )中的第一个,你是对的。
您的第二个算法是 O(n / 2) = O(Cn) = O(n)。 1/2 是一个常数,所以我们可以放弃它。
答案 2 :(得分:1)
第一个复杂度O(n ^ 3),正确。 第二个,O(cn),c常数。无论c多大,根据big-O的定义,复杂性仍然是O(n)。
然而,O符号被认为是有害的。请参阅here。
答案 3 :(得分:0)
这段代码:
i=1
do
//......
i++
while (i*2 < n);
等同于那个:
for ( i = 1; i < n / 2 ; ++ i );
表面上看,这是O(n)
。