栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Chapter1 数据结构和算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Chapter1 数据结构和算法

比喻:码农——指挥作战的将军,代码——士兵和武器,数据结构和算法——兵法。

算法 引入概念

问:如果a+b+c=1000,且a² + b² =c²(a,b,c为自然数),如何求a、b、c可能的组合?
枚举法:思路:a=0,b=0,c=0 ——>a=0,b=0,c=1 ——>……——>a=0,b=1,c=0~1000……

第一次尝试

程序实现:

import time

t1=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))
                pass
t2=time.time()
print('times:{}'.format(t2-t1))
print('finished')

结果:
a:0,b:500,c:500
a:200,b:375,c:425
a:375,b:200,c:425
a:500,b:0,c:500
times:184.36142253875732
finished

算法的提出

算法——计算机处理信息的本质,是独立存在的一种解决问题的办法和思想。
对于算法而言,实现的语言并不重要,重要的是思想。

算法的五大特性:

  1. 输入:算法具有0或者多个输入
  2. 输出:算法至少有1个或者多个输出
  3. 有穷性:算法在有限的步骤之后会自动结束而不会无限循环,而且每一个步骤可以在可接受的时间内完成。
  4. 确定性:算法中的每一步都有确定的含义,不会出现二义性。
  5. 可行性:算法的每一步都是可行的,也就是每一步都是在有限次数内完成。
第二次尝试
import time

t1=time.time()
for a in range(0,1001):
    for b in range(0,1001):
            if a**2+b**2==(1000-a-b)**2:
                print('a:{},b:{},c:{}'.format(a,b,(1000-a-b)))
                pass
t2=time.time()
print('times:{}'.format(t2-t1))
print('finished')

结果:
a:0,b:500,c:500
a:200,b:375,c:425
a:375,b:200,c:425
a:500,b:0,c:500
times:0.8846123218536377
finished
分析:
时间大大降低!

算法效率衡量
  1. 实现算法程序的执行时间可以反应算法的效率,即算法的优劣。
  2. 然而单纯依靠程序运行的时间来比较算法的优劣并不一定是客观准确的。
  3. 每台机器执行的总时间不同,但是执行基本运算数量大致相同。
    每台机器执行的总时间=执行基本运算数量*基本步骤的次数
  4. 时间复杂度:执行基本运算步骤
    上面那个(第一次尝试)程序时间复杂度T=n³*2
  5. 由于T=n³ *2 和T=n³ *10数量级一致,后面的系数不影响图形的走势,所以令T=n³即可。
  6. 函数g(n)是函数f(n)的一个渐近函数,记为f(n)=O(g(n))。(“大O表示法”)
  7. 时间复杂度分类:
    (1)最坏时间复杂度:算法完成工作最多需要多少基本操作(主要关注点)
    (2)最优时间复杂度:算法完成工作最少需要多少基本操作
    (3)平均时间复杂度:算法完成工作平均需要多少基本操作
  8. 时间复杂度基本计算规则
    (1)基本操作——即只有常数项,认为时间复杂度为O(1)
    (2)顺序结构——时间复杂度按照加法计算
    (3)循环结构——时间复杂度按照乘法计算
    (4)分支结构——时间复杂度按照最大值计算
    (5)判断一个算法的效率,往往需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
常见时间复杂度

常见时间复杂度之间的关系:

所耗的时间从小到大:
O(1) < O(logn) < O(n) < O(n²) < O(n³) < O(2 ^ n) < O(n!) < O(n^n)

Python内置类型性能分析

timeit模块
class timeit.Timer(stmt=‘pass’,setup=‘pass’,timer=< timer function>)
Timer——测试小段代码执行速度的类,注意等于号后面为字符串
stmt——要测试的代码语句
setup——运行代码时需要的设置
timer——定时器函数,与平台有关
timeit.Timer.timeit(number=1000000)
number——测试代码时的测试次数,默认1000000次。返回执行代码的平均消耗时间,返回float值。

#coding=utf-8

import timeit
from timeit import Timer
def t1():
    li=[]
    for i in range(10000):
        li.append(i)

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

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

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

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

timer1=Timer('t1()','from __main__ import t1')
print('append:',timer1.timeit(1000))

timer2=Timer('t2()','from __main__ import t2')
print('+:',timer2.timeit(1000))

timer3=Timer('t3()','from __main__ import t3')
print('[i for i in range(10000)]:',timer3.timeit(1000))

timer4=Timer('t4()','from __main__ import t4')
print('list(range(10000)):',timer4.timeit(1000))

timer5=Timer('t5()','from __main__ import t5')
print('extend:',timer5.timeit(1000))

#测试insert、append执行效率问题

def t6():
    li=[]
    for i in range(10000):
        li.append(i)

def t7():
    li=[]
    for i in range(10000):
        li.insert(0,i)

timer6=Timer('t6()','from __main__ import t6')
print('append:',timer6.timeit(1000))  #append: 0.5322161

timer7=Timer('t7()','from __main__ import t7')
print('insert:',timer7.timeit(1000))  #extend: 14.7017194

list内置操作的时间复杂度

set内置操作的时间复杂度

数据结构

我们如何使用python来保存班级上的学生信息?

定义
  • 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型,如:int、float、char等。
  • 而python给我们提供了很多数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构,叫做python的内置数据结构,比如列表、元组、字典等。
  • 而有些数据组织方式需要我们自己去定义的,叫做python的扩展数据结构,比如栈、队列等
算法与数据结构的区别
  • 算法关注解决问题的思路;而数据结构是算法需要处理的问题的载体,它静态的描述了数据元素之间的关系。
  • 程序=数据结构+算法
抽象数据类型结构(Abstract Data Type)

定义:将数据类型和数据类型上的运算捆到一起,进行封装。
常用的数据运算:插入、删除、修改、查找、排序。

class Stus(object):
    def adds(self):
        pass
    def pop(self):
        pass
    def sort(self):
        pass
    def modify(self):
        pass
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886494.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号