Python数据结构与算法(一) 时间复杂度引入

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、在没有特殊说明时,我们往往分析算法的时间复杂度都是最坏时间复杂度

常见的时间复杂度
执行次数函数举例
12O(1)
2n+3O(n)
3n2+2n+1O(n2
5log2n+2n+1O(logn)
3nlog2n+2n+19O(nlogn)
6n3+2n2+3n+4O(n3
2nO(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)的含义:是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值