Kruskal算法的密集版本是否众所周知?


15

大约一年前,我和一个朋友想出了一种方法,可以比通常的Ø日志边界(不假设预先排序的边缘)更好地实现Kruskal算法用于密集图。具体来说,我们在所有情况下都实现,与使用邻接矩阵实现时的Prim相似。Θñ2

我已经发布了一些关于该算法在我的博客,包括C ++代码和基准,但这里的总体思路:

  • 为每个连接的组件维护一个代表性节点。最初,所有节点都代表自己。

  • 保持向量dist[i],以使每个分量的i入射角最轻i

  • 找到跨分区的最轻的边缘时,只需找到在线性时间内i使的权重最小的方法即可dist[i]

  • 连接两个组件和,修改邻接矩阵,使所有组件k的并标记i不再代表其连接的组件(现在仅保留j)。C一世CĴ一种一种一世ķ={一种一世ķ一种Ĵķ}ķ一世Ĵ

因此,最轻的边缘的收缩和所述边缘的发现都可以在线性时间内完成。我们执行ñ-1个次以找到MST。需要一点记账才能真正找到我们要添加到MST的哪个边,但不会增加复杂性。因此,运行时为Θñ2。该实现只是几个for循环。

此版本的Kruskal在文学中是否广为人知?

Answers:


19

我不确定用于实现时间的特定方法,但是在我的论文“快速分层聚类和动态最接近对的其他应用中给出了两种在时间执行Kruskal的方法。”(SODA 1998,arXiv:cs.DS / 9912014和J.实验算法2000):Øñ2Øñ2

  1. 改用Prim–Dijkstra–Jarník,然后对边缘进行排序以获得Kruskal会给出的插入序列,或者

  2. 使用本文中描述的四叉树最接近对数据结构,将Kruskal视为标准的聚集性聚类过程,在此过程中,我们将每个步骤中最接近的两个簇合并为一个超级簇,其中“最接近”定义为连接两个簇的最短边的长度。

解决方案2在本质上与您所描述的相似,但是如何跟踪群集之间的距离的细节略有不同。您可以保持簇距离矩阵的逐行最小值,从而允许您在线性时间内扫描此行最小值列表以找到全局最小值,而我的论文将四叉树覆盖在同一矩阵上并跟踪每个矩阵中的最小值四叉树广场。您的方法更简单,但对于其他一些动态最接近的对问题则不太灵活(这取决于以下事实:合并两个聚类会导致它们到其他聚类的距离减小,这个问题确实适用,但其他情况不一定如此)。

正如我在Wikipedia上于2011年写的关于最近邻居链算法的文章中所述,该算法还可以用于在时间内执行Kruskal 。但是(与最近邻居链算法的其他一些应用不同),您没有节省空间,因此(像四叉树方法和您的方法一样)空间仍然是。相反,Prim + sorting仅可以使用 空间来存储输入所需的空间。Øñ2Øñ2Øñ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.