一,程序=算法+数据结构
算法:解决一个问题的思路
数据结构:一组数据如何保存,也会影响空间复杂度,如:列表中查找一个元素时间复杂度是O(n),而字典中查找一个元素,时间复杂度是O(1).
抽象数据类型:将数据类型与数据类型运算封装在一起
二,算法举例
#a+b+c=1000,a^2+b^2=c^2,求a,b,c
for a in range(1001):
for b in range(1001):
for c in range(1001):
if a+b+c==1000 and a**2+b**2==c**2 :
print(a,b,c)
#时间复杂度:t=n*n*n*2
#改进
for a in range(1001):
for b in range(1001):
c=1000-a-b
if a**2+b**2==c**2 :
print(a,b,c)
#时间复杂度:t=n*n
两种算法实现同一个功能但是所花费时间相差很大。需要引入时间复杂度的概念,因为需要衡量两个算法的优劣,并且与测试者的机器关系不大,所以时间复杂度可以定义为:一个算法所用的基本运算步骤表示.
大O表示法:一般只考虑一个算法的数量级,如第一个算法是n3数量级,而第二个算法是n2数量级.
并且还有最优时间复杂度与最坏时间复杂度的问题,为何有这个问题,因为在一些算法中,输入的数据可能会影响算法所用的步骤.平时所说的时间复杂度说的是最坏时间复杂度.
三,数据类型举例
li=[
['zhangsan',24,'sh'],
['lhy',18,'sx']
]
for i in li:
if i[0]=='lhy':
print(i)
di={
'zhangsan':[24,'sh'],
'lhy':[18,'sx']
}
print(di['lhy'])
以上两段程序,第一段用列表存储数据,第二段用字典存储数据,造成最后的查找方式不同,第二段程序的最坏时间复杂度更低。
四,建立列表的效率
1,list(range)与生成器方法最优
2,append与extend方法次之
3,insert方法在头添加与+号直接拼接最慢
注意,在列表头操作比在尾操慢的多
import time
start=time.time()
a=[]
for i in range(1000000):
a.append(i)
end=time.time()
print(end-start)
start1=time.time()
a=[]
for i in range(1000000):
a.insert(-1,i)
end1=time.time()
print(end1-start1)
结果是
0.18450689315795898
0.2932124137878418
但如果改为a.insert(0,i),会慢许多
#测试列表添加元素的效率问题
import timeit
def t1():
a=[]
for i in range(10000):
a=a+[i]#a=a+[i]与a+=a[i]的效率不同,同时a=a+[i]与extend函数均为融合两个列表,但是前一个的会生成新的列表对象,从而更加占用内存
def t2():
a=[]
for i in range(10000):
a.append(i)
def t3():
a=[i for i in range(10000)]
def t4():
a=list(range(10000))#list()而不用[]
def t5():
a=[]
for i in range(10000):
a.insert(0,i)#
def t6():
a=[]
for i in range(10000):
a.extend([i])
def t7():
a=[]
for i in range(10000):
a+=[i]
time1=timeit.Timer('t1()',"from __main__ import t1")#当程序运行起来,本文件名就叫__main__
print("+",time1.timeit(100))
time2=timeit.Timer('t2()',"from __main__ import t2")
print("append",time2.timeit(100))
time3=timeit.Timer('t3()',"from __main__ import t3")
print("[for]",time3.timeit(100))
time4=timeit.Timer('t4()',"from __main__ import t4")
print("list",time4.timeit(100))
time5=timeit.Timer('t5()',"from __main__ import t5")
print("insert",time5.timeit(100))
time6=timeit.Timer('t6()',"from __main__ import t6")
print("extend",time6.timeit(100))
time7=timeit.Timer('t7()',"from __main__ import t7")
print("+=",time7.timeit(100))#+=效率更快
结果如下:
+ 12.0599922
append 0.06601200000000063
[for] 0.04461880000000029
list 0.025203499999999934
insert 3.0834390000000003
extend 0.100510400000001
+= 0.10200829999999961
四.注意
a=[1,2,3,4,5]#切片操作可以等号左右两边可以不等
a[1:3]=[10,11,12,13,14]
print(a)
print(a[2])
结果如下:
[1, 10, 11, 12, 13, 14, 4, 5]
11
pop操作
import timeit
t1=list(range(200000))
t2=list(range(200000))
time1=timeit.Timer('t1.pop()',"from __main__ import t1")
print("pop",time1.timeit(10000))
time2=timeit.Timer('t2.pop(0)',"from __main__ import t2")
print("pop(0)",time2.timeit(10000))
结果如下:
pop 0.001818299999999995
pop(0) 0.3996717