0

我想用耐心排序算法解决 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例如?)

否则我可以使用哪种数据结构?

4

1 回答 1

2

Data.Set提供insert,deletelookupGT, 都在 O(log n) 时间内。

于 2021-02-19T18:17:19.827 回答