这个伪代码的渐近复杂性是什么?

时间:2012-07-02 10:02:22

标签: algorithm time-complexity pseudocode asymptotic-complexity

你可以告诉我这段代码的渐近复杂性吗?

f(n):
if (n<=2) then return 1;
else { 
     if (n>950) then { i=n/2; return f(i);}
     else return f(n-2);
}

我想到了两个解决方案。

a)

O(1)         when n<=2
T(n/2) + 1   when n > 950
T(n-2) + 1   when 950>=n>2

并解决复发问题:

O(1)         when n<=2
Θ(log n)     when n > 950
O(n^2)       when 950>=n>2

b)但是我不太确定最后两个语句的复杂性,因为如果n大于950,则算法将调用f(i)直到i小于950,然后继续调用f(n- 2)。 所以,另一个解决方案就是这个:

O(1)                  when n<=2
T(n/2) + T(n-2) + 1   otherwise

并解决复发问题:

O(1)         when n<=2
O(n^2)       otherwise

我实际上认为第二个是正确的,但我不确定。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

好的,所以首先考虑一下如果n 真的大会发生什么。最终,n将足够大,它将主宰其他一切。当然,直到你得到n = 950,你才会得到O(lg n),其中“lg”表示记录基数2.(为什么我知道这个呢?因为n的大小减去了一个幂每次迭代都有两次。)

一旦n降到950,那么它每次都会减少2,所以从950到2是O(n) - 因为你基本上达到了一半的值,而1/2则消失在常数中。 / p>

但是观察到存在n的值,其中lg n>二分之九百五十○。因此,对于n的某个值,lg n项将占主导地位。 O(lg n)。

答案 1 :(得分:2)

O(1),n <= 2。

O(1)for 2&lt; 1。 n&lt; = 950 - 它需要恒定的时间(950/2)。

T(n / 2),n> 950。

所以你得到:T(n)= T(n / 2)+ 0(1)。

总复杂度= O(log n)。

答案 2 :(得分:0)

渐近行为是对复杂性增长的描述,它不是可以将 n 的各个值插入的函数。因此,对于 n 的不同值,有两个或三个不同的语句是没有意义的。

将其视为 n - &gt;无穷大, n 的行为&lt; 950变得可以忽略不计。