给定整数对(a1,b1),...,(an,bn)
。如果i
和j
,对ai < aj
由对bi < bj
“支配”。什么是快速确定不受任何其他对支配的对列表的算法?
我们可以检查所有对,并且对于每对,通过再次遍历所有对来检查它是否被任何其他对支配。该算法是订单n^2
。是否存在订单n
或n log n
?
答案 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;
}