找到"余额的算法"点

时间:2015-12-01 19:29:49

标签: algorithm

在以下任务中找到比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

2 个答案:

答案 0 :(得分:3)

一个想法是按x坐标增加的顺序访问点。

当您访问每个点时,您将其y坐标插入到平衡二叉树中(每个点的复杂度为O(logn))。

您还可以查询二叉树以查找y值较小的点数,这是它占主导地位的点数。

然后,您可以按照减少x坐标的顺序重复此过程,以找到每个点所占据的点数。

总的来说,我认为这会给出O(nlogn)的复杂性。

更新

正如朱利安在评论中指出的那样,如果有多个点具有相同的x坐标,则此解决方案将失败。解决这个问题的方法是在将这些点添加到二叉树之前对具有相同x坐标的点进行所有查询。

答案 1 :(得分:0)

这样的任务通常用一个名为Plane Sweep Algorithms的类来解决。 您似乎必须调整现有的平面扫描算法之一。

E.g找到所有线的所有交叉点。 (线段交叉点)。

阅读更多Mark De Berg:计算几何,第20页