Python数据结构与算法(一)
引 入
题目:如果a+b+c=1000且a^2+ b^2 =c^2,求出a,b,c可能组合。
方式一:
import time
start_time=time.time()
for a in range(0,1001):
for b in range(0,1001):
for c in range(0,1001):
if ((a+b+c)==1000) and (a**2+b**2==c**2):
print('a={},b={},c={}'.format(a,b,c))
end_time=time.time()
print(end_time-start_time)
print('over')
a=0,b=500,c=500
a=200,b=375,c=425
a=375,b=200,c=425
a=500,b=0,c=500
227.9280366897583
over
方式二:
import time
start_time=time.time()
for a in range(0,1001):
for b in range(0,1001):
c=1000-a-b
if (a**2+b**2==c**2):
print('a={},b={},c={}'.format(a,b,c))
end_time=time.time()
print(end_time-start_time)
print('over')
a=0,b=500,c=500
a=200,b=375,c=425
a=375,b=200,c=425
a=500,b=0,c=500
1.4620835781097412
over
时间复杂度的几条基本计算规则
1、基本操作,即只有常数项,认为其时间复杂度为O(1)
2、顺序结构,时间复杂度按加法进行计算
3、循环结构,时间复杂度按乘法进行计算
4、分支结构,时间复杂度取最大值
5、判断一个算法的效率时,往往只需要关注操作数量的最高次数
6、在没有特殊说明时,我们往往分析算法的时间复杂度都是最坏时间复杂度
常见的时间复杂度
执行次数函数举例 | 阶 |
---|---|
12 | O(1) |
2n+3 | O(n) |
3n2+2n+1 | O(n2) |
5log2n+2n+1 | O(logn) |
3nlog2n+2n+19 | O(nlogn) |
6n3+2n2+3n+4 | O(n3) |
2n | O(2n) |
常见的时间复杂度之间的关系
Python内置类型性能分析
timeit模块
用来测试Python代码执行的速度
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
stmt参数是要测试的代码语句(statment)
setup参数是运行代码时需要的设置
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)
默认执行1000000次
list测试
#coding:utf-8
from timeit import Timer
li1=[1,2]
li2=[23,5]
li=li1+li2
li=[i for i in range(10000)]
li=list(range(10000))
def test1():
li=[]
for i in range(10000):
li.append(i)
def test2():
li=[]
for i in range(10000):
li+=[i]
def test3():
li=[i for i in range(10000)]
def test4():
li=list(range(10000))
def test5():
li=[]
for i in range(10000):
li.extend([i])
def test6():
li=[]
for i in range(10000):
li.append(i)
def test7():
li=[]
for i in range(10000):
li.insert(0,i)
time1=Timer('test1()','from __main__ import test1')
print('+append:',time1.timeit(1000))
time2=Timer('test2()','from __main__ import test2')
print('+:',time2.timeit(1000))
time3=Timer('test3()','from __main__ import test3')
print('[i for i in range]:',time3.timeit(1000))
time4=Timer('test4()','from __main__ import test4')
print('list(range()):',time4.timeit(1000))
time5=Timer('test5()','from __main__ import test5')
print('list(range()):',time5.timeit(1000))
time6=Timer('test6()','from __main__ import test6')
print('list(range()):',time6.timeit(1000))
time7=Timer('test7()','from __main__ import test7')
print('list(range()):',time7.timeit(1000))
list内置操作的时间复杂度
dict内置操作的时间复杂度
算法与数据结构的区别
程序=数据结构+算法
抽象数据类型(ADT)的含义:是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。
来源:CSDN
作者:�春风亲吻我像蛋蛋蛋挞。
链接:https://blog.csdn.net/Dandandandanta/article/details/104560325