在以下任务中找到比O(n ^ 2)更好的复杂性时遇到问题:
"当a1>时,我们说点A =(a1,a2,...,an)支配B =(b1,b2,...,bn)。 b1&& a2> b2&& ...&&一个> BN。我们给出了一组点S并且需要返回一个点的索引,该点占主导地位并且由相同数量的点(平衡点)支配,或者如果这样的点不存在则为-1。"
int findBalancePoint(Point[] S, int n){
int index = 0;
int dominates, isDominated;
for(int i = 0; i < n; i++){
index = i;
swap(S, 0, i);
dominates = isDominated = 0;
for(int j = 1; j < n; j++){
if( S[0].x > S[j].x && S[0].y > S[j].y )
dominates++;
else if( S[0].x < S[j].x && S[0].y < S[j].y )
isDominated++;
}
if(dominates == isDominated)
return index;
}
return -1;
}
由于这是算法测试之前的一个示例,我猜有更好的解决方案。提前感谢您的帮助。
更新
试验:
Input1: (1,2), (2,1), (3,3), (4,4), (5,6)
Result: 2
Input2: (1,1), (3,2), (4,5)
Result: 1
Input3: (1,4), (2,3), (3,1), (4,2)
Result: 0 or 1 ( doesnt matter which one )
Input4: (1,1), (2,2), (3,3), (4,4)
Result: -1
Input5: (1,2), (2,1), (3,3), (3,5), (4,4), (5,6), (6,2)
Result: 2 or 3
答案 0 :(得分:3)
一个想法是按x坐标增加的顺序访问点。
当您访问每个点时,您将其y坐标插入到平衡二叉树中(每个点的复杂度为O(logn))。
您还可以查询二叉树以查找y值较小的点数,这是它占主导地位的点数。
然后,您可以按照减少x坐标的顺序重复此过程,以找到每个点所占据的点数。
总的来说,我认为这会给出O(nlogn)的复杂性。
正如朱利安在评论中指出的那样,如果有多个点具有相同的x坐标,则此解决方案将失败。解决这个问题的方法是在将这些点添加到二叉树之前对具有相同x坐标的点进行所有查询。
答案 1 :(得分:0)
这样的任务通常用一个名为Plane Sweep Algorithms的类来解决。 您似乎必须调整现有的平面扫描算法之一。
E.g找到所有线的所有交叉点。 (线段交叉点)。
阅读更多Mark De Berg:计算几何,第20页