有没有一种在Haskell中实现快速优先级队列的简单方法?

时间:2014-11-25 21:08:10

标签: haskell data-structures functional-programming priority-queue finger-tree

我已经搜索了一下,发现了一篇关于Finger Trees的论文,可以用来实现具有适当渐近复杂度的优先级队列,但它们相当复杂,但仍然是我能做的最简单的事情找到。

是否有一个简单的数据结构允许在Haskell中实现快速优先级队列?想想简单,就像在中你可以向新手程序员解释< / em>的

2 个答案:

答案 0 :(得分:8)

heap package on Hackage声称是基于冈崎的左派堆。

来自文档:

  

如果您需要一个简单的最小或最大堆(始终将最小/最大元素保持在堆的头部),请选择MinHeap或MaxHeap。

     

如果您希望手动注释具有优先级的值,e。 G。 Int使用MinPrioHeap或MaxPrioHeap的IO()动作。它们管理(prio,val)元组,只有优先级(而不是值)才会影响元素的顺序。

     

如果您仍然需要不同的东西,可以通过实现HeapItem的实例来定义堆元素的自定义顺序,并让维护者知道缺少的内容。

答案 1 :(得分:2)

我知道在Haskell中最简单的堆是Pairing Heap

它支持以恒定时间(摊销)和对数时间插入和合并以删除元素。

data Heap a = Empty | Heap a [(Heap a)]
    deriving Show

findMin :: Heap a -> a
findMin (Heap h _) = h

merge :: Ord a => Heap a -> Heap a -> Heap a
merge Empty h = h
merge h Empty = h
merge h1@(Heap x hs1) h2@(Heap y hs2)
    | x < y     = Heap x (h2:hs1)
    | otherwise = Heap y (h1:hs2)

mergePairs :: Ord a => [Heap a] -> Heap a
mergePairs []           = Empty
mergePairs [h]          = h
mergePairs (h1:h2:hs)   = merge (merge h1 h2) (mergePairs hs)

insert :: Ord a => a -> Heap a -> Heap a
insert x = merge (Heap x [])

deleteMin :: Ord a => Heap a -> Heap a
deleteMin (Heap x hs) = mergePairs hs