我能够理解算法以找到描述HERE的最长增长子序列。但它也与耐心排序有关。正如作者所说
奖励:您已经部分学习了耐心分类技术:)。
我曾尝试从其他地方阅读耐心排序,但无法看到它与增长最快的子序列解决方案有何关联。 我正在尝试逆向工程,看看如何从最长的后续序列离开我们。 有人可以建议任何指针吗?此外,耐心分类的目的和优势究竟是什么?
Here是堆栈溢出相关的问题,它共享信息,但其他方式是 - 如何使用耐心排序获得最长的增加子序列。
答案 0 :(得分:2)
耐心排序只是另一种O(n lg n)排序算法(它实际上取决于实现)。如果你以前玩过纸牌游戏,那就有点类似了。该算法维护一个堆栈列表,每个堆栈按递减顺序(从头到尾)排序。数字以递增方式插入。
要插入数字x,找到顶部元素大于x的最左边的堆栈并将x推到其上。如果不存在这样的堆栈,则在末尾创建一个新堆栈并将x推入其中。请注意,我们插入数字的方式意味着堆栈的顶部元素按递增顺序排序,因此最长的增加子序列的长度只是最后的堆数。
一旦插入所有数字并且堆准备就绪,我们将重复找到最小数字并将其写入输出。我们从中获取数字的堆栈现在必须插入一个新位置,以便再次对堆栈的顶部元素进行排序。这可以通过使用堆来存储堆栈来完成。
如果您只是扫描顶部元素以找到最小值并且不使用花哨的数据结构,则算法采用O(n sqrt(n)),这对于小n来说并不坏。
因此,这会对数字列表进行排序,并为您提供LIS的长度(并通过一些扩充为您提供LIS)。