编程之美--数组中的最长递增子序列(LIS longest increasement sequence)
来源:互联网 发布:赖远明院士怎么样知乎 编辑:程序博客网 时间:2024/04/27 18:35
最早见到这道题目是在poj中,具体的题目忘记了,但是所要求的算法是一致的。
当时在学习LCS,因此想了一种和LCS比较相似的解法:
对原数组使用快速排序,然后使用LCS的思想求最大公共字串。 这种解法比较容易理解,但是所需要的空间为:O(2N) = O(N);时间为O(N^2+N*lgN) = O(N^2),显然这不是一种最优的解法。但是当时还真没有想到更好的解法……
最近看到编程之美上面的题目,然后豁然开朗。
书中提供了两个解法:
1. 根据无后效性的定义,可以使用DP来进行求解。根据递推公式:LIS[i+1] = max{LIS[i+1],LIS[k]+1} (当Data[i+1] > Data[k], 并且k∈[0,i]
在得出了上述的通项公式之后,可以简单的写代码求解了。但是这里需要注意的就是在for循环当中不停地更新当前的最大值,方便函数最后的结果返回。这个解法是传统的DP,因此时间复杂度为O(N^2),空间复杂度为O(N),但是在渐进意义上优于我的解法。
2. 当考虑前i个元素对i+1个元素的影响时,可以这样简答的理解:当子序列的最大元素比当前元素小时,就可以把当前元素添加到这个序列后面,构成一个新的LIS。
因此需要找到前i个元素的一个LIS,而且这个LIS的最大元素比Array[i+1]小,且长度尽可能的长。
为了加速算法的实现,构建一个长度为N的数组来维护长度为i的LIS的最大值。
因此该算法的时间复杂度是O(N^2),空间复杂度是O(2N) = O(N)。
上述算法的实现如下:
(二分查找的改进没有实现……)
- 编程之美--数组中的最长递增子序列(LIS longest increasement sequence)
- 编程之美 求数组中的最长递增子序列
- 编程之美---求数组中最长递增子序列LIS
- 编程之美-求数组中最长递增子序列(LIS)方法整理
- 编程之美2.16-最长递增子序列(Longest Subsequence)
- 数组最长递增子序列(Longest Increasing Sequence)
- POJ 2533 Longest Ordered Subsequence 编程之美 2.16 求数组中最长递增子序列
- [编程之美]求数组中最长递增子序列
- 编程之美----数组的最长递增子序列
- 编程之美--求数组中最长递增子序列
- 编程之美--求数组中最长递增子序列
- 最长递增子序列 Longest Increasing Subsequence (LIS)
- 最长递增子序列(编程之美)
- 求数组中最长递增子序列—动态规划入门(编程之美)
- 数组最长递增子序列(LIS)---MS
- 数组中的最大递增子序列(Longest Increasing Subsequence<LIS>)
- DP之最长递增子序列LIS
- 编程之美之最长递增子序列实现
- oracle 10g用浏览器打开
- 使用service locator快速定位你的服务
- C++成员函数缺省参数 示例
- 为什么感觉自己还是没入门!
- uva 10879 - Code Refactoring
- 编程之美--数组中的最长递增子序列(LIS longest increasement sequence)
- Linux系统下的多线程编程入门
- [转]Emacs快捷键的总结
- MTK平台游戏移植时的数据溢出检查
- 博弈论初涉
- 3.4.1 处理数字列表
- 简单对比 eclipse 和netbeans对jquery的支持
- MySql下如何执行sql脚本文件
- 大数加法,整数,正数