Python学习笔记1——算法与数据结构

算法相关

算法概念

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。
一般的,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后在调用。每台机器执行的总时间不同,但是执行基本运算数量大体相同
算法的五大特性:

  1. 输入 0或者多个输入
  2. 输出 至少一个输出
  3. 有穷性 有限的步骤
  4. 确切性
  5. 可行性

时间复杂度

假设存在函数g,使得算法处理规模为n的问题示例所用的时间为T(n)=O(g(n)),责成O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,记为T(n)
最坏时间复杂度:算法完成工作最多需要多少基本操作,一般指的就是这个,在这个时间复杂度内一定能够完成该工作,是一种保证。
最优时间复杂度:算法完成工作最少需要多少基本操作
平均时间复杂度:算法完成工作平均需要多少基本操作

时间复杂度的几条基本计算规则

  1. 基本操作,即只有常数项,认为其时间复杂度为O(1)
  2. 顺序结构,时间复杂度按假发进行计算
  3. 循环结构,时间复杂度按乘法进行计算
  4. 分支结构,时间复杂度取最大值
  5. 判断一个算法的效率的时候,往往只需要关注操作数量的最高次数,其他次要项和常数项都可以忽略
  6. 一般指的都是最坏时间复杂度

常见时间复杂度
执行次数函数举例        阶      非正式术语12                  O(1)      常数阶2n+3                O(n)      线性阶3n2+2n+1         O(n^2)     平方阶5log2n+20          O(logn)    对数阶2n+3nlog2n+19      O(nlogn)   nlogn阶6n3+2n2+3n+4     O(n^3)     立方阶2^n                O(2^n)     指数阶

时间复杂度排序:
O(1)<O(logn)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

内置类型性能分析

1、timeit模块
列表的数据结构决定从尾部插入append比从头部插入insert要快的多

2、列表中操作的时间复杂度
在这里插入图片描述

3、字典中操作的时间复杂度
copy           O(n)get item       O(1)set item       O(1)delete item    O(1)contain        O(1)iteration      O(n)

数据结构引入

数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型,如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构,
数据结构指数据对象中数据元素之间的关系

程序 = 数据结构 + 算法

抽象数据类型:是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算绑定在一起,进行封装。
引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使他们相互独立。

案例分析

面试题:
如果a+b+c = 1000,且22+b2=c^2(a、b、c为自然数),如何求生所有的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:%d,%d,%d' % (a, b, c))
 end_time = time.time()
 print('finisned')

T = 1000100010002
T = N
NN2
T和解决问题的规模有关系
T(n) = n^3 * 2

上述代码改进:

 import time
start_time = time.time()
 for a in range(0, 1001):
 for b in range(0, 1001):
  c = 1000 - a - b
 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('finisned:time %d' % (end_time - start_time))

测试代码
append和expand的区别在于,后者可以添加列表,而前者只能添加元素

from timeit import Timer

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

def t2():
    li = []
    for i in range(10000):
        li = 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]:", timer3.timeit(1000))

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

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

结果测试:
append: 0.8710457548613924
+: 144.70819558154002
[i for i in range]: 0.37937327789683195
list(range()): 0.20041992158567723
extend: 1.468430231983973

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值