虽然大多数问题都是基于相似性(pidgeonholes)对节点进行分组,但我想基于它们的接近程度对节点进行分组。
我有一个庞大而密集的节点集合 - 可能有数百万。在屏幕上他们占用了一些空间,所以他们可以被认为是有一个大小。
我要做的是将这些节点有效地分组到单个包含节点中,包括处理时间以及每个容器收集更多节点。
我当前的尝试要么太慢,要么不起作用,但都是基于我想到的相同解决方案:通过随机获取节点及其周围的节点来计算大量可能的容器并进行分组他们,然后选择最有效的容器。
你有什么想法,不是用任何语言,但我将使用PHP或JavaScript。
Edit
我忘了提到节点将被流入,所以它需要接受无限的节点,在它们到来时将它们放入容器中,创建新的容器,甚至在必要时删除它们,最多可容纳数百万个容器。那将是最理想的。
答案 0 :(得分:1)
此问题称为群集。您有一组节点和一个函数m
,用于计算任意两个节点之间的距离。您现在搜索群集,以便每个群集内所有节点之间的所有距离之和最小。
有一些简单的算法可以做到这一点。例如,搜索k-Means
和k-Medoid
。这两个与你的方法非常相似。更有效的版本是CLARANS
算法[NH94]。我找不到任何好的消息来源,但是你去了:
(德语)关于聚类的一般脚本。第45页的伪代码中包含CLARANS http://www.informatik.hu-berlin.de/forschung/gebiete/wbi/teaching/archive/ws1112/vl_datawarehousing/15_clustering_12.pdf
解释CLARANS的英文脚本 http://bib.dbvis.de/uploadedFiles/232.pdf
关于CLARANS的论文 http://www.comp.nus.edu.sg/~atung/publication/pakdd002.pdf
名称中的“k”是簇的数量。对于这3种算法,您必须先验地指定簇的数量。
有关其他方法,请参阅DBSCAN算法。您不需要此算法的群集数量,但您必须提供有关节点的其他一些知识。维基百科文章很好地解释了这一点。 : - )