6

少しグーグルで検索して、Finger Treesに関する論文を見つけました。これは、適切な漸近的な複雑さで優先キューを実装するために使用できますが、それらは非常に複雑ですが、それでも私が見つけることができる最も単純なものです.

Haskell で高速優先キューを実装できる単純なデータ構造はありますか? 初心者のプログラマーに説明できるように、簡単に 考えてください。

4

2 に答える 2

3

私が知っている 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
于 2016-11-14T03:20:20.483 に答える