8. 算法与数据结构
8.1 排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 堆排序
8.2 查找算法
- 遍历查找
- 二分查找
- 二叉树查找
- 红黑树查找
- 跳表查找
8.3 拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
- 在有向图中选一个没有前驱的顶点并且输出
- 从图中删除该顶点和它相连的边
- 重复上述两步,直至所有顶点输出。
8.4 红黑树
普通红黑树过于复杂,这里采用一种比较简单的左倾红黑树,定义略有不同,实现效果更好。
规定:
- 所有红链接均为左链接
- 没有任何一个结点连着两个红链接
- 该树是完美黑色平衡的
操作:
- 插入结点的链接颜色均为红色
- 如果右结点链接为红色,左旋转
- 如果左节点和左左节点链接均为红色,右旋转
- 如果同层左右结点链接均为红色,它们同时变黑,父节点变红色
- 根结点永远设置为黑色,如果由红变黑一次,说明树的高度增加
8.5 动态规划
动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
- 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
- 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
- 有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)
8.6 搜索算法
8.6.1 深度优先搜索
深度优先搜索是从一个点开始,标记所有与之相邻的点,然后选择其中的一个进行遍历重复上一步,这样遍历的点相对于原点的距离越来越大,直到不能遍历为止,退回到上一个节点,再遍历上一个节点的其他节点。
8.6.2 广度优先搜索
广度优先搜索是先遍历开始节点的所有节点,再根据所有节点遍历下一层的所有节点,一层层进行遍历。