左边对应于具体应用场合
12,代表执行12次,抽象为O(1),常数阶
2n+3,去掉系数抽象为O(n),线性阶
3n2+2n+1,忽略常数项(1),忽略次要项(2n)等细节问题为O(n2),平方阶
……
常见时间复杂度之间关系
所消耗的时间从小到大
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
(记忆方法:可以把n代成8去试)
Python中算法优劣问题
*基础操作算一步,基础操作指的是不涉及到函数调用的步骤。
基础操作
li.append()调用了append函数,封装了一个函数体,不算作是基本步骤;要去分析函数里面,才能判断复杂度。
timeit计时器测算,Timer(代码语句,需要用到的东西,时间计量<和操作系统有关>)
Timer.timeit(number=执行多少次)
Python列表不同操作的时间效率
tip1:在设置文件名的时候不要和模块重名,最好前面加入数字序号。
tip2:Python2中的range直接返回一个列表对象;Python3中的range返回一个可迭代对象;如果Python2也想返回一个可迭代对象,应该用xrange()
python3:
>>> range(100)
range(0, 100)
>>> type(range(110))
<class 'range'>
生成列表的几种方法
*append()只能增加一个元素;extend可以把整个列表追加进去
测试列表各个方法的时间复杂度
from timeit import Timer
def t1():
li = []
for i in range(10000):
li.append(i)
def t2():
li = []
for i in range(10000):
li += [i]
def t3():
li = [i for i in range(10000)]
def t4():
li = list(range(10000))
def t5():
li = []
for i in range(10000):
li.extend([i])
def t6():
li = []
for i in range(10000):
li.insert(0, i)
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", timer3.timeit(1000))
timer4 = Timer("t4()", "from __main__ import t4")
print("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.8609376643770416
+= 1.2329407100831602
i 1.7319727297682164e-05
range 0.18228948833676695
extend 1.5933584619055807
insert 23.403435464130204
Process finished with exit code 0
往尾部添加append比往头部添加insert更快。
list和dict不能算作基本数据类型,不过是Python封装好了的容器,把基本类型集合起来了。
list模块中的时间复杂度
dict模块中的时间复杂度
注意:extend和“+”哪个比较快的问题;“+=”和“=+”不是一回事,“+=”和extend差不多,针对对象进行累加;“=+”相当于一次次地生成新的对象,进行累加。
列表中的“+”操作
list中尽量不要用+,效率太低。
网友评论