算法与数据结构

  • 目录
  • 一、算法和初次尝试
  • 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 som算法实例 python算法模型_数据结构与算法引入

三. 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)

定义了一系列的操作(或者直接叫方法)和这些操作的作用(它们做什么),但我们却并不指定这些操作过程如何具体予以实施的办法(即不编写具体的代码)。这样出现的数据结构就是抽象数据结构。
常用的数据运算:插入、删除、修改、查找和排序