算法时间复杂度

1,算法时间复杂度的定义

算法时间复杂度用来度量算法执行时间。影响算法执行时间的因素有:

  1. 算法选用的策略
  2. 问题的规模
  3. 程序设计语言
  4. 编译程序所产生的机器码的质量
  5. 计算机执行指令的速度

衡量时间复杂度通常有两种方法:事后统计和事前分析。

事后统计是指运行依据算法编制的程序,由计算机统计算法执行的时间。依据算法编制程序耗时耗力,而且同一个算法选用不同的程序语言编写执行效率可能不同,同一个程序选用不同的编译器编译的机器码质量也可能不同,不同配置的计算机执行机器指令的速度也千差万别。这些因素都有可能掩盖算法本身的优劣,不适合作为算法评估的通用方法。

为了避开事后统计的诸多缺点,采用事前分析,单单评价算法选用的策略的优劣。此时算法执行时间与算法语句执行的次数相关,而语句执行的次数往往与问题的规模相关,即与输入数据的数量的多少有关。由于只是定性的分析算法的优劣,所以没有必要精确计算算法执行的时间,使注意力集中在增长率上,由此引入渐进时间复杂度,简称时间复杂度。常使用最深层循环内的语句中的原操作的执行频度来表示。

2,算法时间复杂度的计算方法

  • 原始方法
    1. 计算出基本操作的执行次数T(n)
    2. 计算出T(n)的数量级:忽略常量,低次幂,最高次幂的系数
    3. 用大O来表示时间复杂度
  • 进阶方法
    1. 用常数1取代执行次数中的所有加法常数
    2. 在修改后的运行次数函数中,只保留最高阶项
    3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数
  • 先进方法
    1. 找到执行次数最多的语句
    2. 计算语句执行次数的数量级
    3. 用大O来表示结果

3,常用算法时间复杂度的比较

  1. 常数阶
  2. 对数阶
  3. 线性阶
  4. 线性对数阶
  5. 幂方阶
  6. 指数阶
  7. 阶乘

1-4表明算法时间效率比较高,5表明一般,6-7比较糟糕

4,算法时间复杂度分析实例

  1. O(1)
    1 temp = i;
    2 i = j;
    3 j = temp;
  2. O(logn)
    1 i = 1;
    2 while(i <= n)
    3 {
    4     i = i * 2;
    5 }
  3. O(n)
    1 sum = 0;
    2 for(i=1;i<=n;i++)
    3 {
    4     sum = sum + i;
    5 }
  4. 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 }
  5. 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,参考资料

  1. http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%9F%A5%E8%AF%86%E5%BA%93/4070.shtml
  2. https://baike.baidu.com/item/%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/1894057?fr=aladdin
  3. https://www.cnblogs.com/davygeek/p/4375497.html
  4. http://blog.csdn.net/zolalad/article/details/11848739
  5. http://blog.csdn.net/zhangliangzi/article/details/50680694

 

posted on 2017-12-30 22:41  三万八千里  阅读(777)  评论(0编辑  收藏  举报

导航