数据结构
作者:互联网
1.顺序表
1.顺序表由数组,最后一个元素的位置构成,Last从-1开始
2.堆栈
1.堆栈,由数组,栈的最大规模,栈顶构成,自己写操作集时,可以自己定规则
2.c++自带函数stack
3.二叉树
1.二叉树的遍历可以通过递归函数实现(以前感觉递归函数反人类,现在感觉是真好用啊)
2.遍历也可通过堆栈或队列来实现,今天仅稍作了解,明天学习具体实现过程
3.二叉搜索树 #2020/1/10 15点54分
1.二叉搜索树可以理解为按照特定次序排列的二叉树
2.插入时,通过递归实现,需分是否为空树来插入
3.删除也是用递归来实现,寻找,即遍历,不再描述,删除时,分三类情况判断
1.为叶节点,直接删除
2.仅存在左节点,用左节点取代此节点
3.存在右节点,从有孩子树中找到最小的(可通过FindMin函数实现),取代此节点,并删除右孩子树最小结点 #2020/1/10 15点54分
4.寻找,不再表述,遍历而已
5.理论上,因为他是有序的,所有操作均可不通过递归实现(有待验证)
4.平衡二叉树
1.平衡二叉树的调整多通过递归实现
2.分为左单旋、右单旋,左右双旋,右左双旋
1.左右双旋,右左双旋过于简单,不再描述
2.左单旋:B为A的左枝,第一步,B的右枝给A的左枝;第二步,A去做B的左枝;第三步,返回B的地址;
3.右单旋同理
3.平衡二叉树需要获取树高,当左右两侧树高差大于2,则需调整
4.单旋调整的前提:两次都向同一侧偏
5.双旋调整前提:两次向不同方向偏
4.堆
1.有最大堆,最小堆
2.通常用于求某些数中前多少大/小
3.堆通常用数组储存,核心思想,我认为应该是过滤
4.插入
1.从最后一个元素开始,向上过滤,找小于/大于它的数
2.找到后,将会有一个空出来的位置,插进去
3.0的位置存放不可能的值,以便今后的插入操作(初始化时完成)
5.最大堆的建立实质为先将数乱序存到数组里,再一遍遍过滤
5.哈夫曼树 目前看来 只有在压缩方面可以使用
6.邻接矩阵 用矩阵的形式储存图
7.邻接表 顶点用数组储存,边为链表,链接在顶点的后面(目前看来,仅有拓扑排序时用这种方式好)
8.广搜 用队列 深搜 用栈或者递归
9.最小生成树
1.Prim算法 以某一顶点为起始树,算出每个点到树的距离,连接距离最小的点,更新其他点到树(只需计算未加入的点到新加入的点的距离),重复至所有点都加入
2.Kruskal算法 以邻接表为图,每次选取未连接的点中的最短边加入树,然后舍弃所有与此顶点相连的边, 直到图中所有边选取完或者选取了顶点数量-1的边,如果结束时数量不足,返回false
10.最短路径
1.单源最短路径 以某一顶点为起始,算出每个点到起始点的距离,连接距离最小的点,更新其他点到起始点(只需计算未加入的点到新加入的点的距离),重复至所有点都加入
2.每一对顶点之间的最短距离 弗洛伊德算法 三重循环将邻接矩阵中的每一点,查找能否在两个分量上是否存在更小的距离(实际意义为经由某个点来联通两个点)
11.拓扑排序
1.构造邻接表,并构造出入度数组
2.寻找入度为零的点,加入拓扑数组(自己起的名字,就是存放排好序的数的地方),所有这个点的边所指向的点,入度减一(即删除所有与选取的这个点相连的边)
3.重复至没有入度为零的点,检测点是否全部加入拓扑数组,否则返回false
12.关键路径计算
1.拓扑排序
2.由拓扑排序计算出每条边的最早开始时间(正向)
3.计算出每条边的最晚开始时间(最晚开始时间为从最后一个点开始往前推,后一个点的最晚开始时间减掉自身所花费的时间)
4.最晚时间与最早时间相同的点就是关键点
5.存在的问题,多起点,多终点或者多条关键路径没有办法确定从哪条边开始
13.哈希散列
1.通过对名字等信息通过某种函数变换得到唯一位置
2.冲突可以开放定址或分离链接 我更喜欢分离链接
3.这个东西在考虑安全时 会与信息安全相关联 即加密解密
标签:数组,拓扑,二叉树,单旋,顶点,数据结构,节点 来源: https://www.cnblogs.com/Bunny-a/p/12441576.html