基本结构
0.线性结构几种典型:数据项之间只存在先后的次序关系
栈---stack
队列---queue
双端队列---deque
列表---list
无序表:仅有相对位置
有序表:按照一定顺序存放,如大小顺序
1.栈(stack)---FILO先进后出
只允许在栈顶操作
用python最基本的数据类型(列表,字典)的列表就可以实现栈结构
栈的应用:
1.括号匹配
2.十进制转二进制
公式表示法:前缀 中缀 后缀post_fix
实际上计算机中使用的不是按照操作优先级的顺序的数学中的中缀式,一般使用的是是前缀。
3.
表达式转换:中缀in_fix---->前缀pre-fix
后缀表达式求值
2.队列queue----先进先出FIFO
仅有一个入口,一个出口
应用:
1.打印机等待
2.键盘IO缓冲区
3.双端队列Deque:
本质:两端都可以插入和弹出,集成了栈和队列的性质
应用:回文词判定
回文词:正序反序相同,如“上海自来水来自海上”
4.列表
无序表和有序表
实现方式:链表---助于高效利用内存
递归
分治策略与递归调用:
缩小规模,分而治之
递归调用的实现:三定律
1.必须具备基本结束条件
2.必须要减小规模,改变状态,向基本结束条件演进
3.递归算法必须调用自身
递归的应用
贪心策略与优化问题:
动态规划
应用:找零问题
1.动态规划解法
2.递归解法
排序与查找
1.各种排序查找算法:
二分,
冒泡,
插入,
希尔,
归并,
快排
2.散列函数及冲突解决
树 Tree
数据处理的永恒主题:
快速保存
高效查找
递归算法在树及图中都有广泛应用
树的嵌套列表实现
树的应用:
解析树
* 编译生成目标代码
* 表达式解析
树的遍历:
前序
中序
后序
优先队列和二叉堆
优先队列的应用:设置操作系统调度进程的优先级
优先队列的定义:
出队:和普通队列相同,队首出队
入队:按照数据的优先级,优先级越高排在数据越前面。
性质:入队O(1),出队O(n)
用二叉堆实现优先队列,降低算法复杂度,入队和出队复杂度都在O(log n)
二叉堆heap:基于非嵌套列表实现
二叉查找树binery search tree---BST
在各种插入等操作后依然能保持树的平衡很重要,能够提升查找等算法的性能。
因此下面讨论,如何维持平衡。
AVL树(平衡二叉树):所有节点的平衡因子都在-1,0,1之间。
平衡因子balance-factor:左右子树的高度差
可以将增删改查复杂度保持在O(log n)
散列表:O(1)--->O(n)
一般来说要求不高可以用散列表,其次是AVL树来优化。
图 Graph
图的实际存在:
社交网络
互联网计算机通信
交通路线
互联网的网页节点
6度关系理论,社交28原则---关系图保证了社交网络的6度关系的成立
图的组成:
Vertex(Node)
Edge(Arch):边的定义---顶点和顶点之间的连接,一般用Edge:(Node1,Node2,weight)定义
权重weight:边的属性,即代价。
图的定义:G = (V,E)
路径Path:无权路径算是1,有权路径就是所有边的权之和
圈(环):Cycle
路径首尾顶点相同的路径,如(v1,v3,v4,v1)
如果有向图中不含环,则称为“有向无环图”:Directed acyclic graph:DAG
如果一个问题能表示成DAG,就可以用图算法很好的解决(实质上树就是一种特殊的有向无环图)
抽象数据类型 ADT:图的实现
1.邻接矩阵
表示图中所有顶点的连接关系
类似协方差矩阵那样,如果顶点有边相连则赋予行列值(1或权值),否则为0
优点:实现简单
缺点:实际问题大都是稀疏问题---边的数目<<Node^2,导致存储效率低。
2.邻接列表
维护一个所有顶点组成的主列表master-list,然后每个顶点又保存一个元组,元组中是有边相连的顶点和权值。
优点:存储紧凑高效。
每种数据结构都是按照 定义,代码实现,及应用 介绍的。
图的应用:
1.词梯问题
每次只变换1个单词,有哪些路径使单词相同(4个字母单词,共5000多个)
最终,邻接矩阵只有0.2%的连接
广度优先搜素:BFS---实现核心:创建队列存储
每次path路径长度+1
2.骑士周游问题:
8*8棋盘,按马走日的走法刚好走完一次
深度优先搜索:DFS-----实现核心:递归调用
每次都尽可能地将path深入下去,路径长度超出了依然没搜索到,就返回上一层继续深入。每次都尽可能地将path深入下去,路径长度超出了依然没搜索到,就返回上一层继续深入。
首先建图,最终邻接矩阵8.2%,也是稀疏矩阵
改进:
将 先验知识 加入算法改进性能----启发式规则
经常用于AI领域,有效减少搜索范围,更快搜索到目标。
3.通用的深度优先搜索算法
4.拓扑排序
5.强连通分支:
定义:
1.所有顶点之间必须相通,至少是有路径
2.是图的最大的子集
转置图:将图的边的向全部改变
6.最短路径问题:Dijkstra算法---只能处理所有的权>1的图,否则陷入死循环
信息在路由器网络中传播速度的最快路径
边的权:网络负责,网络连接的速度
7.最小生成树
生成树的定义:拥有图中 所有顶点 以及 最少数量的边,以保持连通的子图。(无圈,因为是树)
(代价/权重)最小生成树d的定义:边的 权重之和 最小的生成树。
应用:游戏中消息广播
经典算法:Prim算法---贪心本质
每步都沿着最小权重的边向前搜索。
步骤:
1.所有的可安全添加的边(一端顶点在树中,另一端不在树中,保持树的无环性)
2.遍历上面所有边找到一条权重最小的path
学习一门课程的思路
1.快速过一遍简单的概论课程,建立框架感(第一遍就当概论听)-----知止
2.再学习一门课程以深入课程内容