之前做了一道数组相关的题目,题目是力扣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惊呆了,后来发现,嘻嘻,事情没有那么简单~
群友推荐代码看起来非常简洁,但实际运行速度要比原代码略长一点。原因是群友用的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) 次运算。如果你不知道它是多少的话,读完本文你就知道了!
下面表格列出了一些常见的列表函数及其时间复杂度
根据表格,time.count(i)需要大概n次运算,也就是说群友推荐代码的运行次数大概是 60(n+1) 次,会稍微多一点点~
最后,授人以鱼不如授人以渔,如果遇到上面没列出的函数,除了利用搜索引擎以外,还可以直接去github上面找python的部分源代码。
(偷偷地说,这也是我为本文寻找素材的时候在stackoverflow上面看到的~学到了学到了
https://github.com/python/cpython/blob/master/Objects/listobject.c