8.29 时间复杂度

1.i=1; while(i<=n) i=i*2 这个算法的时间复杂度。

解析:先分析i,和循环次数之间的关系 i = 1, 2, 4, 8, 16 ... ,所以假设循环次数是x。,那么i = 2^x ,条件是i <= n

2^x <= n

所以x <= logn

所以x 从1 到logn,一共执行循环体logn次,所以复杂度是logn。

 

2.求整数n(n≥0)的阶乘的算法如下,其时间复杂度是(A)。

int fact(int n){

     if(n≤1) return 1;

     return n*fact(n-1);

A.O(n)   B.O(n²)  C.O(nlog²) D.O(log)

解析:本题是求阶乘n!的递归代码,即n×(n-1)×...×1。每次递归调用时fact()的参数减1,递归出口为fact(1),一共执行n次递归调用fact(),故T(n)=O(n)。

 

3.以下算法的时间复杂度为( D)。

void fun(int n) {

    int i=l;

    while(i<=n)

        i=i*2;

}

A. O(n)    B. O(n2)    C. O(nlog2n)    D. O(log2n)
解析:基本运算是i=i*2,设其执行时间为T(n),则2T(n)<=n,即T(n)<=log2n=O(log2n)。

 

4.设n是描述问题规模的非负整数,下面程序片段的时间复杂度是(A)。

x=2;

while(x<n/2)

    x=2*x;

A. O(log2n) B. O(n) C. O(nlog2n) D. O(n2)

解析:在程序中,执行频率最高的语句为“x=2*x”。设该语句共执行了 t次,则2t+1=n/2,故t=log2(n/2)-1=log2n-2,得 T(n)=O(log2n)。

 

5.求该方法的时间复杂度

void aFunc(int n) {

    for (int i = 0; i < n; i++) {

        for (int j = i; j < n; j++) {

            printf("Hello World\n");

        }

    }

}

解析:当 i = 0 时,内循环执行 n 次运算,当 i = 1 时,内循环执行 n - 1 次运算……当 i = n - 1 时,内循环执行 1 次运算。 所以,执行次数 T(n) = n + (n - 1) + (n - 2)……+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2,此时时间复杂度为 O(n^2)。

 

 

 

 

 

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值