我想知道当有少量权重时,是否有人可以指向线性时间算法来找到图的MST(即边缘只能有2个不同的权重)。
除了Prim's,Kruskal's,Boruvka之外,我在google上找不到任何东西,其中似乎没有任何属性会减少这种特殊情况下的运行时间。我猜测它是线性时间,它必须对BFS进行某种修改(当权重均匀时找到MST)。
答案 0 :(得分:4)
Prim lg V
运行时中O(V lg V)
因子的原因是用于查找下一个候选边的堆。我非常确定可以设计一个优先级队列,在有可能的权重数量有限的情况下,在恒定时间内插入和删除,这会将Prim减少到O(V)
。
对于优先级队列,我相信它足以满足一个数组,其索引涵盖所有可能的权重,其中每个元素指向包含具有该权重的元素的链表。你仍然有一个因子d
(不同权重的数量),用于确定哪个列表可以获得下一个元素("最低"非空元素),但如果d
是常数,那么你就没事了。
答案 1 :(得分:1)
阐述Aasmund Eldhuset的答案:如果MST中的权重被限制在0,1,2,3,...,U-1范围内的数字,那么你可以调整许多现有算法来运行(近)线性时间,如果U是常数。
例如,让我们采用Kruskal的算法。 Kruskal算法的第一步是将边缘按重量的升序排序。如果使用计数排序或时间O(m lg U),如果使用基数排序,则可以在时间O(m + U)中执行此操作。如果U是常数,则这两个排序步骤都需要线性时间。因此,在这种情况下运行Kruskal算法的运行时间为O(mα(m)),其中α(m)是逆Ackermann函数,因为限制因子将是维持不相交森林的运行时间
或者,看看Prim的算法。您需要维护到节点的候选距离的优先级队列。如果您知道所有边都在[0,U)范围内,那么您可以通过存储U桶数组(每个可能的优先级一个)以超级天真的方式执行此操作。插入优先级队列只需要将项目转储到正确的存储桶中。您可以通过逐出元素并将其移动到较低的存储桶来执行减少键。然后,您可以通过扫描存储桶来执行查找。这会导致算法运行时为O(m + nU),如果U是常数,则为线性。