耐心排序并找到增长最长的子序列

时间:2015-01-17 14:45:19

标签: java algorithm sorting

我能够理解算法以找到描述HERE的最长增长子序列。但它也与耐心排序有关。正如作者所说

  

奖励:您已经部分学习了耐心分类技术:)。

我曾尝试从其他地方阅读耐心排序,但无法看到它与增长最快的子序列解决方案有何关联。 我正在尝试逆向工程,看看如何从最长的后续序列离开我们。 有人可以建议任何指针吗?此外,耐心分类的目的和优势究竟是什么?

Here是堆栈溢出相关的问题,它共享信息,但其他方式是 - 如何使用耐心排序获得最长的增加子序列。

1 个答案:

答案 0 :(得分:2)

耐心排序只是另一种O(n lg n)排序算法(它实际上取决于实现)。如果你以前玩过纸牌游戏,那就有点类似了。该算法维护一个堆栈列表,每个堆栈按递减顺序(从头到尾)排序。数字以递增方式插入。

要插入数字x,找到顶部元素大于x的最左边的堆栈并将x推到其上。如果不存在这样的堆栈,则在末尾创建一个新堆栈并将x推入其中。请注意,我们插入数字的方式意味着堆栈的顶部元素按递增顺序排序,因此最长的增加子序列的长度只是最后的堆数。

一旦插入所有数字并且堆准备就绪,我们将重复找到最小数字并将其写入输出。我们从中获取数字的堆栈现在必须插入一个新位置,以便再次对堆栈的顶部元素进行排序。这可以通过使用堆来存储堆栈来完成。

如果您只是扫描顶部元素以找到最小值并且不使用花哨的数据结构,则算法采用O(n sqrt(n)),这对于小n来说并不坏。

因此,这会对数字列表进行排序,并为您提供LIS的长度(并通过一些扩充为您提供LIS)。