2018-06-25常见时间复杂度

常见时间复杂度计算规则

左边对应于具体应用场合
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))

生成列表的几种方法

*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中尽量不要用+,效率太低。

你可能感兴趣的:(2018-06-25常见时间复杂度)