文章目录
哈希表构造散列表
- 线性探测法
通过表达式依次进行计算,如果碰到冲突,则往后顺延一位(如果是最后一位往后移,则回到第0位)
- 二次探测法
如果碰到冲突,1, -1, 22, -22, 33, -33……在冲突的位置的两边交替的搜索。
- 双散列法
如果有冲突,则根据另一个哈希函数(rehash)来计算偏移,加上偏移如果还是冲突,则偏移翻一倍
最小生成树算法
- 没有环
- 连接图结构中的所有顶点,任意两个顶点之间都是互通的
- n 个顶点,n-1条边
Kruskal (克鲁斯卡尔)
思想:将所有边按照权重从小到大排序,依次选择权重最小的边(不能与其他已经选好的边形成环,如果成环,则舍去这条边,选择下一条边)当边的数量达到顶点数n-1时,结束选择,此时的树就是最小生成树。
Prim(普里姆)
普里姆算法也是采取贪心算法的思想,与克鲁斯卡尔算法不一样的是,它是从任意指定的顶点开始,比如说0开始,然后找出其他与 0 连接最小的边 4 ,与之连接的 1 顶点加入,然后再从剩下的顶点中找与[0, 1]连接权重最小的边,然后进行连接,依此类推……
分别创建三个列表
select 用来储存该顶点是否被选取
minDist 表示连接该顶点到已选顶点集合中的边中权值最小的那条边的大小
parent 表示待顶点的父亲节点
过程:
以顶点 0 为起点,循环执行下面3个步骤,直到所有顶点都被选取
- Update
每加入一个新的顶点,更新与该顶点相连的所有顶点的列表信息 - Scan
扫描 minDist 列表,找出权值最小的连接边 - Add
添加上一步找到的最小权值边的顶点到已选顶点集合中,然后以该顶点为目标顶点重复第一步的操作
最短路径算法
Dijkstra(迪杰斯特拉)
视频教程
找出某个点到其他所有点的最小路径
思路:假设从 0 出发,找出路径最小的点 1,然后将该点设置为已经找到最小值,然后根据新加入的点更新未加入的点的最小路径,然后将路径值最小的点设置成找到了最小值……依次类推,直到所有点都找到了最小路径。
Floyd(弗洛伊德)
找到图中任意两点之间的最短路径
视频教程
思路:用一个n * n 的矩阵记录点与点之间的最小边的权值,如果没有边,则记录为∞
然后在点之间依次加入所有点,在插入点之后路径如果更小则矩阵,当所有点都插入结束后得到的矩阵就记录了所有点与点之间的最短路径。
平衡二叉树
定义:
- 二叉排序树
- 满足每个结点的平衡因子绝对值不大于1
调整最小不平衡二叉树
-
LL (右旋)
-
RR(左旋)
-
LR(先左旋再右旋)
-
RL(先右旋再左旋)
五叉查找树
B & B+ 树
B 树
B+ 树
红黑树
算法动态演示网站
红黑树的性质:
插入的都是红色结点(因为红色节点可能会破坏上面的规则相对要少)
平衡修复策略
根据下面的情况进行调整,直到满足性质为止
变化后
变化后:
变化后: