假设我们给出了一组整数对S = {(x_1,y_1),...,(x_n,y_n)}。在S中计算最大元素序列(a_1,b_1),...,(a_m,b_m)的最有效方法是什么?
a_i< = a_ {i + 1}
b_i< = b_ {i + 1}
表示i = 1,...,m-1,即序列是针对两个分量排序的。我可以提出一个执行以下操作的二次算法:
我们根据第一个坐标对S的元素进行排序,给出(c_1,d_1),...,(c_n,d_n),其中c_i< = c_ {i + 1}。
使用动态编程,对于每个(c_i,d_i),我们计算相对于以(c_i,d_i)结尾的两个分量排序的最长序列。这可以在线性时间内完成,一旦我们知道(c_1,d_1)......,(c_ {i + 1},d_ {i + 1})的最长序列。
由于我们必须在步骤1中执行O(nlogn)排序,并在步骤2中对每个索引进行线性搜索(二次),我们最终得到二次运行时。
我一直在试图弄清楚是否有更快的,即O(nlogn)方式从两种集合S生成最大序列:一个相对于第一个组件,并且一个关于第二个。这可能吗?
答案 0 :(得分:6)
是的,有可能O(n log n)
。
让我们按字典顺序对集合的元素进行排序。第一个组件现在正确排序,所以我们可以忘记它们。
让我们来看看这个排序序列的任何排序子序列。第二个元素形成一个增加的子序列。这就是为什么我们可以在每对的第二个元素的排序序列中找到最长的增加子序列(完全忽略第一个元素,因为它们已经正确排序)。可以在O(n log n)
时间内找到一组数字的最长增长子序列(这是一个众所周知的问题)。