我已经搜索了一下,发现了一篇关于Finger Trees的论文,可以用来实现具有适当渐近复杂度的优先级队列,但它们相当复杂,但仍然是我能做的最简单的事情找到。
是否有一个简单的数据结构允许在Haskell中实现快速优先级队列?想想简单,就像在中你可以向新手程序员解释< / em>的
答案 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