java - 使用递归的 O(n^2) 的最大递增子序列

标签 java algorithm recursion time-complexity lis

LIS :最长递增子序列问题是找到给定序列的子序列,其中子序列的元素按从低到高的顺序排列

例如:

0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15

A longest increasing subsequence is 0, 2, 6, 9, 13, 15.

我可以使用动态规划和内存技术等不同方式开发 LIS,但在特定情况下,我喜欢使用时间复杂度为 O(N^2) 的递归来实现 LIS .

我认为使用递归我们无法实现具有时间复杂度的算法 O(N^2) .(请指正)

但是我从谷歌得到这个算法

Algorithm  LIS(A,n,x)
1: if n = 0 then
2:   return 0
3: m   LIS(A; n -1; x)
4: if A[n] < x then
5:   m =max(m; 1 + LIS(A; n-1;A[n]))
6: print(m)

这个算法是O(N^2)

你能解释一下吗?

最佳答案

此算法打印数组中的最大值 第一个参数 (A) 是数组,第二个参数 (n) 是现在检查最大值的项的索引,第三个参数 (x) 是当时的最大值。 在最坏的情况下,你有一个排序的数组,并且在每次检查中(如果 A[n] < x 那么)你必须用 max 更新第三个参数,这意味着你最多必须检查所有数组。

该算法从索引 n 到 n-1 取一个最大值,并检查从 n 到 n-2 的最大值,并检查 n 到 n-3 索引中的最大值,然后继续检查 n 到 1 以获得最大值项目。

这意味着它是 O(n+(n-1)+(n-2)+...+2+1) = O(n^2)

pic

抱歉图片质量:)

关于java - 使用递归的 O(n^2) 的最大递增子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26770846/

相关文章:

python - 列表乘积的递归函数不起作用

Java:保存递归本地计数器的值

java - 为什么这个assertThat断言会抛出AssertionError?

java - Jira 插件已启动,但浏览器中未显示任何内容

java - 为什么 Serialized 被称为接口(interface)?

algorithm - 分组组合算法

java - 使用扫描仪类读取 txt 文件时会出现 InputMismatchException。我究竟做错了什么?

algorithm - 最小堆到最大堆,比较

algorithm - 如何在给定两个相对点的二维矩阵中绘制正方形

javascript - javascript 的一个示例程序的输出给出了错误的答案