2011-08-07 23 views
52

Haskellで既製のキュー実装がいくつか用意されているようです。たとえば、あります:純粋なプライオリティキューデータのように見えるどちらも Haskellでの優先度キュー実装の比較

(hackage上pure-priority-queue-0.14中)

  • Data.PurePriorityQueue(hackage上fingertree-0.0.1.0中)

    • Data.PriorityQueue.FingerTree構造。前者は私が慣れていないデータ構造である指の木に基づいています。後者はData.Mapのラッパーです。 1は自明のプライオリティキューを作ることができ、そこから純粋に機能的なヒープデータ構造を定義します(hackage上heap-1.0.0中)

      • Data.Heap

      もあります。 。 (hackageにmeldable-heap-2.0.3に)も

    • Data.MeldableHeap(hackage上heaps-0.2中)

      • Data.Heapあります両方Brodal/Okasakiデータを使用して純粋に機能meldableヒープを実装

      私は、非純粋な機能土地の二項ヒープデータ構造に類似していると信じています。

      (ああ、と

      はData.PriorityQueue(hackage上のプライオリティキュー-0.2.2で)その機能は私には不明である

    が、関連しているように見えるが

    • もありますモナドに付いているプラ​​イオリティキューを構築し、Data.Mapの上に構築されているようだ。この質問では、純粋に機能的なプライオリティキューが関係しているので、priority-queue-0.2.2パッケージは無関係だと思うしかし、私が間違っている場合は私を修正してください!)

      私が構築しているプロジェクトのための純粋な機能の優先順位キューのデータ構造が必要です。 hackageによって提供されるembarrassment of richesの間で誰かが知恵の言葉を提供できるかどうか疑問に思っていました。具体的には:

      1. 従来の優先度の高いキューインサート操作と抽出操作を、機能的にも変更不可能なプレゼンテーションでもしたいとします。上記のパッケージの長所と短所は何ですか?誰もが "怒りの中で彼らのいずれかを使用して経験を持っていますか?パフォーマンスのトレードオフは何ですか?信頼性?どちらが他人によって広く使われていますか? (それらを使用すると、他の人が読むのが楽になるかもしれません。ライブラリに慣れ親しむ可能性が高いからです。)それらの間で決定する前に知っておくべきことは他にありますか?
      2. また、優先キューの効率的なマージが必要な場合はどうしますか? (私はこのプロジェクトではありませんが、これを追加すると思っていましたが、将来の読者にはSOの質問をより有用にするでしょう)
      3. 私が逃した他の優先キューパッケージはありますか?
  • +3

    "指の木、私が慣れていないデータ構造"私は非常に紙http://www.soi.city.ac.uk/~ross/papers/FingerTree.htmlを読むことをお勧めします:それは非常にです明確に書かれており、データ構造は広く有用である。優先キューは、特に、他のアプリケーションの中で論じられている。 –

    +3

    私は 'priority-queue-0.2.2'の著者です。これはハスケルの私の非常に初期の努力の1つであり、実際に見つかったことはありませんし、そのバージョンの問題については通知されていませんが、他の人たちと同様に考え抜かれています。その目的は実際にIORef、STRef、et al。 State/StateTで "純粋な"インターフェースを使用することができますが、そこに他にもたくさんのオプションがある場合(本当に "MinView"と "maxView"を持つ単純な "Map" ' 機能)。 – mokus

    答えて

    33

    hackageに発見される優先度キューの実装の存在量はちょうどあなたのリストを完了すること、あります:

    私はPSQueueが特に素晴らしいインターフェースを持っていることを知りました。私はそれが最初の実装の1つであったと思うし、ラルフ・ヒンゼによってthis paperでうまくカバーされています。それは最も効率的かつ完全な実装ではないかもしれませんが、これまでのところすべての私のニーズに対応しています。

    Louis Wassermann(pqueueパッケージも書いています)によってMonadReader(issue 16)に非常に良い記事があります。彼の記事では、Louisはさまざまな優先度の高いキューの実装を提供し、それぞれのアルゴリズムの複雑さも含んでいます。
    いくつかの優先度の高いキュー内部の簡単な例として、いくつかのクールな実装が含まれています。 (彼の記事から取られた)私のお気に入りの1:

    data SkewHeap a = Empty | SkewNode a (SkewHeap a) (SkewHeap a) deriving (Show) 
    
    (+++) :: Ord a => SkewHeap a -> SkewHeap a -> SkewHeap a 
    [email protected](SkewNode x1 l1 r1) +++ [email protected](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] 
    

    いくつかのベンチマークはhereを発見し、むしろ面白いですることができますhaskell.orgのthreadhere

    +1

    +1 Monad.Readerの記事に言及しましたが、これは非常に便利です。 –

    +0

    上記のうち3つのみが優先度*検索*キューで、エントリの 'update'や' delete'のような操作も可能です。それらについては、この[Haskellメーリングリストのスレッド](http://thread.gmane.org/gmane.comp.lang.haskell.general/19734)で履歴書とベンチマークを作成しました。 – nh2

    +0

    上記のうちどれが優先キュー内の重複要素をサポートしているかを知ることは良いことです。 MaxとMinをサポートしています –

    関連する問題