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

时间:2014-11-06 02:39:31

标签: java algorithm recursion time-complexity lis

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

例如:

  

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

     

增长最长的子序列是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)吗?

你可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

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

算法从索引n到n-1取最大值并检查最大值从n到n-2并检查最大值为n到n-3索引并继续检查n到1以获得最大值项目

表示它是O(n +(n-1)+(n-2)+ ... + 2 + 1)= O(n ^ 2)

pic

对图片质量感到抱歉:)