趣说:如何对代码进行复杂度分析

你在学习数据结构算法的时候
你的目的就是为了让代码
运行的速度更加
“快”
占用的空间更加
“少”
那么当你看到一段代码的时候
你应该如何去分析它的运行效率?

在此之前

我们来看看你

不辞辛劳整理的文件夹

如果要让你在这个文件夹里面

让你找苍井空老师的教程

你会怎么找呢?

一种方式是

从第一个文件到最后一个文件

依次一个一个的查找

用代码体现就是这样

这样我们找到

第 50 个文件夹

发现是苍井空老师

于是进去开始观看了起来

不过这种查找效率并不高

另一种查找方式是这样

咱们先从中间开始找

如果发现小了

就把左边的都去掉

再在剩下的文件中往中间开始找

以此类推

用代码体现就是这样

第一种查找方式

我们需要 50 次才找到苍井空

而第二种方式

我们只需要 4 次就找到了苍井空

是不是快了很多

其实第二种方式叫

“二分查找”

在有序列表中

是一种常见的算法

那这和我们要说的

代码复杂度分析

有什么关系嘛?

现在我们来假设

你的文件夹巨 TM 多

比如有上千万个文件夹

如果你按第一种方式去

找苍老师的话

你需要找 10000050 次

才能找到她

而你通过第二种方式去

找苍老师的话

你只需要 23

就能找到它

因为二分查找是一直折半查询

所以是 2 的对数

也就是 log10000060

到这里我们就会发现

随着数据规模的增加

代码的执行时间会跟着变化

那么如何去表示

不同算法之间的

时间复杂度呢?

可以使用

“大胸表示法”

不好意思

说错了

“大O表示法”

假设我们的文件夹

有 n 个这么多

那么第一种查找方式

用大 O 表示时间复杂度

就是这样

而第二种查找方式

用大 O 表示时间复杂度

就是这样

可以看到

执行时间的增速

和操作的次数成正比

以下这些是较为常见的

代码时间复杂度表示

具体来说

复杂度排序是这样的

当你在分析一段代码的复杂度时

一般情况下

你只要往复杂的身上整就行了

比如

所以这段代码的复杂度

就是 O(logn)

最后你可能会问了

不对啊

如果苍井空老师的文件夹

在第一个位置

那使用第一种方式去查找

不就 1 次就能找着了

这时候效率

不就比二分查找快很多?

这就涉及到不同情况问题了

最好的情况就是苍老师在第 1 个位置

那么它的复杂度是 O(1)

最坏的情况就是苍老师在第 n 个位置

那么它的复杂度是 O(n)

这都是在极端情况下的分析

一般我们用一开始那样分析就行了

其它的在特定的情况下

差异比较大才需要考虑

最好最坏以及平均复杂度相关的

到时再具体情况具体分析好了

ok,以上就是

小帅b今天给你带来的分享

希望对你有帮助

那么我们下回再见

peace

(0)

相关推荐

  • PHP数据结构-在学数据结构和算法的时候我们究竟学的是啥?

    PHP数据结构-在学数据结构和算法的时候我们究竟学的是啥? 一说到数据结构与算法,大家都会避之不及.这本来是一门专业基础课,但是大部分人都并没有学好,更不用说我这种半路出家的码农了.说实话,还是很羡慕 ...

  • 第9天精彩打卡,精选5条,大家一起成长!

    公众号发起了话题思考打卡赠书活动!为了更快学习大家打卡思考的内容,小猿每天都会把打卡优秀的话题思考的留言整理出来,让大家能在最短的时间内看到大家最精彩的留言  .以后公众号的次条推文,都是昨日打卡留言 ...

  • 复杂度分析和大O表示法

    学习数据结构和算法要从复杂度分析说起.表示时间的大O符号,是用来描述算法效率的语言和度量单位.算法复杂度包括时间复杂度和空间复杂度,两者中又以时间复杂度相对重要,因为就 Web 应用而言,我们常见的性 ...

  • 关于时间复杂度,你不知道的都在这里

    相信每一位录友都接触过时间复杂度,「代码随想录」已经也讲了上百道经典题目了,是时候对时间复杂度来一个深度的剖析了,很早之前就写过一篇,当时文章还没有人看,Carl感觉有价值的东西值得让更多的人看到,哈 ...

  • 复杂度分析的套路及常见的复杂度

    前言 本篇文章收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人. 上一节,我们一起学习了表示复杂度的几个 ...

  • CTR学习笔记&代码实现2-深度ctr模型 MLP->Wide&Deep

    背景 这一篇我们从基础的深度ctr模型谈起.我很喜欢Wide&Deep的框架感觉之后很多改进都可以纳入这个框架中.Wide负责样本中出现的频繁项挖掘,Deep负责样本中未出现的特征泛化.而后续 ...

  • CTR学习笔记&代码实现1-深度学习的前奏LR->FFM

    CTR学习笔记系列的第一篇,总结在深度模型称王之前经典LR,FM, FFM模型,这些经典模型后续也作为组件用于各个深度模型.模型分别用自定义Keras Layer和estimator来实现,哈哈一个是 ...

  • 综述 | npj Biofilms and Microbiomes:微生物成分分析:标准化和差异丰度分析

    编译:独世,编辑:小菌菌.江舜尧. 原创微文,欢迎转发转载. 导读 越来越多研究表明微生物组与多种人类疾病之间存在一定的关联,例如肥胖.炎症性肠病.HIV等.进行微生物组广泛关联研究的第一步是在不同条 ...

  • 在外地上学回北京高考难易度分析

    北京高考的考题思路相较于外地有许多不同,但不能说北京高考就比外地容易.事实上,北京只是升学率更高,因为本地大学会赋予本地考生更多名额.建议回京高考要选择一所认真,负责的学校,这样才能令考生更快适应北京 ...

  • 我用代码来给你们分析一个赚钱的技巧

    赚钱是个俗气的话题,但又是人人都绕不开的事情.我今天来"科学"地触碰下这个话题. 谈赚钱,就会谈到理财.投资,谈到炒股.有这样一个笑话: 问:如何成为百万富翁? 答:带一千万进入股 ...

  • 算法复杂度分析

    算法复杂度分析

  • 如何进行算法的复杂度分析?

    前言 本篇文章收录于专辑:http://dwz.win/HjK 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人. 大家都知道,数据结构与算法解决的主要问题就是"快"和& ...

  • 递归算法复杂度Ω分析-分享

    递归算法复杂度Ω分析-分享