【问题标题】:Algorithm to find non-dominated pairs寻找非支配对的算法
【发布时间】:2012-10-04 10:28:58
【问题描述】:

给出的是整数对(a1,b1),...,(an,bn)。如果ai < ajbi < bj,则i 对由j 对“支配”。有什么算法可以快速确定不被任何其他对支配的对列表?

我们可以检查所有对,并且对于每一对,通过再次遍历所有对来检查它是否被任何其他对支配。这个算法是顺序n^2。有没有顺序算法nn log n

【问题讨论】:

    标签: algorithm array-algorithms


    【解决方案1】:

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

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

    正确性:当且仅当某对具有更大的a 值和更大的b。当我们考虑一对时,我们正在精确地比较它的b 值 在具有较大a 的对中最大b 值,因此我们将一对添加到列表中 当且仅当它不被支配。

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

    【讨论】:

    • 您需要处理相同的a 组件。如果两对具有相同的a 分量,则具有较小b 分量的一对不会被另一对支配,并且不需要被具有较大a 的一对支配(因此您需要记住两个@987654341 @ 值)。但原则上是正确的。
    • 如果一对被“主要化”了,你怎么知道?
    • @quasiverse s/majorized/downed/,问题中已定义。
    【解决方案2】:

    如果我理解正确的话,一个非支配对是这样一个,即 a 或 b 分别大于或等于 a 和 b 的最大值。

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

    Java 中的一个小示例,返回“非支配”对的索引 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多