原地址:http://www.nowamagic.net/librarys/veda/detail/2195

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

  • 这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

  • 之前我们说的三个求和算法的时间复杂度分别为0(n),0(1),0(n2)。我就推一下吧。

  • 计算 1 + 2 + 3 + 4 + ...... + 100。代码如下,之前也有讲过:

  •  
    1. #include "stdio.h"

    2. int main()

    3. {

    4. int i, sum = 0, n = 100; /* 执行1次 */

    5. for( i = 1; i <= n; i++) /* 执行 n+1 次 */

    6. {

    7. sum = sum + i; /* 执行n次 */

    8. //printf("%d \n", sum);

    9. }

    10. printf("%d", sum); /* 执行1次 */

    11. }

    从代码附加的注释可以看到所有代码都执行了多少次。那么这写代码语句执行次数的总和就可以理解为是该算法计算出结果所需要的时间。该算法所用的时间(算法语句执行的总次数)为: 1 + ( n + 1 ) + n + 1 = 2n + 3

    而当 n 不断增大,比如我们这次所要计算的不是 1 + 2 + 3 + 4 + ...... + 100 = ? 而是 1 + 2 + 3 + 4 + ...... + n = ?其中 n 是一个十分大的数字,那么由此可见,上述算法的执行总次数(所需时间)会随着 n 的增大而增加,但是在 for 循环以外的语句并不受 n 的规模影响(永远都只执行一次)。所以我们可以将上述算法的执行总次数简单的记做: 2n 或者简记 n

    这样我们就得到了我们设计的算法的时间复杂度,我们把它记作: O(n)

    再来看看高斯的算法:

  •  
    1. #include "stdio.h"

    2. int main()

    3. {

    4. int sum = 0, n = 100; /* 执行1次 */

    5. sum = (1 + n) * n/2; /* 执行1次 */

    6. printf("%d", sum); /* 执行1次 */

    7. }

    这个算法的时间复杂度: O(3),但一般记作 O(1)。

    从感官上我们就不难看出,从算法的效率上看,O(3) < O(n) 的,所以高斯的算法更快,更优秀。

    下面再来一个例子:

     
    1. #include "stdio.h"

    2. int main()

    3. {

    4. int i, j, x = 0, sum = 0, n = 100; /* 执行1次 */

    5. for( i = 1; i <= n; i++)

    6. {

    7. sum = sum + i;

    8. //printf("%d \n", sum);

    9. for( j = 1; j <= n; j++)

    10. {

    11. x++; /* 执行n*n次 */

    12. sum = sum + x;

    13. }

    14. }

    15. printf("%d", sum); /* 执行1次 */

    16. }

    上面的代码严格的说不能称之为一个算法,毕竟它很“无聊而且莫名其妙”(毕竟算法是为了解决问题而设计的嘛),先不论这个“算法”能解决什么问题,我们看一下它的“大O阶”如何推导,还是先计算一下它的执行总次数:

    执行总次数 = 1 + (n + 1) + n*(n + 1) + n*n + (n + 1) + 1 = 2n2 + 3n + 3

    如何推导大o阶呢?我们给出了下面 的推导方法:

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

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

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

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

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

    • 最后我们在把常见的算法时间复杂度以及他们在效率上的高低顺序记录在这里,是大家对算法的效率有个直观的认识。

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

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

