查找非支配对的算法

时间:2012-10-14 02:40:10

标签: algorithm array-algorithms

给定整数对(a1,b1),...,(an,bn)。如果ij,对ai < aj由对bi < bj“支配”。什么是快速确定不受任何其他对支配的对列表的算法?

我们可以检查所有对,并且对于每对,通过再次遍历所有对来检查它是否被任何其他对支配。该算法是订单n^2。是否存在订单nn log n

的算法

2 个答案:

答案 0 :(得分:8)

我们可以在O(n log n)时间内找到非支配对。

按降序a_i对对进行排序,然后迭代对。另外,保持 跟踪到目前为止看到的最大b值,b_max。在每一步,如果下一个(a_i,b_i) 对的b值大于b_max,将其附加到答案列表并更新b_max。最终答案列表将是非支配对。

正确性:当且仅当某对具有较大的a时,一对才占主导地位 值和更大的b。当我们考虑一对时,我们正在精确地比较它的b值 对于b个较大的对中的最大a值,我们在列表中添加一对 当且仅当它不被支配时。

运行时:按值对对进行排序需要O(n log n)次。迭代 花费O(n)时间,因此整体运行时间为O(n log n)

答案 1 :(得分:2)

如果我理解正确,那么一个非主导的对就是a或b分别大于或等于a和b的最大值。

所以你只需要为a和b找到这样的最大值(for循环O(n)),然后执行另一个循环来找到满足上述条件的任何一对。总之,O(n)时间复杂度。

Java中的一个小例子,为'not dominated'对返回索引的ArrayList:

    ArrayList<Integer>findUndominatedPairIndexes(int[][]arrayOfPairs)
    {
        ArrayList<Integer>result=new ArrayList<Integer>();
        int maxX=Integer.MIN_VALUE;
        int maxY=Integer.MIN_VALUE;
        int i=arrayOfPairs.length;
        /**
         * get the max value
         */
        for(;--i>=0;)
        {
            int x=arrayOfPairs[i][0];
            int y=arrayOfPairs[i][1];
            if (x>maxX)
            {
                maxX=x;
            }
            if (y>maxY)
            {
                maxY=y;
            }
        }
        for(i=arrayOfPairs.length;--i>=0;)
        {
            int[] pair=arrayOfPairs[i];
            if (pair[0]>=maxX||pair[1]>=maxY)
            {
                result.add(new Integer(i));
            }

        }
        return result;
    }