文章目录
1. 数据结构介绍
概念
计算机学科基本概念,有助于对编程语言程序执行效率的提高
运算分类
存放在容器中的数据需要执行的数据结构操作如下:
- 遍历: 逐个打印所有元素
- 插入:在特定位置添加一个元素
- 删除:删除特定位置的元素
- 搜索:根据给定索引或者值对整个数据结构进行检索
- 更新:更新给定元素
常见数据结构
- 字符串
- 列表
- 字典
- 链表
- 栈
- 队列
- 二叉树
- 图
2. 数据结构算法
2.1 数组模块
''' 数组: arrary array(typecode [, initializer]) -> array typecode:兼容C语言 b 代表大小1个字节有符号整数 B 代表大小1个字节无符号整数 c 代表1个字节的字符 i 代表大小2个字节有符号整数 I 代表大小2个字节无符号整数 f 代表大小4个字节的浮点数 d 代表大小8个字节的浮点数 ''' from array import * # 创建数组对象 arrary1 = array('i',[1,2,3,4,5]) print(type(arrary1)) # 遍历 for element in arrary1: print(element, end='\t') print() # 访问特定元素 print(arrary1[0], arrary1[len(arrary1)-1]) # 插入元素 .insert(pos,val) arrary1.insert(1, 11) for i in arrary1: print(i,end='\t') print() # 删除元素 .remove(val),只允许传入一个值 arrary1.remove(11) for i in arrary1: print(i,end='\t') print() # 查询,index(val)返回下标 print(arrary1.index(1)) # 更新特定位置元素 arrary1[0] = 100 print(arrary1[0])
2.2 列表
''' datalist = [10,20,30,40,50] 遍历、插值、搜索、删除、更新 ''' # 创建 datalist = [10,20,30,40,50] # 遍历 for i in datalist: print(i) # 插值 datalist.insert(0,0) # 搜索 datalist.index(20) # 删除 del datalist[0] # 更新 datalist[0] = 1000
2.3 元组
# 创建 dataTuple = (10,20,30,40,50) # 遍历 for i in dataTuple: print(i) # 元组内部数据不可修改,但是可更新 dataTuple2 = ('abc','xyz') dataTuple+=dataTuple2 print(dataTuple) # 删除:删除整体数据结构 del dataTuple
2.4 字典
dataDict = { 'name':'Alex', 'age':23, 'class':'python' } # 遍历:key值, value值,(keyval) for key in dataDict.keys(): print(key,end='\t') print() for value in dataDict.values(): print(value,end='\t') print() for kv in dataDict.items(): print(kv) print() # 插值 dataDict['height'] = 1.414 print(dataDict) # 删除:1. pop删除key,del以及clear dataDict.pop('height') del dataDict['class'] print(dataDict) dataDict.clear() print(dataDict) # 更新:key重新赋值value,update添加数据 dataDict['name'] = 'John' dataDict.update({'class': 'python'}) print(dataDict)
2.5 二维列表
# 创建 dataList2 = [ [1,2,3], [1,1,1], [11,22,33] ] # 遍历 for row in dataList2: for col in row: print(col,end='\t') print() # 插值 dataList2.insert(1,['a','b','c']) print(dataList2[1]) # 更新 dataList2[2][0] = 99 # 删除 del dataList2[1] print(dataList2)
2.6 集合
''' 创建、访问元素、添加、删除 ''' Weeks = set(['Mon','Tue','Wen','Thu','Fri']) # 访问 for day in Weeks: print(day,end='\t') print() # 添加 Weeks.add('Sat') print(Weeks) # 删除 Weeks.remove('Sat') print(Weeks)
2.7 矩阵
numpy库实现矩阵创建
from numpy import * # Arrary:矩阵操作 data1 = array([1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1]) # reshape方法可以将arrary对象实现矩阵转换:转二维 data2 = data1.reshape((2,8)) print('一维:',data1) print('二维:',data2) # 三维矩阵 data3 = data1.reshape((2,2,4)) print('三维:',data3) data4 = data1.reshape((2,4,2)) print('三维:',data4) ''' 一维: [1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1] 二维: [[1 2 3 4 5 6 7 8] [8 7 6 5 4 3 2 1]] 三维: [[[1 2 3 4] [5 6 7 8]] [[8 7 6 5] [4 3 2 1]]] 三维: [[[1 2] [3 4] [5 6] [7 8]] [[8 7] [6 5] [4 3] [2 1]]] '''
from numpy import * dataList2 = [ [1,2,3], [1,1,1], [11,22,33] ] # 通过二维列表创建矩阵 NumpyArrary= array(dataList2) # 访问矩阵 print(NumpyArrary) # 访问矩阵元素 print(NumpyArrary[2]) print(NumpyArrary[2][0]) # 增加元素: numpy.insert(arrary, pos, value, axis) # axis=0: 行, axis =1:列 NewArrary= insert(NumpyArrary,3,[1,2,3], axis=1) print('NumpyArrary:',NumpyArrary) print('NewArrary:',NewArrary) # 删除元素:numpy.delete(arrary, pos, axis) DelArrary = delete(NewArrary, 1, axis=1) print('DelArrary:',DelArrary) # 更新某一行 NewArrary[2] = [0,0,0,0] print(NewArrary) ''' [[ 1 2 3] [ 1 1 1] [11 22 33]] [11 22 33] 11 NumpyArrary: [[ 1 2 3] [ 1 1 1] [11 22 33]] NewArrary: [[ 1 2 3 1] [ 1 1 1 2] [11 22 33 3]] DelArrary: [[ 1 3 1] [ 1 1 2] [11 33 3]] [[1 2 3 1] [1 1 1 2] [0 0 0 0]] '''
3. 数据结构类型
线性结构: 数据结构中每个元素按照熟悉怒进行排序,除了第一个元素之外,每个元素都有唯一个前驱,除了最后一个元素,每个成员都有唯一后继(购物车清单,排队系统)
层级结构:这类结构相当于一颗颠倒过来的树。除了最顶端的第一项,每个数据项都具有一个前驱-可称为父亲,但是这个数据项可以具备多个后继项-可称为孩子,应用:磁盘文件管理系统
图:每一项都可能有前驱或后继: 地图软件、路网系统或电网系统
无序集合:数据结构中成员无特定顺序-set()
4. 算法复杂度分析
算法评估标准
- 正确
- 良好可读性、可维护性
- 运算时间
- 空间占用-内存
时间度量算法
import time limitNum = 1000 print('%12s%16s'%('运算规模','执行时间')) for count in range(5): startTime = time.time() work = 1 for x in range(limitNum): # work+=1 # work-=1 for y in range(limitNum): work+=1 work-=1 stepTime = time.time() - startTime print('%12d%16f'%(limitNum, stepTime)) limitNum**=2
运算规模翻倍后,执行时间也会翻倍
- 降低时间复杂度,通过增加运算规模来(进程、线程并发)
- 搭建高性能服务器:cpu、内存
复杂度表示方法:大O表示法
- 使用Of(n)
- n: 算法大小
- f(n): 要解决问题所需的工作量
4.1 时间复杂度
# O(1) print('hello world!') print('hello world!') print('hello world!') # O(n) for i in range(n): print('hello world!') # O(n**2) for i in range(n): for j in range(n): print('hello world!') # O(n**3) for i in range(n): for j in range(n): for k in range(n): print('hello world!') ''' 几次循环就是n的几次方时间复杂度 '''
n = 64 while n>1: print(n) n = n//2 ''' 2**6 = 64, log2 64 == 6, 所以循环减半时间复杂度O(log2 n) 或 O(logn) '''
常见时间复杂度排序
O(1)<O(log n)< O(n)<O(nlog n)<O(n**2)<O(n**2log n)< O(n**3)
4.2 空间复杂度
空间复杂度
用来评估算法内存占用大小公式
a = 'python' # 空间复杂度1 # 空间复杂度为1的例子 b = 'PHP' c = 'Java' num = [1,2,3,4,5] # 空间复杂度5 # 空间复杂度 5*4 num = [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]] # 空间复杂度 3*2*2 num = [[[1,2][1,2]],[[1,2][1,2]],[[1,2][1,2]]] # 定义一个或多个变量空间复杂度为1,列表的空间复杂度为列表长度
练习:
- 使用random模块生成整数(0-100),列表randomList 存放20个元素
- 升序输出列表
def genList(L, num, min,max): for i in range(num): L.append(random.randint(min,max)) return L
5. 常见排序
比较排序
- 在没有排序的序列中找到最小或最大的元素,存放到序列的起始位置
- 再从剩余部分序列中继续寻找最小值或最大值,以此类推
def orderCmp(L): pass L = [] orderCmp(genList(L,20,0,100)) # 从现有列表中找到最大值 List = [1,10,9,2,3] # 列表的第一位存放整个列表中最大的元素 for i in range(1, len(List)): if List[0]<List[i]: List[0],List[i] = List[i],List[0] print(List[0])
# 列表的第一位存放整个列表中最大的元素 def orderCmp(List): for j in range(len(List)-1): for i in range(j+1, len(List)): if List[j]< List[i]: List[j],List[i] = List[i],List[j] return List if __name__ == '__main__': List = [1, 10, 9, 2, 3] print(orderCmp(List))
- 冒泡排序
冒泡
- 重复的遍历序列,一次完成相邻两个元素的比较,如果不符合规则-进行位置交换
- 遍历这个序列直到没有元素可以进行交换代表冒泡排序完成。
Lis = [1,10,9,2,3] # 第一轮排序:第一个值 第二个值。 比较较大值-放到序列最后位置 List[0],List[1] #不重新排序 List[1],List[2] #颠倒次序 .... for i in range(len(lis)): for j in range(len(lis)-i-1): if lis[j]>lis[j+1]: lis[j],lis[j+1]=lis[j+1],lis[j] print(lis)
:
List = [1, 10, 9, 2, 3] print(orderCmp(List))
- 冒泡排序
冒泡
- 重复的遍历序列,一次完成相邻两个元素的比较,如果不符合规则-进行位置交换
- 遍历这个序列直到没有元素可以进行交换代表冒泡排序完成。
Lis = [1,10,9,2,3] # 第一轮排序:第一个值 第二个值。 比较较大值-放到序列最后位置 List[0],List[1] #不重新排序 List[1],List[2] #颠倒次序 .... for i in range(len(lis)): for j in range(len(lis)-i-1): if lis[j]>lis[j+1]: lis[j],lis[j+1]=lis[j+1],lis[j] print(lis)