python算法和数据结构基础——list和dict的内置操作的时间复杂度

我们已知python是具有非常多的包一种开源语言,封装了各种算法。
python典型的数据结构为列表/元组/字符串/字典,与C/C++中的数组(array)/ 栈(stack) /(优先)队列”(queue) / 二叉树(binary tree)有明显区别。
在python官网中指出,列表可以作为栈和队列使用,但是并未给出特别详细具体的教程。
在python官网上有关于list和dict数据结构的描述参考,如链接所示,但是没有关于时间复杂度和空间复杂度的分析。本文是对官网内容一个实例化和补充
官网链接:https://docs.python.org/zh-cn/3/tutorial/datastructures.html

本文内容部分参考:哔哩哔哩网站上“自学IT工程师”的“python学习教程之数据结构和算法基础”
具体参考链接:https://www.bilibili.com/video/av46256220/?p=6
            https://www.bilibili.com/video/av46256220/?p=7

根据这一系列的教程,将在系列文章中给出与C语言中的数据结构逐一对应的python解法

测算一小段代码的执行速度采用timeit这个包,timeit用法参考:https://docs.python.org/3/library/timeit.html

常用的参数定义为:

class timeit.Timer(stmt ='pass',setup ='pass',timer = ,globals = None )

用法的简单示例为:

timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()

 

测算生成list的算法效率

from timeit import Timer

def t1():
    li = []
    for i in range(10000):
        li.append(i)

def t2():
    li = []
    for i in range(10000):
        li = li+ [i]

def t3():
    li = [i for i in range(10000)]

def t4():
    li = list(range(10000))

def t5():
    for i in range(10000):
        li.extend([i])

def t6():
    li = []
    for i in range(10000):
        li.insert(0,i)

# 采用timeit测算一小段代码的运行速度

# 追加操作
timer1 = Timer('t1()','from __main__ import t1')
print('.append: ',timer1.timeit(1000))

# 加操作操作
timer2 = Timer('t2()','from __main__ import t2')
print('+: ',timer2.timeit(1000))

#列表生成器
timer3 = Timer('t3()','from __main__ import t3')
print('[i for i in range]: ',timer3.timeit(1000))

# 列表生成器类似的转换
timer4 = Timer('t4()','from __main__ import t4')
print('list(range()): ',timer4.timeit(1000))

# 扩展操作
timer5 = Timer('t5()','from __main__ import t5')
print('extend: ',timer5.timeit(1000))

#插入操作
timer6 = Timer('t6()','from __main__ import t6')
print('insert :',timer6.timeit(1000))
输出结果为
.append:  0.7118582189999999
+:  114.38965233500001
[i for i in range]:  0.3101561069999974
list(range()):  0.16905038100000525
extend:  1.4377866079999961
insert : 30.547064246999994
从以上输出结果可以看出,字符串‘+’操作的速度最慢,在循环次数多的时间特别明显,所以尽量避免使用;追加操作和列表生成器的速度相当,建议采纳,扩展的速度稍慢,但也可以;插入操作特别是从头部插入操作,因为后面所有的元素都要向后移动一位,所以速度最慢。
绝大部分情况下,我们更关注算法的时间复杂度。


除了以上引用到的列表(list)的方法以外,list和dict还有很多内置操作,他们的时间复杂度如下所示。

List 内置操作的时间复杂度
Operation         Big-O Efficiency
index[]             O(1)
index assignment    O(1)
append              O(1)
pop()               O(1)
pop(i)              O(n)
insert()            O(n)
del operator        O(n)
iteration           O(n)
contains(in)        O(n)
get slice           O(n)
set slice           O(n+k)
reversed            O(n)
concatenate         O(n)
sort                O(nlogn)
multiply            O(nk)

dict 内置操作的时间复杂度
operation       Big-O Effeciency
copy                O(n)
get item            O(1)
set item            O(1)
contains(in)        O(1)
iteration           O(1)

你可能感兴趣的:(算法)