プログラムの別の部分で使用するために、Java の PriorityQueue クラスを clojure でラップしたいと考えています。私が理解しようとしているのは、これを巧妙な方法で実行し、優先キューを不変にする方法があるかどうかです。これを行う良い方法はありますか、それとも PriorityQueue を変更可能なデータ構造として使用したほうがよいでしょうか?
Jason Baker
質問する
1380 次
2 に答える
9
可変データ構造を不変データ構造としてラップする簡単な方法はないと思います。新しいバージョンが巧妙な方法で古いバージョンとデータを共有できる場合、不変のデータ構造は効率的になりますPriorityQueue
。
永続的な優先キューが本当に必要な場合は、このスレッドが興味深いかもしれません。ただし、これらには線形時間の挿入があるようです。そのため、それが問題である場合は、別の実装を探す必要があります。
編集: よく考えてみると、永続的な優先度キューの単純な実装は、(prio, value)-ペアを並べ替えられたセットに格納するだけです。このようなもの:
(defn make-pqueue []
(sorted-set))
(defn pqueue-add [pq x prio]
(conj pq [prio x]))
(defn pqueue-peek [pq]
(first pq))
(defn pqueue-pop [pq]
(let [top (first pq)]
(disj pq top)))
もちろん、上記のコードはかなり制限されています (たとえば、複数のエントリはありません) が、アイデアを示しています。
于 2009-03-22T23:15:32.710 に答える
8
可変クラスを自動的に不変にすることはできません。いつでも Java クラスを直接呼び出して変更することができます。
不変性を強制するには、clojure で実装するか、Java クラスを拡張してすべての可変メソッド実装で例外をスローします。
于 2009-03-23T12:32:08.770 に答える