坐标a(xa,ya)支配b(xb,yb)if(xa> = xb且ya> = yb) 如何使用除法和征服来找到nlgn中一组坐标中的所有对?
编辑:改为对的数量。
答案 0 :(得分:3)
快速排序,你的比较首先按X然后Y排序(所以你会得到像5,3 5,2 4,7 4,2等等.Quicksort是nlogn
然后从最高点迭代进行比较。那最多是O(n)。你最终得到O(n)+ O(nlogn)=> O(nlogn)
Quicksort使用分而治之 - 它在分支上划分。
修改强>
我考虑的另一件事。您可以遍历整个集合,并将所有在X坐标中占主导地位的点放在集合中。然后,走一个较小的子集并过滤掉那些也由你的Y控制的子集。这只是两个步骤,用于O(n)性能。
答案 1 :(得分:1)
因此,我们希望您的问题的解决方案包含大约n *(n / 2)对向量。算法不能比它的解决方案便宜,所以n * ln(n)不会起作用。
答案 2 :(得分:0)
让我们说你有点
a1> a2> a3 ...> an-1> d(读取> as dominates)n与所有情况下的点数(N)成正比。
对的数量本身大于nlogn(例如(A [1],A [2..n])(A2],A [3..n])..A [n = 1], A [n])我认为这是n(n-1)/ 2。
所以N logN似乎不可能
答案 3 :(得分:0)
假设您只需计算对的数量,您可以采取全面的方法:
1)根据X值
对点进行排序2)将点收集到搜索树中。
这里我们使用基于点的Y值的平衡树。树应该具有每个内部节点的计数器,指示由其生根的子树中的项目数。可以维护这些计数器而不会对树操作的时间复杂性产生任何影响。计数器的使用允许以对数时间查询低于给定值V的项目数。
关于(2)的更多细节:我们从左到右扫描步骤(1)中获得的点。对于遍历的每个点P,我们将P添加到树中,然后计算Y <0的项目数。 P.Y.此数字将添加到最后返回的全局计数中。
步骤(1)在N * Log(N)时间运行,步骤(2)执行N次迭代两次Log(N)操作,因此具有相同的复杂度。