一、引入

先看一道题,如果 a+b+c=1000,且 a2+b2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?

二、两种解答方式

  • 算法是独立存在的一种解决问题的方法和思想。

第一种解答方式:

import timestart_time = time.time()for a in range(0, 1001):for b in range(0, 1001):for c in range(0, 1001):if a**2 + b**2 == c**2 and a+b+c == 1000:print("a,b,c:%d,%d,%d" % (a, b, c))end_time = time.time()
print("elapsed:%f" % (end_time - start_time))
print("complete!")

运行结果:

在这里可以看到,运行时间804秒!!!

第二种解答方式:

import timestart_time = time.time()for a in range(0, 1001):for b in range(0, 1011):c = 1000 - a - bif a ** 2 + b ** 2 == c ** 2:print("a,b,c:%d,%d,%d" % (a, b, c))end_time = time.time()
print("elapsed:%f" % (end_time - start_time))
print("complate!")

运行结果:

这次运行时间只有0.92秒。

三、执行时间反应算法效率

  • 对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(804秒相比于0.92秒),由此我们可以得出结论:实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。
  • 但单靠时间值绝对可信吗?
  • 假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的804秒快多少。
  • 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!
  • 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢?

四、时间复杂度与“大O记法”

  • 我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。显然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率。
  • 对于算法的时间效率,我们可以用“大O记法”来表示。
  • “大O记法”:对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数(忽略常数),记为f(n)=O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似
  • 时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)

五、如何理解“大O记法”

  • 对于算法进行特别具体的细致分析虽然很好,但在实践中的实际价值有限。对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是分析算法效率的主要部分。而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n2和100n2属于同一个量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率“差不多”,都为n2级。

六、最坏时间复杂度

分析算法时,存在几种可能的考虑:

  • 算法完成工作最少需要多少基本操作,即最优时间复杂度。
  • 算法完成工作最多需要多少基本操作,即最坏时间复杂度。
  • 算法完成工作平均需要多少基本操作,即平均时间复杂度。

对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息,其反映的只是最乐观最理想的情况,没有参考价值。

对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作。

对于平均时间复杂度,是对算法的一个全面评价,因此它完整全面的反映了这个算法的性质。但另一方面,这种衡量并没有保证,不是每个计算都能在这个基本操作内完成。而且,对于平均情况的计算,也会因为应用算法的实例分布可能并不均匀而难以计算。

因此,我们主要关注算法的最坏情况,亦即最坏时间复杂度。

七、时间复杂度的几条基本计算规则

  1. 基本操作,即只有常数项,认为其时间复杂度为O(1)。
  2. 顺序结构,时间复杂度按加法进行计算。
  3. 循环结构,时间复杂度按乘法进行计算
  4. 分支结构,时间复杂度取最大值
  5. 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
  6. 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度

八、空间复杂度

  • 类似于时间复杂度的讨论,一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。
  • 渐近空间复杂度也常常简称为空间复杂度
  • 空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度。
  • 算法的时间复杂度和空间复杂度合称为算法的复杂度。

九、根据算法换算时间复杂度

  1. 第一种方法的算法核心部分
for a in range(0, 1001):for b in range(0, 1001):for c in range(0, 1001):if a**2 + b**2 == c**2 and a+b+c == 1000:print("a, b, c: %d, %d, %d" % (a, b, c))

时间复杂度:
T(n) = O(nnn) = O(n3)

  1. 第二种尝试的算法核心部分
for a in range(0, 1001):for b in range(0, 1001-a):c = 1000 - a - bif a**2 + b**2 == c**2:print("a, b, c: %d, %d, %d" % (a, b, c))

时间复杂度
T(n) = O(nn(1+1)) = O(n*n) = O(n2)

总结:

  • 根据基本计算规则,循环结构使用乘法,所以第一种方法为O(nnn) = O(n3),第二种方法为O(nn(1+1)) = O(n*n) = O(n2),不考虑其他,可以将一个for循环算作一个n。
  • 由此可见,我们尝试的第二种算法要比第一种算法的时间复杂度好多的。

十、常见时间复杂度及其之间的关系

1. 常见时间复杂度

