【问题标题】:Patience sort and finding the longest increasing subsequence耐心排序并找到最长的递增子序列
【发布时间】:2015-01-17 14:45:19
【问题描述】:
我能够理解算法来找到描述HERE 的最长递增子序列。但这也与耐心排序有关。正如作者所说
奖励:您已经部分学习了耐心排序技术:)。
我尝试从其他地方阅读耐心排序,但看不出它与最长递增子序列解决方案有何关系。
我正在尝试进行逆向工程,看看如何从最长递增子序列离开我们的点开始排序。
有人可以就此提出任何建议吗?而且耐心排序的目的和好处到底是什么?
Here 是与堆栈溢出相关的问题,它共享信息,但反过来说 - 如何使用耐心排序获得最长的递增子序列。
【问题讨论】:
标签:
java
algorithm
sorting
【解决方案1】:
耐心排序只是另一种 O(n lg n) 排序算法(它实际上取决于实现)。如果你以前玩过纸牌,它有点类似。该算法维护一个堆栈列表,每个堆栈都按降序(从尾到头)排序。数字是递增插入的。
要插入一个数字 x,找到最左边的栈顶元素大于 x 并将 x 压入它。如果不存在这样的堆栈,则在最后创建一个新堆栈并将 x 压入其中。请注意,我们插入数字的方式意味着堆栈的顶部元素按升序排序,因此最长递增子序列的长度就是最后的堆数。
一旦所有数字都被插入并且堆准备好,我们将反复找到最小数字并将其写入输出。现在必须将我们从中获取数字的堆栈插入新位置,以便再次对堆栈的顶部元素进行排序。这可以通过使用堆来存储堆栈来完成。
如果你只是简单地扫描顶部元素以找到最小值并且不使用花哨的数据结构,那么算法需要 O(n sqrt(n)),这对于小 n 来说还不错。
因此,这会对数字列表进行排序,并为您提供 LIS 的长度(并通过一些扩充为您提供 LIS)。