算法与数据结构
- 目录
- 一、算法和初次尝试
- 1.1算法的概念
- 1.2 算法的特性
- 1.3 初次尝试
- 1.4 第二次尝试
- 二. 算法的效率衡量
- 2.1分类:
- 三. Python内置类型性能分析
- 四. 数据结构的引入
- 4.1 数据结构的作用
- 4.2 数据结构和算法的关系
- 4.3 抽象数据类型(Abstract Data Type,ADT)
目录
一、算法和初次尝试
1.1算法的概念
算法是独立存在的一种解决问题的方法和思想
1.2 算法的特性
输入、输出、有穷性、确定性、可行性
1.3 初次尝试
#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)
print(f"start:{start_time}")
end_time = time.time()
print(f"finished:{end_time}")
print(f"total time = {end_time - start_time}")
0 500 500
200 375 425
375 200 425
500 0 500
start:1571934500.6924317
finished:1571934627.8057613
total time = 127.11332964897156
1.4 第二次尝试
可以发现,当合理利用已知限制条件时,减少了内层循环个数,程序运行的时间大大缩短。
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)
T = 1000 * 1000 * 1000 * 2
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)
print(f"start:{start_time}")
end_time = time.time()
print(f"finished:{end_time}")
print(f"total time = {end_time - start_time}")
0 500 500
200 375 425
375 200 425
500 0 500
start:1571969278.6048946
finished:1571969279.6321461
total time = 1.0272514820098877
二. 算法的效率衡量
2.1分类:
a.最优时间复杂度:算法完成最少需要的基本操作
b.最坏时间复杂度:算法完成最多需要的基本操作
c.平均时间复杂度:算法完成平均需要的基本操作
计算规则:
基本操作:O(1)
顺序:时间复杂度按加法计算
条件:时间复杂度取最大值
循环:时间复杂度按乘法计算
判断一个算法的效率时,往往只需要关注操作数量的最高次项,其他次要项和常数项可以忽略
通常在计算的都是最坏时间复杂度
常见时间复杂度之间的关系:
例如第二次尝试中 :时间复杂度T(n) = n * n * (1 + max( 1, 0 ) ) = n^2*2 = O(n^2)
三. Python内置类型性能分析
timeit模块:可以测试一小段Python代码的执行速度
class timeiit.Timer(stmt = 'pass', setup = 'pass' , timer = <timer function> )
Timer是测量小段代码执行速度的类
stmt参数是要执行的代码语句
setup参数是运行代码时需要的设置
timer参数是一个定时器函数,与平台有关
timeit.Timer.timeit(number = 1000000) , Timer类中测试语句执行速度的对象方法,参数为测试代码时的测试次数
#几个不同的list生成方法的效率比较
from timeit import Timer
# l1 = [1,2]
# l2 = [23,5]
# l = l1 + l2
# l = [i for i in range(10000)]
# l = list(range(10000))
def test1():
l = []
for i in range(10000):
l.append(i)
def test2():
l = []
for i in range(10000):
l += [i]
def test3():
l = [i for i in range(10000)]
def test4():
l = list(range(10000))
timer1 = Timer("test1()","from __main__ import test1")
print("append:",timer1.timeit(1000))
timer2 = Timer("test2()","from __main__ import test2")
print("+:",timer2.timeit(1000))
timer3 = Timer("test3()","from __main__ import test3")
print("i for i in range:",timer3.timeit(1000))
timer4 = Timer("test4()","from __main__ import test4")
print("list(range()):",timer4.timeit(1000))
append: 0.5817329
+: 0.6728471
i for i in range: 0.3208246000000001
list(range()): 0.20152229999999993
四. 数据结构的引入
4.1 数据结构的作用
数据结构解决的是一组数据如何保存,数据结构是对基本类型的封装。
4.2 数据结构和算法的关系
高效的程序是数据结构的基础上设计和选择算法
程序 = 数据结构 + 算法
4.3 抽象数据类型(Abstract Data Type,ADT)
定义了一系列的操作(或者直接叫方法)和这些操作的作用(它们做什么),但我们却并不指定这些操作过程如何具体予以实施的办法(即不编写具体的代码)。这样出现的数据结构就是抽象数据结构。
常用的数据运算:插入、删除、修改、查找和排序