在O(nlgn)的一组坐标中找到支配对

时间:2010-06-27 02:25:58

标签: algorithm

坐标a(xa,ya)支配b(xb,yb)if(xa> = xb且ya> = yb) 如何使用除法和征服来找到nlgn中一组坐标中的所有对?

编辑:改为对的数量。

4 个答案:

答案 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)

粗略地说,任何给定的向量(xa,ya)将占据其他向量(ya,yb)的大约一半或由其支配,因为在{xa = 0>的四种情况中。 ya,xb< => yb},两个是优势的情况。

因此,我们希望您的问题的解决方案包含大约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)操作,因此具有相同的复杂度。