查找与O(nlogn)中的一条线具有相同距离的所有点对

时间:2017-10-15 10:25:02

标签: algorithm divide-and-conquer

我正在尝试解决算法问题。我有2个数组,比如A和B,包含一些点。 A和B的长度相同。我知道A和B中的所有点都是截然不同的。现在,我想找到距离一条线的距离相同的所有对。还有一条规则。我不能比较A中的两个点和B中的两个点。

如何在O(nlogn)中解决这个问题?我认为这是一个分而治之的问题,但我找不到解决方案。

提前致谢。

编辑:一个例子:

Line -> y=0
A = {(1,2), (3,4)}
B = {(1,-2), (3,-4)}
Output -> {{(1,2), (1,-2)}, {(3,4), (3,-4)}} 

EDIT2:假设所有距离也是不同的。

3 个答案:

答案 0 :(得分:1)

这是(禁止比较两点看起来很傻) 螺母和螺栓问题的变体。 O(NlogN)解决方案可能使用类似快速排序的分区:

比较函数如下:

float Compare(int A_Index, int B_Index)
   return Distance(line, A[A_Index]) - Distance(line, B[B_Index])

使用与a_idx比较,从A. Partition B数组中选择随机索引a_idx。生成的pivot B[b_idx]对应A[a_idx]元素。现在将数组A分区为b_idx。你有一对相等的元素以及距离越来越远的点的左右子阵列。

对两个阵列重复,直到所有点都配对。

答案 1 :(得分:0)

为什么不进行O(n)例程?哈希从A到线的每个点的距离:

Distance 1 -> {A[0]}
Distance 2 -> {A[1]}

对B进行迭代,如果已经对B[i]到Line的距离进行了哈希处理,请添加B[i]以成对:

Distance 1 -> {A[0], B[0]}
Distance 2 -> {A[1], B[1]}

答案 2 :(得分:0)

键入距离的哈希表(std::unordered_map)将具有N次插入O(1)的特征。但是,如果与键发生冲突,则会破坏比较2个A元素的约束。

在哈希表中搜索B中的元素也将是O(1)。因此性能将是O(N) - 但我无法看到如何避免碰撞情况。