如何计算算法的时间复杂度相关推荐

  1. 这里告诉你如何计算算法的时间复杂度(大O阶)

    前言 该文章已经进行了一次排版的优化. 关于时间复杂度 在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间.这是一个代表算法输入值的字符串的长度的 ...

  2. 算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.算法时间 ...

  3. 如何计算归并排序算法的时间复杂度?

    如何计算归并排序算法的时间复杂度? 什么是归并排序? 计算时间复杂度 什么是归并排序? 归并排序的概念十分简单,就是"分而治之"的思想.这里我直接从网上找了一份对归并排序算法的比较 ...

  4. vant coupon 时间戳如何计算_计软考研双日练 | 如何计算拓扑排序算法的时间复杂度?...

    ☝☝☝ 软件工程考研独家平台 撰稿 | 康康哥 编辑 | 丽丽姐 本文由懂计算机.软件工程的博士师哥原创 双日练:NO.20200610 若将n个顶点e条弧的有向图采用邻接表存储,则拓扑排序算法的时间 ...

  5. 算法的时间复杂度是什么?如何计算?

    我们在度量一个程序(或者一个算法)执行时间的两种方法 第一种最简单,我们直接在分别运行需要比较的算法计算个需要的时间然后进行比较 当然这种解决方式也是存在问题的:一是要想对设计的算法的运行性能进行评测 ...

  6. 【基础】算法的时间复杂度分析

    1.什么是时间复杂度? 首先,解决一个问题肯定有许多种方式可以实现,那么如何评价一个算法的好坏?处理相同的数据量,用时更少,用的空间更少. 那么如何估算一个程序的运行时间与数据量的关系,这个函数就是算 ...

  7. 如何找到算法的时间复杂度

    本文翻译自:How to find time complexity of an algorithm The Question 问题 How to find time complexity of an ...

  8. 算法的时间复杂度到底怎么算?

    算法的时间复杂度到底怎么算? 引言 假设计算机运行一行简单语句算作一次运算. def func1(num):print("Hello, World!\n") # 需要执行 1 次r ...

  9. 【数据结构和算法】时间复杂度和空间复杂度

    目录 一.前言 二.时间复杂度 2.1时间复杂度表示形式 2.1.1规则: 3.1如何计算时间复杂度 3.1.1线性阶 3.1.2平方阶 3.1.3对数阶 常见的时间复杂度排序: 三.空间复杂度 3. ...

最新文章

  1. 使用Apache Archiva管理Maven仓库
  2. linux目录结构简析
  3. 使用 husky 和 lint-staged 检查 Node.js 的代码一致性
  4. 利用python读取点矢量对应栅格值
  5. 机器学习算法--ALS
  6. java formfile_基于Struts文件上传(FormFile)详解
  7. Bootstrap 工具提示插件Tooltip 的选项
  8. 如何使用IntelliJ IDEA搭建spark开发环境(上)
  9. Druid实用笔记001---Druid 介绍及配置
  10. java 枚举 注解_Java枚举类和注解梳理
  11. 证券类私募主要需求及核心服务商
  12. 用氦气(He)、氖气(Ne)、氩气(Ar)、118号元素(气奥)(Og,放射性,人造元素)组成的激光器
  13. 复工第一天,马云给湖畔学员的3点建议和1篇荐文:把萧条看作再发展的飞跃台 | 充电...
  14. 【Kaggle 教程】Data Visualization 数据可视化-画图-各种图
  15. Clouda开发笔记
  16. 上传excel单元格校验(通过注解实现)
  17. cassandra install troubleshooting
  18. Linux7.3安装yum工具,Red Hat Enterprise Linux 7.3更换CentOS 7 yum源
  19. End-to-end people detection in crowded scenes
  20. C# hashTable的遍历【2种方法】与排序【3种方法】

热门文章

  1. Gopher China 2021,未来可期
  2. python找零_【python算法书】硬币找零问题?
  3. [2016 NUIST 程序设计竞赛] D. 达朗贝尔的台阶
  4. 【c++】Lanelet2 Examples笔记(二)
  5. 花青素近红外荧光染料Cyanine5 hydrazide,Cy5 hydrazide,1427705-31-4深蓝色粉末状
  6. uniapp小说阅读
  7. 西班牙计算机专业排名,西班牙大学及专业排名
  8. matalb读取txt文件以及将数据写入txt文件
  9. PROGRESSIVE GROWING OF GANS FOR IMPROVED QUALITY, STABILITY, AND VARIATION(PGGAN)
  10. 虚拟仪器项目实战——一个用Labview做的水位水温控制模拟系统