我正在尝试解决算法问题。我有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:假设所有距离也是不同的。
答案 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) - 但我无法看到如何避免碰撞情况。