Haskell中优先队列实现的比较

Haskell似乎有几个可用的优先级队列实现。 例如,有:

  • Data.PriorityQueue.FingerTree(在fingertree-0.0.1.0上hackage)
  • Data.PurePriorityQueue(在纯优先级队列-0.14上的hackage)
  • 这两者看起来都是纯粹的优先队列数据结构。 前者基于手指树,这是我不熟悉的数据结构; 后者是Data.Map的一个包装。 还有

  • Data.Heap(在hackage中的堆-1.0.0)
  • 它定义了纯粹功能性的堆数据结构,从中可以轻松地制定优先级队列。 。 还有

  • Data.Heap(在hackage中为0.2)
  • Data.MeldableHeap(在hackage中的meldable-heap-2.0.3中)
  • 它们都使用Brodal / Okasaki数据结构来实现纯粹功能性的可堆集堆,我相信它类似于非纯功能域中的二项堆数据结构。

    (哦,还有

  • Data.PriorityQueue(在优先级队列-0.2.2上的hackage)
  • 它的功能对我来说还不清楚,但似乎与建立monad的优先级队列有关,而且似乎无论如何都是建立在Data.Map之上的。 在这个问题中,我关心的是纯粹的功能优先级队列,所以我认为priority-queue-0.2.2包是无关紧要的。 但如果我错了,请纠正我的错误!)

    我需要一个纯功能优先级队列数据结构,用于我正在构建的项目。 我想知道是否有人能够提供任何智慧的话,因为我决定在黑客提供的财富尴尬之间。 特别:

  • 假设我想要在传统的优先级队列插入和extract-min操作之外做一些功能,这些功能都是纯功能/不可变的演示文稿。 上面提到的软件包有什么优点和缺点? 有没有人有经验使用他们中的任何一个'愤怒'? 性能的折衷是什么? 可靠性? 其他人使用哪种更广泛? (使用这些可能会使我的代码更容易让其他人阅读,因为他们更可能熟悉图书馆。)在做出决定之前,我还需要了解其他任何事情吗?
  • 如果我也想要优先级队列的高效合并,那么呢? (我不是为了这个项目,但是我想加入这个项目,但是会让未来的读者对这个问题更有用。)
  • 有没有其他优先级队列包,我错过了?

  • 在hackage上可以找到大量的优先级队列实现,只是为了完成您的列表:

  • http://hackage.haskell.org/package/PSQueue
  • http://hackage.haskell.org/package/pqueue
  • http://hackage.haskell.org/package/queuelike
  • http://hackage.haskell.org/package/priority-queue
  • http://hackage.haskell.org/package/pure-priority-queue
  • http://hackage.haskell.org/package/fingertree-psqueue
  • 在那些我发现PSQueue有一个特别好的界面。 我想这是第一个实现,并且由Ralf Hinze在本文中很好地覆盖。 它可能不是最高效和最完整的实施方式,但迄今为止它满足了我的所有需求。

    MonadReader(问题16)中有一篇非常好的文章,由Louis Wassermann撰写(他也编写了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]
    

    有些优先级队列实现的基准测试可以在这里找到,在这里可以找到一个相当有趣的haskell.org线程。

    链接地址: http://www.djcxy.com/p/43239.html

    上一篇: Comparison of Priority Queue implementations in Haskell

    下一篇: Performance considerations of Haskell FFI / C?