数据结构—算法—时间复杂度

数据结构—算法—时间复杂度

1、定义:

​ 在计算算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:T(n)=O(f(n))。他表示随问题规模n的增大,算法执行时间的辅长率和f(n)的辅长率,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数

2、求解算法的时间复杂度具体步骤:

  • 找出算法中的基本语句

    算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体

  • 计算基本语句的执行次数的数量级

    只需计算基本语句执行次数的数量级,这就意味着只要保障基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。

  • 用大O记号表示算法的时间性能

    将基本语句执行次数的数量级放入大O记号中

3、大O阶的推导方法

  • 用常数1取代运行时间中的所有加法常数

  • 在修改后的运行次数函数中,只保留最高阶项

  • 如果最高阶项存在且不是1,则去除与这个项相乘的常数

    —简单的说,就是保留求出次数的最高次幂,并且把系数去掉。如T(n)=2n2+n+1=O(n2)

4、例子

int main(){
	int i,j,c = 0,sum = 0,n = 100;    		/**执行1次*/
    for(i =1 ; i <= n; i++){   			/**执行n+1次*/
        sum = sum + i;   					/**执行n次*/
        for(j = 1; j <= n; j++){ 		/**执行n*(n+1)次*/
           x++;								/**执行n*n次*/ 
           sum = sum + x;				/**执行n*n次*/ 
        }
    }
    printf("%d",sum);		/**执行1次*/ 
}

按照上面推导“大O阶”的步骤,

​ 1)、用常数1取代运行时间中的所有加法常数,则上面的算式变为:执行总次数=3n^2+3n+1

​ 直接相加的话应该是T(n) = 1+n+1+n+n(n+1)+n2+n2+1=3n^2+3n+3

​ 2)、在修改后的运行次数函数中,只保留最高阶项,这里的最高阶是n^2,所以算式变为:执行 总次数=3n^2

​ 3)、如果最高阶项存在且不是1,则去除与这个项相乘的常数,这里n^2不是1所以要去除这个项 的相乘常数,算式变为,执行总次数=n^2

5、常见的算法时间复杂度,以及效率排序

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn) < O(n^2)平方阶 < O(n^3) < 
{ O(2^n) < O(n!) < O(n^n) }

​ 最后三项用大括号把他们括起来是想要告诉大家,如果日后大家设计的算法推导出的“大O阶”是大括号中的这几位,那么趁早放弃这个算法,在去研究新的算法出来吧。因为大括号中的这几位即便是在 n 的规模比较小的情况下仍然要耗费大量的时间,算法的时间复杂度大的离谱,基本上就是“不可用状态”。

6、空间复杂度
顺便提一下空间复杂度,空间复杂度计算的是算法里边变量使用个数,一般来说就只有O(1)和O(N),相对简单。

  • 注意:一定是算法里面使用变量的个数,和给的数组、变量没有关系
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值