数据结构——时间复杂度概念

算法效率衡量:时间复杂度————程序总共要执行的基本运算步骤的总和。
对于本题的枚举法,a+b+c= 1000时,时间复杂度(基本运算步骤)为T = 1000 * 1000 * 1000 * 2 即为 T(n) = n**3 * 2

大O表示法:对于一个时间复杂度表达式,只留下与n最相关的,最特征部分,能够特征和趋势即可。T(n)==>g(n) = n**3 (g(n)为时间复杂度的大O表示法)

时间复杂度的几条基本计算规则:
1.基本操作,即只有常数项,认为其时间复杂度为O(1)
2.顺序结构,时间复杂度按加法进行计算
3.循环结构,时间复杂度按乘法进行计算
4.分支结构,时间复杂度取最大值
5.判断一个算法的效率时,往往只需关注操作数量的最高次项,其他次要项和常数项可以忽略
6.在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度

常见的时间复杂度大小关系:
O(1) < O(logn) < O(n) < O(nlogn) < O(n² ) < O(n³) < O(2^n) < O(n!) < O(n ^n

例:枚举法

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 : %d , %d , %d' % (a , b , c))
end_time = time.time()
print('finish')
print('用时:%d' %(end_time - start_time))

程序用时108s
对于本题的枚举法,a+b+c= 1000时,时间复杂度(基本运算步骤)为T = 1000 * 1000 * 1000 * 2 即为 T(n) = n**3 * 2
时间复杂度为T(n) = O(n^3)

对枚举法进行改进后(通过a,b,c的关系减少对c的枚举),操作数量减少,程序用时随之减少:

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 : %d , %d , %d' % (a, b, c))
end_time = time.time()
print('finish')
print('用时:%d' %(end_time - start_time))

程序用时1s

timeit模块
timeit模块可以用来测试一小段python代码的执行速度。

#使用timeit模块测试几种列表生成方法所需时间
import timeit
from timeit import Timer


def t1():
    li = []
    for i in range(10000):
        li += [i]

def t2():
    li = []
    for i in  range(10000):
        li.append(i)#把元素添加到列表尾部

def t3():
    li = [i for i in range(10000)]

def t4():
    li = list(range(100000))

def t5():
    li = []
    for i in  range(10000):
        li.extend([i])

def t6():
    li = []
    for i in  range(10000):
        li.insert(0,i)#(0,)代表每个元素都添加到列表首部

timer1 = Timer('t1()','from __main__ import t1')
print('t1:',timer1.timeit(1000)) #测试1000次

timer2 = Timer('t2()','from __main__ import t2')
print('t2:',timer2.timeit(1000)) #测试1000次

timer3 = Timer('t3()','from __main__ import t3')
print('t3:',timer3.timeit(1000)) #测试1000次

timer4 = Timer('t4()','from __main__ import t4')
print('t4:',timer4.timeit(1000)) #测试1000次

timer5 = Timer('t5()','from __main__ import t5')
print('t5:',timer5.timeit(1000)) #测试1000次

timer6 = Timer('t6()','from __main__ import t6')
print('t6:',timer6.timeit(1000)) #测试1000次

结果如下图,可以看出每种方法的效率不一样,在具体任务中可考虑使用。
在这里插入图片描述
数据结构引入歧途——数据的组织方式。
数据结构只是静态的描述了数据元素之间的关系。
高效的程序需要在数据结构的基础上设计和选择算法。
程序 = 数据机构 + 算法
总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。

抽象数据类型概念:把原有的基本数据和这个数据所支持的基本操作放在一起,形成一个整体。
最常用的5种数据运算:插入、删除、修改、查找、排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值