Algorithm 针对已知边权重优化的Prim算法?

Algorithm 针对已知边权重优化的Prim算法?,algorithm,prims-algorithm,Algorithm,Prims Algorithm,在已知任何给定权重的最小值的情况下,如何修改prim算法?例如,如果一个图由边权重0和1组成,如何使prim的算法更快?第一个策略似乎是改进优先级队列以利用数据。如果您知道权重是小于某些C的离散值,那么可以用基数堆替换通常使用的二进制堆。通过这种方式,您可以轻松获得与更难实现的斐波那契堆相同的算法复杂性,甚至可能更好。Dijkstra的算法使用完全相同的数据结构,下面是如何为其实现基数堆的详细说明: 示例代码radixheap.cpp可在此处找到: 您可以简单地将相同的数据结构应用于Prim

在已知任何给定权重的最小值的情况下,如何修改prim算法?例如,如果一个图由边权重0和1组成,如何使prim的算法更快?

第一个策略似乎是改进优先级队列以利用数据。如果您知道权重是小于某些C的离散值,那么可以用基数堆替换通常使用的二进制堆。通过这种方式,您可以轻松获得与更难实现的斐波那契堆相同的算法复杂性,甚至可能更好。Dijkstra的算法使用完全相同的数据结构,下面是如何为其实现基数堆的详细说明:

示例代码radixheap.cpp可在此处找到:

您可以简单地将相同的数据结构应用于Prim的算法,就像文本为Dijkstra的算法所解释的那样,以获得复杂性O(m+n log C),其中m是边,n是顶点,C是最大边权重。如果你的边权重只是一个小整数,这是非常好的

为了总结基数堆的思想,项根据优先级(必须是整数)放置在桶中。bucket N所涵盖的值范围大约为2^N,因此找到正确的bucket与最大可能数的对数成正比。提取优先级最低的项目时,项目有时会重新分配到较低的存储桶中,这也会导致对数复杂度

如果您的意思是边权重是介于0和1之间的任意浮点数,则不允许进行任何优化。显然,任何图形都可以通过将所有边权重除以最大边权重进行变换,使它们都在0和1之间。这种转换不可能使Prim的算法运行得更快。您可以通过向所有边添加相同的数字或将它们与相同的正数相乘来变换所有边,而完全不改变结果。

->?