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
2
3
4
5
6
7
8
9
10
11
12
13
    A
/ \
1 2
/ \
B---2---C
| |
1 3
| |
D---2---E
|
1
|
F

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
2
3
4
5
6
7
8
0 | 4 2 7 6 1 3 5
0 4 | 2 7 6 1 3 5
0 2 4 | 7 6 1 3 5
0 2 4 7 | 6 1 3 5
0 2 4 6 7 | 1 3 5
0 1 2 4 6 7 | 3 5
0 1 2 3 4 6 7 | 5
0 1 2 3 4 5 6 7 |

3.2 选择排序

步骤:

1
2
3
4
5
6
7
8
0 | 4 2 7 6 1 3 5
0 1 | 2 7 6 4 3 5
0 1 2 | 7 6 4 3 5
0 1 2 3 | 6 4 7 5
0 1 2 3 4 | 6 7 5
0 1 2 3 4 5 | 7 6
0 1 2 3 4 5 6 | 7
0 1 2 3 4 5 6 7 |

3.3 归并排序

步骤:

1
2
3
4
0 4 2 7 6 1 3 5
0 4 | 2 7 | 6 1 | 3 5
0 2 4 | 7 | 1 6 | 3 5
0 1 2 3 4 5 6 7

3.4 堆排序

步骤:

  • 初始数组:0, 6, 2, 7, 4
  • 形成有效的堆:
1
2
3
4
5
   7
/ \
6 2
/ \
0 4
  • 删除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算法可找出图的最小生成树,不同方法可能产生不同的树。
  • 排序算法:插入、选择、归并和堆排序展示了不同的排序策略与实现步骤。