python 字典取值的时间复杂度_python小知识|列表函数的时间复杂度

之前做了一道数组相关的题目,题目是力扣LC1010。

如果你想了解LC1010的具体解答,欢迎关注公众号【每天学python】,是小黄鸡头像的那个哟~~

群友说,在我的答案中有一行代码可以进行优化。

原代码是

for i in time:    count[i] = count[i] + 1

群友推荐代码是

count = [time.count(i) for i in range(0,60)]

这里只循环 0-59 是因为time只有这60种可能取值。

我先被群友这个oneliner惊呆了,后来发现,嘻嘻,事情没有那么简单~

3e56550f7d0901668bd463067e3a28e8.png

群友推荐代码看起来非常简洁,但实际运行速度要比原代码略长一点。原因是群友用的count函数运行时间比较长。

这也就是本文的目的啦~简单介绍一下常见的列表函数的时间复杂度。

首先,什么是时间复杂度呢?

下面是wikipedia给的定义:

在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

更通俗地说,时间复杂度可以告诉我们代码大概需要执行多少次简单运算(如加减乘除)。

举个栗子

for i in time:               # n次运算    count[i] = count[i] + 1  # n次运算

回到我们之前说过的这段代码,简单分析可知,它需要进行2n次运算,其中n是time列表的长度。由于运算次数的最高项就是一次项,这段代码的时间复杂度为O(n)。

而群友推荐的代码

count = [time.count(i) for i in range(0,60)]

可以写为

for i in range(0,60):         # 60次运算    count[i] = time.count(i)  # 60*x

这里x是time.count(i)所需要的运算次数。也就是说,上面这段代码大概需要 60(x+1) 次运算。如果你不知道它是多少的话,读完本文你就知道了!

下面表格列出了一些常见的列表函数及其时间复杂度

9e802e029e75c9e9de4e10f7b7b59ed0.png

根据表格,time.count(i)需要大概n次运算,也就是说群友推荐代码的运行次数大概是 60(n+1) 次,会稍微多一点点~

最后,授人以鱼不如授人以渔,如果遇到上面没列出的函数,除了利用搜索引擎以外,还可以直接去github上面找python的部分源代码。

(偷偷地说,这也是我为本文寻找素材的时候在stackoverflow上面看到的~学到了学到了

https://github.com/python/cpython/blob/master/Objects/listobject.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值