2009-11-25 12 views
5

短編小説、私はグラフを実装していますが、今ではKruskalに取り組んでいます。優先キューが必要です。私の優先度キューの定義は、最小のキーを持つ要素が最初に来るということですか?これは間違っていますか?なぜなら、重み付けされたエッジ(または数値)をキューに挿入すると、ソートされないからです。Java優先キューはどのように動作するはずですか?

PriorityQueue<Integer> tja = new PriorityQueue<Integer>(); 
tja.add(55); 
tja.add(99); 
tja.add(1); 
tja.add(102); 
tja.add(54); 
tja.add(51); 
System.out.println(tja); 

これはこれを印刷します。 [1,4,51,102,99,55]。これは、私がそれらが欲しいのと同じようにソートされていません!そして、はい、私はエッジオブジェクトから番号を抽出し、そのintに基づいて比較する優先順位キューに入るcomperatorを作った。これはうまくいくはずですか、あるいは私はこのデータ構造の仕組みの全体概念を完全に誤解していますか?

+0

ソートされたレイアウトを取得するには、 'while(!tja.isEmpty()){ System.out.println(tja.poll());を使用する必要があります。 } ' – serhii

答えて

16

System.out.printlnはイテレータを使用しているtoString()メソッドを呼び出していますが、イテレータは自然順序付けを保証するものではありません。 docs: "メソッドiterator()で提供されるIteratorは、優先順位キューの要素を特定の順序でトラバースすることは保証されていません。"

+0

したがって、プライオリティキューを印刷する可能性はありますか? –

+0

心配しないで、そうする方法はありません...あなたが私を許したら、私は答えを更新します。 –

6

JavaでPriorityQueueの経験はありませんが、iterator()またはtoString()iterator()を使用)に統合されていないようです。

そうした場合:

while (tja.size()>0) 
     System.out.println(tja.remove()); 

あなたは正しい結果を得ます。

+0

パーフェクトなので、削除するまで構造体が正しくソートされません。 – Algific

+1

いいえ、構造体は常に正しくソートされています。しかし、poll()、peek()、remove()を呼び出すと、正しい順序で要素が取得されます。 – omerkudat

+0

@data_heppいいえ。削除は構造体をソートしません。構造体はすでにソートされていますが、内部的に使用されるtoString()またはiterator()は、順番にトラバーサルを保証しません。 – Varun

1

バイナリヒープの機能に精通していますか?そうでない場合は、最小のヒープと最大のヒープ構造を実行してください。 PriorityQueueはヒープに実装されています。 PriorityQueueはアイテムを昇順でソートしませんが、ヒープソートを行います。

は、リンクを通過します:あなたが得るPriority Queue

出力が正しいです。

関連する問題