Haskell似乎有几种现成的优先级队列实现。例如,有:
这两者似乎都是纯优先级队列数据结构。前者基于手指树,这是一种我不熟悉的数据结构;后者是Data.Map的包装器。还有
定义了纯功能堆数据结构,从中可以轻松地创建优先级队列。 。还有
它们都使用Brodal / Okasaki数据结构实现纯功能可融合堆,我认为这类似于非纯函数域中的二项式堆数据结构。
(哦,还有
我的功能不清楚,但它似乎与monad相关的构建优先级队列相关,而且无论如何它似乎都建立在Data.Map之上。在这个问题中,我关注纯粹的功能优先级队列,所以我认为priority-queue-0.2.2包是无关紧要的。但如果我错了,请纠正我!)
我需要为我正在构建的项目提供纯功能优先级队列数据结构。当我在hackage提供的embarrassment of riches之间做出决定时,我想知道是否有人可以提供任何智慧的话语。具体做法是:
答案 0 :(得分:38)
在hackage上有很多优先级队列实现,只是为了完成你的列表:
在那些我发现PSQueue有一个特别好的界面。我想这是第一个实现之一,并且由{RALf Hinze在this paper中很好地介绍了。它可能不是最有效和最完整的实现,但到目前为止它已满足我的所有需求。
Louis Wassermann(他还撰写了issue 16包)在MonadReader(pqueue)中有一篇非常好的文章。在他的文章中,路易斯给出了各种不同的优先级队列实现,并且还包括每个算法的复杂性 作为一些优先级队列内部的简单性的一个突出的例子,他包括一些很酷的小实现。我最喜欢的一个(取自他的文章):
data SkewHeap a = Empty | SkewNode a (SkewHeap a) (SkewHeap a) deriving (Show)
(+++) :: Ord a => SkewHeap a -> SkewHeap a -> SkewHeap a
heap1@(SkewNode x1 l1 r1) +++ heap2@(SkewNode x2 l2 r2)
| x1 <= x2 = SkewNode x1 (heap2 +++ r1) l1
| otherwise = SkewNode x2 (heap1 +++ r2) l2
Empty +++ heap = heap
heap +++ Empty = heap
extractMin Empty = Nothing
extractMin (SkewNode x l r ) = Just (x , l +++ r )
酷的小实现......一个简短的用法示例:
test = foldl (\acc x->acc +++ x) Empty nodes
where nodes = map (\x-> SkewNode x Empty Empty) [3,5,1,9,7,2]