Prim-and-Kruskal/gpt/conception.md
2024-12-16 16:42:11 +08:00

49 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### **算法基本思想**
#### **Prim 算法**
Prim 算法是一种贪心策略构建最小生成树的方法。
- **核心思想**
从任意一个顶点开始,逐步将权值最小的边加入生成树,同时保证生成树不会形成环。
- **步骤**
1. 初始化一个集合 `MST`,用于存储已包含在生成树中的顶点。
2. 从起始顶点出发,将所有与之相连的边放入一个优先队列(最小堆)。
3. 每次从优先队列中取出权值最小的边,若该边的目标顶点不在 `MST` 中,则将该顶点加入 `MST`,并将与该顶点相连的边加入优先队列。
4. 重复此过程,直到所有顶点都包含在生成树中。
- **时间复杂度**
- 使用邻接矩阵:\( O(V^2) \)
适用于稠密图。
- 使用邻接表+最小堆:\( O(E \log V) \)
适用于稀疏图,其中 \( V \) 是顶点数,\( E \) 是边数。
---
#### **Kruskal 算法**
Kruskal 算法是一种基于边的贪心策略构建最小生成树的方法。
- **核心思想**
按照权值从小到大排序所有边,然后逐步选取不形成环的边,直到构建出最小生成树。
- **步骤**
1. 将所有边按照权值从小到大排序。
2. 初始化一个并查集,用于判断两个顶点是否属于同一连通分量。
3. 从权值最小的边开始,依次检查该边是否会形成环:
- 如果不会形成环(即边的两个顶点不在同一集合中),将该边加入生成树,并合并两个顶点所属的集合。
- 否则,跳过该边。
4. 重复此过程,直到生成树包含 \( V-1 \) 条边。
- **时间复杂度**
- 边排序:\( O(E \log E) \),因为需要对所有边进行排序。
- 并查集操作:近似 \( O(E \log V) \),其中查找和合并操作效率很高(接近常数时间)。
- 总时间复杂度:\( O(E \log E + E \log V) \)。由于 \( E \log E \geq E \log V \),可以简化为 \( O(E \log E) \)。
---
### **算法比较**
| **算法** | **适用场景** | **时间复杂度** | **特点** |
|-----------------|-------------------------------|-------------------------|--------------------------------------------------------------------------|
| **Prim 算法** | 稠密图,适合用邻接矩阵 | \( O(V^2) \) 或 \( O(E \log V) \) | 基于顶点,逐步扩展生成树;实现相对简单,适合稠密图时直接用邻接矩阵表示。 |
| **Kruskal 算法**| 稀疏图,适合用边列表 | \( O(E \log E) \) | 基于边,灵活性更高;需要先排序所有边,适合稀疏图。 |
两种算法在不同场景下都可用,但通常 **Prim 更适合稠密图Kruskal 更适合稀疏图**