Python数据结构与算法(一)

▼魔方 西西 提交于 2020-03-01 02:26:31

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)的含义:是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!