时间复杂度的计算问题

时间复杂度的概念

一般情况下,算法中基本语句重复执行的次数是问题规模 n n n的某个函数 f ( n ) f(n) f(n)算法的时间量度记做
T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
它表示问题规模 n n n的增大,算法执行时间的增长率和 f ( n ) f(n) f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。

时间复杂度的数学解释

算法的时间复杂度就是未知量 n n n在趋近于无穷大时语句执行次数的最大者。
<小歪翻译,不喜勿喷>

几种常见时间复杂度的函数图

此图来自百度百科

时间复杂度的解题方法

对for(i = 0; i < n; i++):起始为零加一次,(大)扩前比后多一次;
一般的:
1.设该语句执行x次终止;
2.找出第x次的表达式;
3.由终止条件x = f(n);

时间复杂度的计算

(408-2019 考研真题)根式阶

1.设 n n n是描述问题规模的非负整数,下列程序段的时间复杂度是

x = 0;
while(n >= (x + 1) * (x + 1))
     x = x+1;

A.(log n) \qquad B.O( n 1 / 2 n^{1/2} n1/2) \qquad C.O(n) \qquad D.O( n 2 n^2 n2)
解:对于循环体,我们只考虑小括号内的执行次数。因为小括号内的比较大。按步骤来
1.设小括号的语句执行x次终止
2.第一次: n > 0 × 0 n > 0 × 0 n>0×0;
    \,\,\, 第二次: n > 1 × 1 n > 1 × 1 n>1×1;
       \,\,\,\,\,\, ······
     第 x 次 \,\,\,\,第x次 x: n > x ∗ x n>x*x n>xx;
3.第x次时终止,即 x 2 x^2 x2<n;
x> n 1 / 2 n^{1/2} n1/2
所以x的量级是B。(远大于>>,远小于<<和大于>,小于<是有区别的)

平方阶

int s = 0,i = 0;j = 0;//1
    for(i = 0;i < 3 * n + 5;i++)//2
    {
        for(j = 0; j < 2 * n - 4; j++)//3
        {
            s = s + j;//4
        }
    }

求语句1234的执行次数和程序的时间复杂度
解:对语句1,明显只执行1次
\qquad 对语句2,由于是从0开始,所以执行次数加1;即:3n+5次
\qquad 对语句3.由于在循环体中大括号的后面,所以执行少了一次,而它本身要执行2
n-4次,所以总体3执行了(3n+5)(2n-3)次;
同理语句4执行了(3n+5)(2n-3)-1次
所以该结构时间复杂度为 O ( n 2 ) O(n^2) O(n2)

对数阶,线性阶,阶乘阶

    int a = 1;
    while(a <= n)//0
    {
        a = a * 2;
    }
    int m = 1,n = 0,i = 0;
    for(i = 0; i <= n; i++)//1
    {
        m *= i;
    }
    for(i = 0; i < m; i++)//2
    {
        n++;
    }

解:语句0:
1.设执行x次终止
2.第一次:1<n;
第二次:2<n;
第三次:22<n;
第三次:2
2*2<n;
第x次: 2 x 2^x 2x<n;
3.第x次,循环终止,所以
\quad 2 x 2^x 2x>n;
n< log ⁡ 2 n \log_2{n} log2n
所以时间复杂度为 O ( l o g n ) O(log n) O(logn);
语句1
易知语句1执行了n+2次;(有i<=n再加一次)
时间复杂度为 O ( n ) O(n) O(n)
语句2
\qquad 易知语句2执行了m次;
而语句1中的循环体知m=n!
所以时间复杂度为 O ( n ! ) O(n!) O(n!)

快速看出时间复杂度

其实对于时间复杂度,我们一点也不关心语句执行了多少次,只关心语句执行次数的量级。我们只要知道循环变量i从一直加到n是线性阶,循环体中i成倍增长为对数阶。i在循环体内线性增加,在条件中倍增为根式阶,记住几个特例,就嫩速度知道结果。当然,试着给个口诀。
点增平方根式阶(循环体内+几,比线性增的差的可以说是点增,循环条件平方增加。)
变量线增对数阶(变量线性乘几)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值