具有两个数字的最长增加子序列(LIS)

dev*_*ish 7 algorithm

如何使用两个数字找到LIS的长度.例如,[(1,2)(7,8)(3,4)(5,6)]在上面的数组序列中,LIS的长度为3.即[(1,2)(3, 4)(5,6)]有什么想法吗?

Bri*_*ian 8

我不确定你在问什么,但我会假设你的意思是一对(a,b)小于另一对(c,d)当且仅当a <c和b <d时.

通过采用另一个SO线程中描述的标准动态编程技术,可以在O(N ^ 2)时间内轻松解决这个问题.

标准LIS问题的经典O(N log N)解决方案可以扩展为给出LIS问题的子二次解决方案,但存在一些困难.我们不能简单地记住每个可能长度的最小值; 我们必须保持"阶梯式"结构,其中包含每个长度的所有最小对,即,最多N个这里描述的数据结构的副本,使用键入第一个成员的有序动态对集合来实现.然后我们可以在O(log N)时间内查询该结构的一个副本(以检查它是否包含少于当前对的任何对),为二进制搜索步骤提供O(log ^ 2 N)时间,并且O(N log ^ 2 N)时间全部.这是我对问题所知的最快解决方案.


NPE*_*NPE 7

您可以将任何算法用于标准LIS问题,并进行两项修改:

  1. 丢弃第二个数字不严格大于第一个数字的任何对.
  2. 对A和B(即A < B)的比较运算符需要将第二个A与第一个B的数量进行比较.

  • 你对[(1,2),(0,1),(5,2),(7,3),(2,3),(10,5)]的解决方案是什么? (2认同)