有效地检查哪些大型节点集合在一起?

时间:2013-09-22 19:43:54

标签: algorithm graph-theory

我目前对生成随机几何图感兴趣。对于我的特定问题,我们将节点v随机地放在单位平方中,如果它们有Euclidean distance< = D,则从v添加到节点u的边,其中D = D(u,n)随u而变化图中节点数n。

重点:

  • 计算D代价很高,所以我想尽量减少对此功能的调用次数。

  • 绝大多数情况下,当添加v时,边缘uv将仅添加到少量节点u(通常为0或1)。

  

问题:检查哪些顶点与v“足够接近”的有效方法是什么?

强力算法是计算和比较所有现存节点u的dist(v,u)和D(u,n)。这需要对D进行O(n 2 )调用。

我觉得我们应该做得比这更好。也许某种分类可行。我们可以将空间划分为二进制位,然后对于每个顶点u,我们存储一个二进制列表,其中新放置的顶点v可能导致边缘uv。如果v最终放在你的箱子列表之外(这应该在大多数时间里发生),那么它太遥远了,我们不需要计算D.这有点偏离 - 我的头脑的建议,我不知道它是否运作良好(例如,计算足够紧密的垃圾箱会产生开销,这可能成本太高),所以我会反馈。

2 个答案:

答案 0 :(得分:2)

根据您对问题的描述,我会选择R-tree作为您的数据结构。

它允许通过缩小您需要大幅运行D所需的顶点集来进行非常快速的搜索。但是,在最坏情况下插入时,需要O(n)时间。值得庆幸的是,您不太可能使用典型数据集进行最坏情况插入。

答案 1 :(得分:2)

我可能只是使用分箱方法。

假设我们在m x m个子方格中切割单位平方(当然每个边长都为1/m)。由于您将顶点均匀地随机放置(或者我假设),每个方格平均包含n / m^2个顶点。

根据A1A2mn,您可以确定需要检查的最大半径。假设小于m。然后,在插入v之后,您需要检查它所在的方格以及所有相邻的方格。无论如何,这是一个恒定的平方数,因此对于每次插入,您需要平均检查O(n / m^2)个其他顶点。

我不知道m的最佳价值(如上所述,这取决于A1A2),但是说它会是sqrt(n),那么你的整个算法可以在O(n)预期的时间内运行。

EDIT 一个小小的补充:您可以跟踪具有许多邻居的顶点(因此具有高半径,其在多个正方形上延伸)并且针对每个插入的顶点检查它们。应该只有很少,所以没问题。