程序员的数学基础课
黄申
LinkedIn 资深数据科学家
83374 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
导读 (1讲)
基础思想篇 (18讲)
程序员的数学基础课
15
15
1.0x
00:00/00:00
登录|注册

16 | 时间和空间复杂度(上):优化性能是否只是“纸上谈兵”?

思考题
6个通用法则
基本概念
时间和空间复杂度

该思维导图由 AI 生成,仅供参考

你好,我是黄申。
作为程序员,你一定非常清楚复杂度分析对编码的重要性。计算机系统从最初的设计、开发到最终的部署,要经过很多的步骤,而影响系统性能的因素有很多。我把这些因素分为三大类:算法理论上的计算复杂度、开发实现的方案和硬件设备的规格
如果将整个系统的构建比作生产汽车,那么计算复杂度相当于在蓝图设计阶段,对整个汽车的性能进行评估。如果我们能够进行准确的复杂度分析,那么就能从理论上预估汽车的各项指标,避免生产出一辆既耗油又开得很慢的汽车。
可是,你也常常会发现,要准确地分析复杂度并不容易。这一讲,我来说说如何使用数学的思维,来进行系统性的复杂度分析。

基本概念

我先带你简短回顾一下几个重要概念,便于你稍后更好地理解本节的内容。
算法复杂度是一个比较抽象的概念,通常只是一个估计值,它用于衡量程序在运行时所需要的资源,用于比较不同算法的性能好坏。同一段代码处理不同的输入数据所消耗的资源也可能不同,所以分析复杂度时,需要考虑三种情况,最差情况、最好情况和平均情况。
复杂度分析会考虑性能的各个方面,不过我们最关注的是两个部分,时间和空间。时间因素是指程序执行的耗时多少,空间因素是程序占用内存或磁盘存储的多少。因此,我们把复杂度进一步细分为时间复杂度和空间复杂度。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了时间和空间复杂度的重要性以及系统性的复杂度分析方法。作者将系统性能影响因素分为算法理论上的计算复杂度、开发实现的方案和硬件设备的规格,并通过生产汽车的比喻强调了复杂度分析对性能评估的重要性。在基本概念部分,作者介绍了算法复杂度、时间复杂度和空间复杂度的概念,并强调了渐进时间复杂度和渐进空间复杂度的重要性。此外,作者总结了四则运算法则、主次分明法则和齐头并进法则,帮助读者快速、准确地进行复杂度分析。通过丰富的例子和详细的解释,读者可以更好地理解复杂度分析的方法和规则。文章通俗易懂,适合程序员快速了解复杂度分析的重要性和方法。文章还介绍了排列组合法则、一图千言法则和时空互换法则,以及它们在复杂度分析中的应用。总之,本文通过深入浅出的方式,系统性地介绍了复杂度分析的重要性和方法,对读者进行了全面而深入的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的数学基础课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • pyhhou
    思考题感觉要根据具体图的情况来看具体时间复杂是多少,就之前的六度关系的例子,假设把关系看作是一个树,每个结点都有 n 个子结点,要确认两个人是几度好友,也就是确认两个结点相距多少层,如果是单向广度优先搜索,时间复杂度 O(n^degree),双向可以运用加法法则,两边同时出发,时间复杂度 2 * O(n^(degree/2)),空间复杂度是队列中暂存的结点的最大值,和时间复杂度一样

    作者回复: 是的

    2019-03-16
    12
  • Being
    老师,我想了很久,不能确定,双向BFS的停止条件跟maxDegrees有关,也就是说最坏的情况是刚好到maxDgrees时搜索到,所以时间复杂度应该是 maxDgrees * 2*(V+E),运用四则运算法则,这个队列循环了maxDgrees次,每一次对node的访问都是(V+E),而双向是两端并进所以乘2,再根据主次分明,将常量这些去掉,最后就是O(V)。 空间复杂度也和maxDegrees有关,队列有两个maxDegrees*(V+E),visited的容器也有两个,同样的,主次分明来说,其他的变量就可以忽略了,然后用四则运算法则来计算,就是相加,最后是O(V) 以上都是算的最坏情况,最好情况是O(1),平均情况? 最后跟最坏情况一样,是使用排列组合法则推导吗?我后面再试试。

    作者回复: 分析的很详细👍,这里E是指边的数量?V是指结点的数量?

    2019-01-19
    5
  • 炎发灼眼
    老师,有一点不明白,为什么在计算归并的复杂度时,切分的复杂度就是按照节点来算,是算每次切的时间么?而归并的时候是算指数的,合并的时候,其实也是两个节点合并一个,应该是按照合并的数目来算的。

    作者回复: 你这里的归并是指归并排序,对吧?归并排序的时间复杂度是O(n * logn),其中logn表示二叉树的高度,而n表示二叉树的每一层,你都要扫描一遍长度为n的数组

    2019-10-10
    3
  • 冉冉
    “ 在数据归并阶段,我们看二叉树的高度,为 log2n,因此归并的次数为 log2n ” 为什么是看二叉树高度呢?我觉得归并次数应该和切分次数一样,都是看非叶子结点的个数吧?

    作者回复: 是这样,每一层非叶子结点里所包含的数据集大小不同,如果按照非叶子结点数量来算不方便,好在不管怎样,每一层总的计算次数都是n(n是整个被排序数组的大小),所以在计算时间的时候,咱们只看层数log2n,时间复杂度是n x log2n

    2020-09-23
    2
  • 拉普达
    考虑图的平均节点度是d,平均最短路径(假设为无权图)为D。时间复杂度为O(D*d/2),O(d^(D/2)*2)。

    作者回复: 这里你提到的时间复杂度具体是指?

    2020-03-28
    1
  • Being
    嗯,V是节点的数量,E是边的数量,根据邻接矩阵的概念来的。

    作者回复: 思路是对的,不过V和E我们通常可以使用平均连接数来进一步推导,便于比较不同算法的好坏。具体的我会在第17讲的例子中讲解。

    2019-01-20
    1
  • 建强
    双向广度搜索算法的时间复杂度:取决于算法中的搜索次数,每次搜索之后,还要计算两个搜索结果的交集,而搜索次数是两个节点的共同好友交集中,到各自的出发点度数最大的那些节点。 空间复杂度:搜索过程中两者所有好友的结点数之和,即存贮已访问节点的存贮空间。

    作者回复: 是的

    2020-03-01
  • 知行合一
    平均复杂度的计算稍微繁琐一些。如果距离为 n-1,只有 1 种可能,a 为数组中第一个字符,b 为数组中最后一个字符。如果距离为 n-2,那么 a 字符的位置有 2 种可能,b 在 a 位置确定的情况下只有 1 种可能,因此排列数是 2。以此类推,如果距离为 n-3,那么有 3 种可能,一直到距离 1,有 n-1 种可能。所以平均的扫描次数为 (1 *(n-1) + 2 *(n-2) + 3(n -3) + … + (n-1)1) / (1 + 2 + … + n),最后时间复杂度简化为 O(n)。 老师,这个分母(1+2+•••+n)怎么理解

    作者回复: 表示扫描的总次数

    2019-12-11
  • 天佑
    看不懂里面的数学符号,怎么来的,为什么是log...

    作者回复: 你所说的log是指二分查找或归并排序的时间复杂度log(n)对吧。这里的log是以2为底,如果8个数字,那么就要查找3次,或者划分3次,也就是log(8),以2为底

    2019-07-03
  • 罗耀龙@坐忘
    茶艺师学编程 关于算法复杂度 1965年哈特马尼斯(Juris Hartmanis)和斯坦恩斯(Richard Stearns)提出了算法复杂度的概念(二人后来因此获得了图灵奖),而最早将复杂度严格量化衡量的是著名计算机科学家、算法分析之父高德纳(Don Knuth)。今天,全世界计算机领域都以高德纳的思想为准。 高德纳的思想主要有三部分: 1. 在比较算法的快慢时,需要考虑数据量特别特别大,大到近乎无穷大时的情况。 2. 决定算法快慢的因素虽然可能很多,但是所有的因素都可以被分为两类。第一类是不随数据量变化的因素,第二类是随着数量变化的。 3. 如果两种算法在量级上相当,在计算机科学里,就认为它们是一样好的。 大神的思想和今天老师讲的六原则,是不是已经很接近了?(特别是第三点) 回到思考题,请试着用使用规则,分析一下双向广度优先搜索的时间和空间复杂度。 (数学学渣,真的说错了请大家指教了) 由于是双头开始搜索,我猜其时间复杂度是O(logN),空间复杂度也应该是O(logN)
    2020-04-08
    1
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部