16

これはJavaドキュメントから直接です:

このクラスとそのイテレーターは、CollectionおよびIteratorインターフェースのすべてのオプションのメソッドを実装します。メソッドiterator()で提供されるイテレータは、特定の順序で優先キューの要素をトラバースすることが保証されていません。順序付きトラバーサルが必要な場合は、Arrays.sort(pq.toArray())の使用を検討してください。

したがって、基本的に、PriorityQueueは正常に機能しますが、独自の組み込みtoString()メソッドを使用して画面に出力すると、この異常が実際に動作していることがわかり、イテレータが提供した(そして使用した)理由を誰かが説明できるかどうか疑問に思いました。内部的に)PriorityQueueを自然な順序でトラバースしませんか?

4

5 に答える 5

36

基礎となるデータ構造がそれをサポートしていないためです。バイナリヒープは部分的にのみ順序付けられており、ルートに最小の要素があります。これを削除すると、次に小さい要素がルートになるようにヒープが並べ替えられます。効率的な順序付きトラバーサルアルゴリズムがないため、Javaでは提供されていません。

于 2010-02-17T00:20:49.797 に答える
4

PriorityQueuesは、バイナリヒープを使用して実装されます。 ヒープはソートされた構造ではなく、部分的に順序付けられています。各要素には「優先順位」が関連付けられています。ヒープを使用して優先度キューを実装すると、ヒープのルートノードに常に最も優先度の高い要素が含まれます。したがって、優先度キューでは、優先度の高い要素が優先度の低い要素の前に提供されます。2つの要素の優先度が同じである場合、それらはキュー内の順序に従って提供されます。ヒープは、要素を削除するたびに更新され、ヒーププロパティを維持します。

于 2017-09-28T07:39:45.403 に答える
1

最初は、おそらくデータが保存されている順序でデータをトラバースしていると思います。キューにアイテムを挿入する時間を最小限に抑えるために、通常、すべてのアイテムが並べ替えられた順序で保存されるわけではありません。

于 2010-02-17T00:22:25.410 に答える
0

そうですね、Javadocが言うように、それが実装された方法です。優先キューは、基になるデータ構造としておそらくバイナリヒープを使用します。アイテムを削除すると、ヒープのプロパティを保持するためにヒープが並べ替えられます。

第二に、特定の実装を結び付けることは賢明ではありません(ソートされた順序を強制します)。現在の実装では、任意の順序で自由にトラバースし、任意の実装を使用できます。

于 2010-02-17T00:23:52.023 に答える
0

バイナリヒープは、優先キューを実装する効率的な方法です。ヒープの順序に関する唯一の保証は、一番上のアイテムが最高の優先順位を持っていることです(順序によっては、「最大」または「最小」である可能性があります)。ヒープは、次のプロパティを持つバイナリツリーです。Shapeプロパティ:ツリーは上から下に左から右に塗りつぶされます順序プロパティ:任意のノードの要素は、2つの子ノードよりも大きい(または最小の場合は小さい)。イテレータがすべての要素にアクセスすると、おそらくレベル順トラバーサルでアクセスします。つまり、次のレベルに進む前に、各レベルの各ノードに順番にアクセスします。ノードの優先度が子よりも高いという順序に関する唯一の保証があるため、各レベルのノードは特定の順序になりません。

于 2010-02-17T00:36:37.560 に答える