大约一年前,我和一个朋友想出了一种方法,可以比通常的边界(不假设预先排序的边缘)更好地实现Kruskal算法用于密集图。具体来说,我们在所有情况下都实现,与使用邻接矩阵实现时的Prim相似。
我已经发布了一些关于该算法在我的博客,包括C ++代码和基准,但这里的总体思路:
为每个连接的组件维护一个代表性节点。最初,所有节点都代表自己。
保持向量
dist[i]
,以使每个分量的i
入射角最轻i
。找到跨分区的最轻的边缘时,只需找到在线性时间内
i
使的权重最小的方法即可dist[i]
。连接两个组件和,修改邻接矩阵,使所有组件k的并标记i不再代表其连接的组件(现在仅保留j)。
因此,最轻的边缘的收缩和所述边缘的发现都可以在线性时间内完成。我们执行次以找到MST。需要一点记账才能真正找到我们要添加到MST的哪个边,但不会增加复杂性。因此,运行时为。该实现只是几个for循环。
此版本的Kruskal在文学中是否广为人知?