执行次数函数举例 非正式术语
12 O(1) 常数阶
2n+3 O(n) 线性阶
3n2+2n+1 O(n2) 平方阶
5log2n+20 O(logn) 对数阶
2n+3nlog2n+19 O(nlogn) nlogn阶
6n3+2n2+3n+4 O(n3) 立方阶
2n O(2n) 指数阶

注意,经常将log2n(以2为底的对数)简写成logn。

2. 常见时间复杂度之间的关系

所消耗的时间从小到大
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

时间复杂度解析 根据算法换算时间复杂度 常见时间复杂度及其之间的关系相关推荐

  1. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

  2. 常见Web技术之间的关系,你了解多少?

     ------------------------------------------------------------------------------------------------- ...

  3. 常见Web技术之间的关系,你知道多少?

    如果你是一个Web开发初学者,那么你难免会在网上搜索HTML, CSS, XML, JS(Javascript), DOM, XSL等等这些词的意思,然而,随着学习的深入. 当你把他们搅在一起,你又糊 ...

  4. session,sessionid,cookie之间的关系解析

    session,sessionid,cookie之间的关系解析 文章目录 session,sessionid,cookie之间的关系解析 1.简介 2.session和cookie定义,创建,周期和联 ...

  5. 数据结构与算法-常见时间复杂度

    参考链接: 算法的时间复杂度和空间复杂度 - 简书 https://www.jianshu.com/p/88a1c8ed6254 常见时间复杂度 时间复杂度曲线 关于log > 如果a^b=c, ...

  6. 常见排序算法及其对应的时间复杂度、空间复杂度

    常见排序算法及其对应的时间复杂度.空间复杂度: 排序算法经过长时间演变,大体可以分为两类:内排序和外排序.在排序过程中,全部记录存放在内存,则成为内排序:如果排序过程中需要使用外存,则称为外排序,本文 ...

  7. 常见排序算法及对应的时间复杂度和空间复杂度

    排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排 ...

  8. 常见的时间复杂度和排序算法

    1.常见的时间复杂度 (1)O(1):常量阶,运行时间为常量 (2)O(logn):对数阶,如二分搜索算法 (3)O(n):线性阶,如n个数内找最大值 (4)O(nlogn):对数阶,如快速排序算法 ...

  9. 数据结构与算法--9.常见时间复杂度及其之间的关系

    文章目录 1.常见时间复杂度 2.常见时间复杂度之间的关系 1.常见时间复杂度 2.常见时间复杂度之间的关系

最新文章

  1. 12306 网站的非技术分析
  2. linux上使用FTP下载文件
  3. 【年终总结】2019年有三AI知识星球做了什么,明年又会做什么
  4. python中for循环语句格式_关于Python中的for循环控制语句
  5. 【Android】12.3 在当前Activity中获取另一个Activity的返回值
  6. Leetcode--322. 零钱兑换
  7. 《Python核心编程》第二版第18页第一章练习 -Python核心编程答案-自己做的-
  8. Unreal Engine 4 基于网格的水面模拟实现
  9. MyBatis学习总结(22)——Mybatis自增长ID获取
  10. BZOJ44084299[Fjoi 2016]神秘数——主席树
  11. linux中vim命令详解(操作大全)
  12. 基于SSM开发自行车在线租赁管理系统
  13. 获得中国行政区划接口
  14. CodeWars刷题练习
  15. 小程序内部引导关注公众号实现方法
  16. Nginx✧虚拟主机资源静态化
  17. 如何解决数组下标越界异常
  18. 那些年我们对Spark RDD的理解
  19. watir是如何定位元素的
  20. 开创云端时空智能,千寻位置加速三维实景中国建设

热门文章

  1. 单片机中P1=0x01什么意思
  2. 拔刀剑服务器文件,我的世界光宇世界服务器—生存多线||工业|食物工艺|拔刀剑|[1.7.10]...
  3. 网络安全全知识点学习路线及配套教案
  4. The TRANSFORM_INVALID_GROUP_CHARS settings is set to allow bad characters in group names
  5. 一张图片就能追溯到你的位置!| 利用Python获取图片定位
  6. SQL2005 转 SQL2000时导入的.sql长度超64K的限度行
  7. 公司网站用哪种SSL证书
  8. python就业前景和工资待遇怎么样
  9. 前端简历,汇总一下常见的问题
  10. 【GNN】图注意力网络GAT(含代码讲解)