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

标签 algorithm

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

最佳答案

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

这可以通过采用标准动态规划技术在 O(N^2) 时间内轻松解决,描述为 in another SO thread .

经典 O(N log N) solution to the standard LIS problem可以扩展为成对的 LIS 问题的次二次解,但有一些困难。我们不能简单地记住每种可能长度的一个最小值;我们必须维护包含每个长度的所有最小对的“阶梯状”结构,即最多 N 个描述的数据结构副本 here ,使用以第一个成员为键的有序动态对集实现。然后我们可以在 O(log N) 时间内查询该结构的一个副本(以检查它是否包含小于当前对的任何对),为二进制搜索步骤提供 O(log^2 N) 时间,并且 O(N总共 log^2 N) 时间。这是我所知道的最快的问题解决方案。

关于algorithm - 具有两个数字的最长递增子序列 (LIS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716934/

相关文章:

algorithm - 面试题: Buy and sell stocks to maximize profit with constraint of not buying once you sell

C++ : How to calculate modulo of a number raised to large power?

c - 如何将计算有界切片数量的时间复杂度降低到 O(N)?

javascript - 根据多个属性从对象数组中过滤重复项,包括原始值

algorithm - 这里使用哪种聚类算法?

python并行计算: split keyspace to give each node a range to work on

python - 如何在Python中的类中而不是类之外声明函数

algorithm - 礼品包装算法(贾维斯算法)计算凸包的最坏情况是什么?

algorithm - 确定两个给定时间范围是否重叠

c# - 3D 体素网格视线 Bresenham 算法