我想用耐心排序算法解决 Haskell 中最长的递增子序列问题。
我首先用列表来做,它在 O(n^2) 时间内工作。
现在我想创建一个在 O(n log n) 时间内解决它的算法。为此,我需要在插入每个值时获得“第一次拟合” ,换句话说,在n log n时间内v
找到最后一个元素大于 v 的第一堆。
data OrderedStruct = undefined -- ???
-- I need a method to remove elements in (n log n) time
popFirstBigger :: Ord a -> a -> OrderedStruct a -> (Maybe a, OrderedStruct a)
popFirstBigger a t = undefined
-- and one to insert them in (n log n) or faster
insert :: Ord a -> a -> OrderedStruct a -> OrderedStruct a
insert a t = undefined
我可以用平衡的二叉搜索树来做到这一点,但我想知道它是否存在最短的方法。例如,我可以在二分搜索中使用的任何结构都足够了。
标准 Haskell 中是否存在这样的数据结构(Seq
例如?)
否则我可以使用哪种数据结构?