【发布时间】:2017-04-18 21:18:51
【问题描述】:
标题是最大的问题。我有一组圆,每个圆都由中心 C 和半径 r 给出。两个圆之间的距离是它们的中心之间的欧几里得距离减去它们的半径。对于圆 a 和 b,
d_ab = |C_a - C_b| - r_a - r_b。
请注意,如果圆圈重叠,这可能是负数。
那么在集合中找到给定圆的最近(最小距离)邻居的最快数据结构是什么?
必须支持通过以任意顺序交错的“查找最近”查询来添加和删除圆圈。事先对集合的几何分布一无所知。
这将是一个系统的核心,其中一个典型的圈数是 50,000 个,并且需要 10 的数千个查询、插入和删除,理想情况下在高端的用户交互速度(一秒或更少)平板设备。
点最近的邻居已经被研究死了,但是这个带有圆圈的版本似乎有些困难。
我看过 kd-trees、quad-trees、r-trees 以及它们的一些变体。关于其中哪一个可能是最好的尝试的建议以及新的建议都会有很大的帮助。
【问题讨论】:
-
@NiklasB 对。这就是为什么我说“请注意,如果圆圈重叠,这可能是负面的。”在这个应用程序中是有意义的。如果有帮助,您可以假设存在一个固定常数,当将其添加到所有距离时,会使它们成为非负数。
-
我一定是太笨了,看不懂,没关系
-
中心是二维点还是一维点?
-
您可以将 Voronoi 图用于您的圆圈集。它允许非常快速的搜索。但是更新可能会很慢,尤其是当您在许多小圆圈上方添加/删除大圆圈时。如果将圆分成 sqrt(n)...log(n) 子集(每个子集 - 用于某些不同大小的圆)并为每个子集维护单独的 Voronoi 图,这可能会得到改善。
-
@NiklasB。不,我是说在 50,000 个数据库中必须在一秒钟内运行 10 万次插入、删除和查询。
标签: algorithm language-agnostic computational-geometry