2012-10-26 8 views
6

私はClojureのデータ構造たい:リア 連想待ち行列のようなものはありますか?

    • プッシュからポップは私の値を持つ連想インデックスをすることができます(つまり、(assoc q 0 1)が1にフロントの値を設定します)

    Clojure(残念ながらPersistentQueueはNr.3を満たしていません)のようなものがありますか、それともベクターの上に構築する必要がありますか?

  • +0

    Clojureで実際のQueueオブジェクトを実装することもできます。次に、キューを必要とするJava(および多分Clojureの土地)の他のものと連携します。 – Rayne

    +0

    いつも一方の端に追加してもう一方の端を離しているなら、番号でインデックスされたマップにそれを保持することができます。次に頭と尾に割り当てられた番号を追跡して、assocで値を更新するときにそれらを再マップすることができます。 – Bill

    答えて

    1

    これらの要件を効率的に満たす標準的なClojureのデータ構造はありません。どこまでその

    わからない:このための偉大なデータ構造になる使用についてのClojure-devメーリングリストにいくつかの話ベクトルのRRB木がありました

    この種のデータ構造に興味があるなら、これを見てみる価値は間違いありません。

    0

    sorted-mapを使用できますが、インデックス部分を自分で実装する必要があります。

    たとえば、値vをプッシュするには、マップ内の最後のキーをインクリメントして生成されたキーを使用してアソシエートできます。ポップするには、地図の最初のキーを解読することができます。

    1

    データ構造の永続性を必要としない場合は、 Clojureプログラムでjava.util.LinkedListを使用できます。

    例:あなたはドキュメントやや鈍角であるC++ std::deque<T>のインデックス付きアクセス性能特性を好むかもしれないPythonのdequeあなた除くようなデックをしたいよう

    ;;; Creation 
    user> (import 'java.util.LinkedList) 
    java.util.LinkedList 
    user> (def linked-list (LinkedList. [:a :b :c :d :e])) 
    #'user/linked-list 
    
    ;;; Pop from the front 
    user> (.pop ^LinkedList linked-list) 
    :a 
    user> linked-list 
    #<LinkedList [:b, :c, :d, :e]> 
    
    ;;; Push to the rear, but costly 
    user> (.addLast ^LinkedList linked-list :x) 
    nil 
    user> linked-list 
    #<LinkedList [:b, :c, :d, :e, :x]> 
    
    ;;; Assoc (cf. (assoc linked-list 0 :y) 
    user> (.add ^LinkedList linked-list 0 :y) 
    nil 
    user> linked-list 
    #<LinkedList [:y, :b, :c, :d, :x]> 
    
    0

    が鳴ります。

    @ tnodaがjava.util.LinkedListを提案したのと同じように、Javaはjava.util.Dequeの実装で使用できます。

    独自のものを実装している場合、実装は非永続的なコレクションにとってはかなり簡単ですし、少なくとも、クロージャーのハッシュマップとベクターの「ハッシュされた配列ツリー」に対して実装するのはかなり直感的です最初は細部があなたを悩ませる場合。

    関連する問題