最小生成树算法和最短路径算法有什么区别?
在我的数据结构课程中,我们介绍了两种最小生成树算法(Prim和Kruskal)和一种最短路径算法(Dijkstra)。
最小生成树是图形中跨越所有顶点的树,并且树的总权重最小。最短路径很明显,它是从一个顶点到另一个顶点的最短路径。
我不明白的是,由于最小生成树的总权重最小,树中的路径不是最短的路径吗?有人可以解释我所缺少的吗?
任何帮助表示赞赏。
最小生成树算法和最短路径算法有什么区别?
在我的数据结构课程中,我们介绍了两种最小生成树算法(Prim和Kruskal)和一种最短路径算法(Dijkstra)。
最小生成树是图形中跨越所有顶点的树,并且树的总权重最小。最短路径很明显,它是从一个顶点到另一个顶点的最短路径。
我不明白的是,由于最小生成树的总权重最小,树中的路径不是最短的路径吗?有人可以解释我所缺少的吗?
任何帮助表示赞赏。
Answers:
考虑具有单位权重的三角形图-它具有三个顶点,并且所有三个边权重为。两个顶点之间的最短路径是直接路径,但是如果将所有两个顶点放在一起,则会得到一个三角形而不是一棵树。两个边的每个集合都在该图中形成最小的生成树,但是(例如)如果选择,那么您会错过最短路径。
总之,如果将所有最短路径放在一起,则不一定会得到一棵树。
没错,Dijkstra(从单个起始节点开始的最短路径)和Prim(从给定节点开始的最小权重生成树)的两种算法具有非常相似的结构。它们既贪婪(从当前角度出发,占据最佳优势),又在图上建立一棵树。
但是,它们最小化的值是不同的。Dijkstra选择从树中引出到尚未选择到最接近起始节点的节点的下一条边缘。(然后使用此选择,将重新计算距离。)Prim选择了到目前为止构建的树中最短的一个作为边缘。因此,两种算法都选择了“最小边缘”。主要区别在于选择的值最小。对于Dijkstra来说,它是从起始节点到候选节点的完整路径的长度,对于Prim而言,它只是那条单边的权重。
要了解差异,您应该尝试构建一些示例以了解会发生什么,这确实很有启发性。显示不同行为的最简单示例是三角形,其边缘和 的长度为2,而 长度为1。 Dijkstra将选择 和 (给出两个长度为2的路径),而Prim选择 和(给出重量3)。
至于Kruskal,则略有不同。它解决了最小生成树的问题,但是在执行过程中,它选择的边缘可能不会形成一棵树,它们只是避免了循环。因此,部分解决方案可能会断开连接。最后,您会得到一棵树。
尽管最小生成树算法和最短路径算法的计算看起来相似,但它们专注于2个不同的要求。
在MST中,要求到达每个顶点一次(创建图树),并且达到所有顶点的总(集体)成本在所有可能的组合中必须最小。
在最短路径中,要求以最低的成本(最短的权重)从源顶点到达目标顶点。因此,这里我们不必担心到达每个顶点,而只关注源顶点和目标顶点,这就是区别所在。
这是说明为什么MST不一定在2个顶点之间给出最短路径的示例。
(A)----5---(B)----5---(C)
| |
|----------7----------|
在MST情况下,边缘AB。BC将使用MST,总重量为10。因此,在MST中达到A到C的成本为10。
但是在最短路径的情况下,A到C之间的最短路径是AC,即7。AC从未处于MST上。
展示差异的实用示例>
假设您乘火车到达城镇,并想到达酒店。
选项1:乘坐出租车:从车站到酒店,出租车将以最短的路线行驶。驾驶员是否应沿着以车站为中心的最短路径树走。
选项2:乘公共汽车。公交公司想迎合可能的人,而不仅仅是您。理想的道路将覆盖该镇的所有关键点。因此它将沿着最小生成树遵循(*)路径。这就是公交车速度较慢的原因,但由于费用分摊,所以价格便宜。
(*)实际上,如果使用最小的生成树,人们会抱怨(公交车路程太长)。因此,在实践中这将是一个混合解决方案,并且将使用Alpha-Tree(最小生成树和最短路径树之间的半路)。