算法时间复杂度
1,算法时间复杂度的定义
算法时间复杂度用来度量算法执行时间。影响算法执行时间的因素有:
- 算法选用的策略
- 问题的规模
- 程序设计语言
- 编译程序所产生的机器码的质量
- 计算机执行指令的速度
衡量时间复杂度通常有两种方法:事后统计和事前分析。
事后统计是指运行依据算法编制的程序,由计算机统计算法执行的时间。依据算法编制程序耗时耗力,而且同一个算法选用不同的程序语言编写执行效率可能不同,同一个程序选用不同的编译器编译的机器码质量也可能不同,不同配置的计算机执行机器指令的速度也千差万别。这些因素都有可能掩盖算法本身的优劣,不适合作为算法评估的通用方法。
为了避开事后统计的诸多缺点,采用事前分析,单单评价算法选用的策略的优劣。此时算法执行时间与算法语句执行的次数相关,而语句执行的次数往往与问题的规模相关,即与输入数据的数量的多少有关。由于只是定性的分析算法的优劣,所以没有必要精确计算算法执行的时间,使注意力集中在增长率上,由此引入渐进时间复杂度,简称时间复杂度。常使用最深层循环内的语句中的原操作的执行频度来表示。
2,算法时间复杂度的计算方法
- 原始方法
- 计算出基本操作的执行次数T(n)
- 计算出T(n)的数量级:忽略常量,低次幂,最高次幂的系数
- 用大O来表示时间复杂度
- 进阶方法
- 用常数1取代执行次数中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数
- 先进方法
- 找到执行次数最多的语句
- 计算语句执行次数的数量级
- 用大O来表示结果
3,常用算法时间复杂度的比较
- 常数阶
- 对数阶
- 线性阶
- 线性对数阶
- 幂方阶
- 指数阶
- 阶乘
1-4表明算法时间效率比较高,5表明一般,6-7比较糟糕
4,算法时间复杂度分析实例
- O(1)
1 temp = i; 2 i = j; 3 j = temp;
- O(logn)
1 i = 1; 2 while(i <= n) 3 { 4 i = i * 2; 5 }
- O(n)
1 sum = 0; 2 for(i=1;i<=n;i++) 3 { 4 sum = sum + i; 5 }
- O(n2)
1 sum = 0; 2 for(i=1;i<=n;i++) 3 { 4 for(j=1;j<=n;j++) 5 { 6 sum++; 7 } 8 }
- O(n3)
1 sum = 0; 2 for(i=1;i<=n;i++) 3 { 4 for(j=1;j<=i;j++) 5 { 6 for(k=0;k<j;k++) 7 { 8 sum = sum + 2; 9 } 10 } 11 }
5,参考资料
- http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9F%A5%E8%AF%86%E5%BA%93/4070.shtml
- https://baike.baidu.com/item/%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/1894057?fr=aladdin
- https://www.cnblogs.com/davygeek/p/4375497.html
- http://blog.csdn.net/zolalad/article/details/11848739
- http://blog.csdn.net/zhangliangzi/article/details/50680694