文章目录
-
- 前言
- 参考目录
- 学习笔记
-
- 1:介绍
- 1.1:定义
- 1.2:应用
- 2:贪心算法 greedy algorithm
- 2.1:简化假设
- 2.2:切分定理
- 2.3:demo 演示
- 2.4:贪心算法的证明
- 2.5:算法实现简要说明
- 2.6:删除简化假设
- 3:加权边 API
- 3.1:加权边 API (Weighted edge API)
- 3.2:Java 实现
- 3.3:加权无向图的API(Edge-weighted graph API)
- 3.4:Java 实现
- 4:Kruskal 算法
- 4.1:demo 演示
- 4.2:证明
- 4.3:Java 实现
- 4.4:运行时间
- 5:Prim 算法
- 5.1:demo 演示
- 5.2:证明
- 5.3:实现:延迟实现 (lazy implementation)
- 5.3.1:demo 演示
- 5.3.2:Java 实现
- 5.3.3:运行时间
- 5.4:实现:即时实现(eager implementation)
- 5.4.1:demo 演示
- 5.4.2:索引优先队列(Indexed priority queue)
- 5.4.3:运行时间
前言
本篇主要内容包括:贪心算法、加权边 API、Kruskal 算法 以及 Prim 算法。
参考目录
- B站 普林斯顿大学《Algorithms》视频课
(请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。) - 微信读书《算法(第4版)》
(本文主要内容来自《4.3 最小生成树》) - 官方网站
(有书本配套的内容以及代码)
学习笔记
注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。
开篇语:
Today, we’re gonna talk about minimum spanning trees. This is a terrific topic for this course, because it combines a number of classic algorithms with modern data structures to solve a variety of huge problems that are important in practical applications nowadays.
今天,我们要讨论的是最小生成树这一主题,这对于本课程而言是一个绝佳的话题,因为它结合了多种经典算法以及现代数据结构,用于解决当今实际应用中一系列规模庞大且重要的问题。
1:介绍
1.1:定义
定义: 一个图 G 的生成树 T 是指这样一个子图:
- 连通的(Connected):从任一顶点出发可以到达其他所有顶点。
- 无环的(Acyclic):不存在任何闭合的回路。
- 包含所有顶点(Includes all of the vertices):图 G 中的每一个顶点都在生成树 T 中。
1.2:应用
最小生成树(MST)问题是具有广泛实际应用的基础问题,包括但不限于以下几个方面:
- 颗粒化(Dithering)技术。
- 聚类分析(Cluster analysis)。
- 最大瓶颈路径(Max bottleneck paths)问题求解。
- 实时人脸识别验证(Real-time face verification)算法。
- 采用低密度奇偶校验码(LDPC codes)进行错误校正。
- 利用 Rényi 熵进行图像配准(Image registration)。
- 在卫星和航空影像中寻找道路网络(Find road networks)。
- 在蛋白质氨基酸序列测定中减少数据存储量。
- 模拟湍流流体中粒子相互作用的局部性(Model locality of particle interactions in turbulent fluid flows)。
- 以太网桥接自配置协议(Autoconfig protocol)避免网络中形成环路。
- 近似算法用于解决NP难问题(例如,旅行商问题[TSP],Steiner树问题)。
- 各种网络设计(包括通信网络、电力网络、液压网络、计算机网络、道路交通网络等)。
2:贪心算法 greedy algorithm
2.1:简化假设
2.2:切分定理
(这一部分参照书里面的内容)
2.3:demo 演示
对应书本命题 K:
初始状态:
切分后:
边 0 - 2 标记为黑色,继续切分:
边 5 - 7 标记为黑色,继续切分:
边 6 - 2 标记为黑色,继续切分:
边 0 - 7 标记为黑色,继续切分:
边 2 - 3 标记为黑色,继续切分: