【发布时间】:2015-08-09 22:08:03
【问题描述】:
我需要一个算法来解决以下问题:
给定平面上的一组二维点 P = { (x_1, y_1), (x_2, y_2), ..., (x_n, y_n) }。我需要按以下方式将它们成对分组:
- 在 P 中找到两个最近的点 (x_a, y_a) 和 (x_b, y_b)。
- 将 对添加到结果集 R。
- 从 P 中删除 。
- 如果初始集合 P 不为空,则转到第一步。
- 返回对 R 的集合。
那个简单的算法是 O(n^3),使用更快的算法来搜索最近的邻居,它可以改进到 O(n^2 logn)。能不能做得更好?
如果这些点不在欧几里得空间中呢?
一个例子(结果组用红色圆圈圈起来):
【问题讨论】:
-
您能否详细说明一下输出究竟应该是什么,即您能否提供一个输入输出案例示例?
-
PriorityQueue<Distance>? -
@sircodesalot 你能详细说明一下吗?
-
其实还是N^2 log N,但是基本上可以将所有距离dump到一个优先队列中,然后读出最近的对。
-
使用
Set<Point>跟踪看到的项目。Set<T>的查找时间为 O(1)。或者你可以只使用一个位集或一个数组或其他东西(因为你知道你正在使用多少个点),这不需要摊销。
标签: algorithm computational-geometry nearest-neighbor