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

学习python的正确姿势

共 1078字,需浏览 3分钟

 · 2020-02-17



你在学习数据结构算法的时候
你的目的就是为了让代码

运行的速度更加
“快”
占用的空间更加

“少”

那么当你看到一段代码的时候
你应该如何去分析它的运行效率?


fe2d4719adfc973598c50d83d06da76f.webp

在此之前

我们来看看你

不辞辛劳整理的文件夹




f0c62fae64d8038025cedfc3c0f1a56e.webp



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

让你找苍井空老师的教程

你会怎么找呢?



一种方式是

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

依次一个一个的查找




b3b6951525212bc0206ccb4a771a4a51.webp



用代码体现就是这样



044a8d59668170330267137ed691b29c.webp



这样我们找到

第 50 个文件夹

发现是苍井空老师

于是进去开始观看了起来



813ce9bc710270c02ba1cf4c95a75f2f.webp



不过这种查找效率并不高

另一种查找方式是这样


咱们先从中间开始找


如果发现小了

就把左边的都去掉

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


以此类推



375bddfab48bc6b274c39fa7034da04d.webp



用代码体现就是这样



906d11885158fc2353ccf37dd4defb04.webp


第一种查找方式

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



而第二种方式

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



是不是快了很多



540a9741da8d88e150c249a9721c216a.webp



其实第二种方式叫

“二分查找”


在有序列表中

是一种常见的算法


那这和我们要说的

代码复杂度分析

有什么关系嘛?

10fbc74dc68793027ff0233565c22a51.webp



现在我们来假设

你的文件夹巨 TM 多

比如有上千万个文件夹



c3e84709bf428694eccd5d52e338389b.webp



如果你按第一种方式去

找苍老师的话

你需要找 10000050 次

才能找到她



e27d0821c6d4fed55a103b31e878ccb1.webp



而你通过第二种方式去

找苍老师的话

你只需要 23

就能找到它


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

所以是 2 的对数

也就是 log10000060



到这里我们就会发现

随着数据规模的增加

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




b6e3dcbaf9308172d15c4a31e9455c20.webp




那么如何去表示

不同算法之间的

时间复杂度呢?



可以使用


“大胸表示法”




b930cdd9ace0842b31b2c61184c0ff10.webp



不好意思

说错了



“大O表示法”


假设我们的文件夹

有 n 个这么多


那么第一种查找方式

用大 O 表示时间复杂度

就是这样



658636a1c408d61d5f43b935501825c5.webp



而第二种查找方式

用大 O 表示时间复杂度

就是这样



1f6d58478b2dffb53d740437ceae4e13.webp



可以看到

执行时间的增速

和操作的次数成正比


以下这些是较为常见的

代码时间复杂度表示




d5250e6b54689f7c65dbfe0441563c84.webp



具体来说

复杂度排序是这样的




92d287e740bf44fd00512c9a0bba4511.webp




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


一般情况下

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


比如



45c8f9e8ba266dfde9d857651f4feade.webp



所以这段代码的复杂度

就是 O(logn)




279f1bc6cd66f7aa5a885eef4d828141.webp




最后你可能会问了


不对啊

如果苍井空老师的文件夹

在第一个位置


那使用第一种方式去查找

不就 1 次就能找着了




d16f1f5a1dc2665f7376d1c8ffd812cd.webp




这时候效率

不就比二分查找快很多?


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

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

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


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

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


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

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


其它的在特定的情况下

差异比较大才需要考虑

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


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



ok,以上就是

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


希望对你有帮助

那么我们下回再见

peace


推荐阅读

趣说:什么是数据结构和算法

_、_xx、xx_、__xx、__xx__


4c4f5fdaea79df0fb6d1b8729880d535.webp

扫一扫

学习 Python 没烦恼




点个在看

给点动力

浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报