- 二分查找。大O表示法
- 选择排序。数组、链表
- 递归。栈
- 快速排序。分而治之
- 散列表。散列函数、分而治之
- 广度优先搜索。最短路径、队列、图
- 狄克斯特拉算法
- 贪婪算法。背包问题、旅行商问题、NP完全问题、近似算法
- 动态规划。背包问题、最长公共子串
- K最近邻算法。特征抽取、机器学习
- Next。树、反向索引、傅里叶变换、并行算法、线性规划等。
7.狄克斯特拉算法
狄克斯特拉算法找出的是 总权重最小的路径
带权重的图称为加权图(weighted graph),不带权重的图称为非加权图(unweighted graph)
要计算非加权图中的最短路径,可使用广度优先搜索。要计算加权图中的最短路径,可使用狄克斯特拉算法
在无向图中,每条边都是一个环。狄克斯特拉算法只适用于有向无环图(directed acyclicgraph,DAG)
狄克斯特拉算法背后的关键理念:找出图中最便宜的节点,并确保没有到该节点的更便宜的路径
通过沿父节点回溯,便得到了完整的交换路径
最短路径指的并不一定是物理距离,也可能是让某种度量指标最小
如果有负权边,就不能使用狄克斯特拉算法。因为负权边会导致这种算法不管用
海报节点已处理过,这里却更新了它的开销。这是一个危险信号。节点一旦被处理,就意味着没有前往该节点的更便宜途径,但你刚才却找到了前往海报节点的更便宜途径!
狄克斯特拉算法这样假设:对于处理过的海报节点,没有前往该节点的更短路径。 这种假设仅在没有负权边时才成立。因此,不能将狄克斯特拉算法用于包含负权边的图。在包含 负权边的图中,要找出最短路径,可使用另一种算法——贝尔曼福德算法(Bellman-Ford algorithm)
包含四个步骤:
(1)找出“最便宜”的节点。即可在最短时间内到达的节点。
(2)更新该节点的邻居开销。
(3)重复这个过程,直到对图中的每个节点都这样做了。
(4)计算最终路径。
8.贪婪算法
本章内容
学习如何处理不可能完成的任务:没有快速算法的问题(NP完全问题)。
学习识别NP完全问题,以免浪费时间去寻找解决它们的快速算法。
学习近似算法,使用它们可快速找到NP完全问题的近似解。
学习贪婪策略——一种非常简单的问题解决策略。
小结
贪婪算法寻找局部最优解,企图以这种方式获得全局最优解。
对于NP完全问题,还没有找到快速解决方案。
面临NP完全问题时,最佳的做法是使用近似算法。
贪婪算法易于实现、运行速度快,是不错的近似算法。
知识点:
- 贪婪算法
1)贪婪算法的优点:简单易行。每步都采取最优解法。
2)每步都选择 局部最优解