给定n个点(x,y坐标),我需要使用分而治之算法找到距离小于D的所有点对。
最初我考虑使用类似的方法作为最近点问题,但是因为现在距离D是常数,所以我们可以在分裂区域中无限多个点而不是最近点问题中的第8个点。因此运行时间为O(n ^ 2),这并不比Brute-force好。
任何想法或暗示都将受到赞赏。
答案 0 :(得分:0)
一种提高平均情况下效率的方法是,首先使用x分别对点的坐标(x,y)进行排序,如果x相同(与字符串的排序方式非常相似),则对点y进行排序。典型的分而治之方法。
然后从已排序数组中的第一个点(我将其称为枢轴点)进行检查,并知道距离D和枢轴点的x和y值,我们可以计算x值的上限。同样,对于该范围内的每个X,我们还可以计算其上下y范围,这会将其余问题转换为一个嵌套范围迭代问题,该问题迭代直到超出范围为止(要找到y迭代的起始位置,您可以需要对具有相同x的数据集使用二进制搜索。
例如,我们有一组点(1,0)(5,0)(3,1)(1,3)(3,4),我们需要找到两对点之间的距离在2之内。首先对点进行排序,我们得到(1,0)(1,3)(3,1)(3,4)(5,0)。将(1,0)设置为枢轴点,我们可以将x的上限计算为3,因此我们不必关心(5,0)。然后,我们可以检查x等于1的点集,并计算y的下限/上限-2和2,以通过二元搜索在x等于1的点集中再次定位下y。在-之间具有y的点2和2是有效点。重复上述步骤,然后我们终于可以找出所有有效的点对。