-
队列
- 循环队列
- 判空:rear == front
- 判满:(rear+1) % size == front
- 非循环队列
- 上溢:rear - front == size
- 下溢:front == rear
- 循环队列
-
栈
- 判空:top == -1 或 top == 0
- 判满:top == size - 1
- 卡特兰数 C(n, 2n) / (n+1)
-
对称、对角、三角、稀疏矩阵的压缩存储:按行存储
-
二叉树
- n个结点可构造几种二叉树:(2n)! / n! * (n+1)!
- 二叉树度为1、2结点关系:n0 = n2 + 1
- 第k层最多2^(k-1)个结点
- 满:深度k,结点2^k - 1,叶子结点都在最底层
- 完全:与满二叉树编号匹配;只能少最后一层右侧的结点
- 完全二叉树,层序:
- i的父结点编号:向下取整(i/2);如3的父结点是1
- i的左孩子节点编号:2i,右孩子编号:2i+1
- 2i > n时无左子结点,即无子节点,即叶子节点
- 哈夫曼编码是前缀码,即前缀不能相同
-
图
- 表示方法
- 邻接矩阵
- 邻接表:出度
- 逆邻接表:入度
- 最小生成树
- 带权、连通、无向
- 最小生成树不唯一,权值加和唯一
- 方法:
- Prim
- 选点V
-
- 时间复杂度O(V^2)
- 适合边稠密
- 贪心,类似迪杰斯特拉,两个表(+lowCost)
- Kruskal
- 选边E
- 时间复杂度O(Elog2E)
- 适合边稀疏
- Prim
- 最短路径
- Dijkstra
- 单源:某点到其他点的最短距离
- 不能有负值
- 贪心
- 类似Prim,两个表
- Floyd
- 多源:一次性算出所有点之间最短距离
- map[i][j]=min(map[i][j],map[i][k]+map[k][j]),// i到j的最短距离,k为中转点
- 动态规划
- 代码简单,三层循环
- Dijkstra
- AOV
- 求拓扑排序
- 活动在点上
- AOE
- 求关键路径
- 活动在边上,边权值表示活动时间
- 极小连通子图=生成树,极大连通子图=连通分量
- 回路判断:
- 判断有向图是否存在回路:
- DFS:是否出现后向边
- BFS:?
- BFS+DFS?
- 邻接表?
- 判断无向图是否存在回路:
- 拓扑排序
- DFS:出现后向边=有回路
- 判断有向图是否存在回路:
- 表示方法
-
排序
名称 适用情况 特点 插入 规模小、基本有序 大段移动 选择 规模小 不稳定(5 8 5 2 9) 泡排 基本有序(带优化的) 带优化 快排 规模大、随机 挖坑互填 堆排 规模大、随机 完全二叉树、特殊的选择排序、升序用大根堆、根结点与最后一个孩子结点交换 归并 总体无序、各子项相对有序 求逆序数 希尔 数据量小 缩小增量法 基数 "吉祥物" 用于整数;按位比较;需要空间多 总结:4个稳定:插泡归基
Floyd适合含有负权和回路的带权图,但不适合回路加和为- 时间复杂度与边无关,都是O(n^3)
中缀->后缀:
- 数字直接输出
- 左括号直接入栈
- 右括号:计算符出栈,直到左括号
- 计算符入栈前,大的压住小的才能入栈,否则出栈
递归方程求解方法:迭代法、递归树、主方法、代入法——“地主迭代”