CS61B 课程笔记(DISC 12 Graphs, Sorting)
CS61B 课程笔记(DISC 12 Graphs, Sorting)
1 Dijkstra’s Algorithm
题目:
对于下图,设 \(g(u, v)\) 为节点 \(u\) 和 \(v\) 之间边的权重。设 \(h(u, v)\) 为任意节点 \(u\) 和 \(v\) 的启发式值。
边权重 | 启发式值 |
---|---|
\(g(A, B) = 1\) | \(h(A, G) = 8\) |
\(g(B, C) = 3\) | \(h(B, G) = 6\) |
\(g(C, F) = 4\) | \(h(C, G) = 5\) |
\(g(C, G) = 4\) | \(h(F, G) = 1\) |
\(g(F, G) = 1\) | \(h(D, G) = 6\) |
\(g(A, D) = 2\) | \(h(E, G) = 3\) |
\(g(D, E) = 3\) | |
\(g(E, G) = 3\) |
1.1 Dijkstra算法的运行
分析:
使用Dijkstra算法找到从A到每个其他顶点的最短路径。可以使用一个优先队列来跟踪当前的距离。
节点 | 当前距离 |
---|---|
A | 0 |
B | 1 |
C | 4 |
D | 2 |
E | 5 |
F | 6 |
G | 7 |
最终结果:
- \(A \rightarrow B = 1\)
- \(A \rightarrow C = 4\)
- \(A \rightarrow D = 2\)
- \(A \rightarrow E = 5\)
- \(A \rightarrow F = 6\)
- \(A \rightarrow G = 7\)
1.2 A*搜索的路径
分析:
A*搜索从A开始,目标为G,返回的路径是 \(A
\rightarrow D \rightarrow E \rightarrow G\)。
1.3 启发式值是否可接受?
分析:
一个启发式值是可接受的,当且仅当它的所有估计值 \(h(x)\)
都是乐观的。这里的启发式不是可接受的,因为从A到G的实际最短路径的成本是7,但启发式估计为8。
2 Graphs & Sorting
2 Minimum Spanning Trees
题目:
给定图的边权重,使用Prim算法和Kruskal算法找到最小生成树。
1 | A |
2.1 使用Prim算法
分析:
选择A作为起始节点。每次处理成本相同的节点时,按字母顺序处理。
最小生成树结果:
- 选边 A - B
- 选边 B - D
- 选边 D - F
- 选边 A - C
- 选边 C - E
2.2 使用Kruskal算法
分析:
Kruskal算法将会输出与Prim算法相同的最小生成树。这并不总是如此。
2.3 MST的数量
分析:
可以找到多个最小生成树。用权重为2的边有3个可替换的选择,用权重为3的边有2个可替换的选择。因此,总共有
\(3 \times 2 = 6\)
种可能的最小生成树。
3 Mechanical Sorting
题目:
对以下无序列表进行排序:0, 4, 2, 7, 6, 1, 3, 5
3.1 插入排序
步骤:
1 | 0 | 4 2 7 6 1 3 5 |
3.2 选择排序
步骤:
1 | 0 | 4 2 7 6 1 3 5 |
3.3 归并排序
步骤:
1 | 0 4 2 7 6 1 3 5 |
3.4 堆排序
步骤:
- 初始数组:0, 6, 2, 7, 4
- 形成有效的堆:
1 | 7 |
- 删除7,调整:
1 | 6 4 2 0 7 |
- 删除6,调整:
1 | 4 0 2 6 7 |
- 删除4,调整:
1 | 2 0 4 6 7 |
- 删除2,调整:
1 | 0 2 4 6 7 |
- 删除0:
1 | 0 2 4 6 7 |
笔记总结
- Dijkstra算法:用于寻找图中各个节点到源节点的最短路径,需借助优先队列。
- **A*搜索**:结合Dijkstra算法和启发式方法,路径选择基于当前成本和启发式估计。
- 最小生成树:使用Prim和Kruskal算法可找出图的最小生成树,不同方法可能产生不同的树。
- 排序算法:插入、选择、归并和堆排序展示了不同的排序策略与实现步骤。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论