zoukankan      html  css  js  c++  java
  • 常用排序算法之--时间复杂度计算

    本篇博文非博主原创,系通过度娘收集整理而来,如有雷同,请联系博主,追加上转载出处。同时博主水平和理解有限,如有什么偏差请广大博友指定。

    学习交流qq:792911374

    时间复杂度

      同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。一个算法的时间开销记作:T(n),其中n表示算法的基本操作模块被重复执行的次数。算法的时间复杂度记做T(n)=O(f(n)),随着n的增大,算法执行时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。时间复杂度常用大O符号表述。这种用大写的O来代表算法的时间复杂度的记法叫"大O阶"记法。

    算法的时间复杂度(大O阶)的计算方法为: 

    1、用常数1取代运行时间中的所有加法常数。
    2、在修改后的运行次数函数中,只保留高阶项。
    3、如果最高阶项存在且不是1,则去除与这个项相乘的常数。

    也就是当n增大到一定值后,对时间复杂度影响最大的就是n的幂次最高的项,其他的常数项和低幂次项都可以忽略不计。

    例如: 

    在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数。例如:

     1 int n = 100000; //执行了1次
     2 for(int i = 0; i < n; i++){  //执行了n+1次
     3   for(int j = 0; j < n; j++) //执行了n*(n+1)次
     4   {
     5       printf("i = %d, j = %d", i, j); //执行了n*n次
     6   }
     7 }
     8 
     9 for(int i = 0; i < n; i++){  //执行了n+1次
    10   printf("i = %d", i); //执行了n次
    11 }
    12 
    13 printf("Done"); //执行了1次

    按上面推导"大O阶"的步骤我们先来第一步:"用常数1取代运行时间中的所有加法常数",则上面的算式变为:
    执行总次数 = 2n^2 + 3n + 1;

    第二步:"在修改后的运行次数函数中,只保留最高阶项",这里的最高阶项是n的二次方
    所以算式变为:
    执行总次数 = 2n^2;

    第三步:"如果最高阶项存在且不是1,则去除与这个项相乘的常数",这里n的二次方不是1所以
    要去除这个项相乘的常数算式变为:
    执行总次数 = n^2;

    因此,最后我们得到上面的那段代码的算法时间复杂度表示为: O(n^2); 

    按数量级递增排列,常见的时间复杂度有:
    常数阶O(1), 对数阶O(log2n),线性阶O(n)
    线性对数阶O(nlog2n), 平方阶O(n^2), 立方阶O(n^3)..., k次方阶O(n^k), 指数阶O(2^n),随着问题规模n的不断增大,
    上述时间复杂度不断增大,算法的执行效率越低。

    如:嵌套一层for循环的时间复杂度为:O(n),二层for循环为O(n^2),二分的算法时间复杂度为:O(logn),如果一个for循环套一个二分,那么时间复杂度为O(nlogn);

    备注:这里只是通过一个数理化的形式来比较算法的时间执行效率,并不能真正推导出算法在特定机器的执行时间,这取决于具体的电脑和代码。

    总结:

    一个算法所耗费的时间=算法中每条语句的执行时间之和。算法转换为程序后,每条语句执行一次所需的时间取决于机器的指令性能、速度以及编译所产生的代码质量等难以确定的因素。如果要计算一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。

    若要独立于机器的软、硬件系统来分析算法的时间耗费,则设每条语句执行一次所需的时间均是单位时间,一个算法的时间耗费就是该算法中所有语句的频度之和(算法中的语句执行次数称为语句的频度或时间频度)。

  • 相关阅读:
    英语语法学习
    react-hook
    rrweb手机端录屏,pc端使用
    uni-app
    日期
    Mongodb 保存地理信息 并实现范围检索
    webpack2.2API阅读笔记
    react-lazyload
    项目中常用的各个依赖包的解释
    Android-----test----monkeyrunner
  • 原文地址:https://www.cnblogs.com/scud001/p/4418220.html
Copyright © 2011-2022 走看看