2017-11-09 23 views
1

Dijkstraの優先順位キューをminヒープとして実装するのが最善の場合はどのような場合ですか?最小ヒープと通常配列の通常の配列の実装

実行時間はO(V^2 + E)で、もう1つはO((V+E)logV)です。ときE< Vので、ヒープの実装が良いと再び思えるときV< EO(V^2 + E)= O(E^2)O((V+E)logV) = O(ElogV)、その後、 O(V^2+E) = O(V^2)、それはO((V+E)logV)=O(2VlogV)=O(VlogV)

よりも悪いです。

これらは同じスペースの複雑さも持っています。つまり、O(n)です。

Dijkstraの最小優先度キューの単純な配列実装が優れているが、実際にはケースを考えることができない場合があると仮定します。

+1

「普通の配列」として優先度キューを実装するのが最善であるとは思えません。あなたのやり方にかかわらず、あなたはO(1)挿入かO(1)のいずれかの削除を持つでしょう。キューサイズが3つのアイテムであっても、それは大きな違いになります。バイナリミニヒープを使用します。 –

+0

上記の意味は、O(1)挿入とO(n)削除、またはO(1)削除とO(n)挿入のいずれかを持つということです。いずれにせよ、それは準最適ではないだろう。 –

答えて

0

@JimMischelとしてのダイクストラについては、私はどの例も考えることができず、それは存在しないと思います。しかし、すべてのノードへの最短経路ではなく、単一の仕上げノードへの単一の最短経路を見つけることに重点を置くUCS(Uniform cost search)では、例を考えることができます。これは、状態間の遷移が一様であるという問題を伴います。

たとえば、15個のパズルを解決しているとしましょう(すべてのトランジションのコストは1です)。さらに、この種の問題では、ソリューションコストの範囲はよくわかっています。したがって、コストごとに、コストのかかるパスの単純なベクトルを格納するために、探索すべき状態の配列を持つことができます。この場合、すべての演算にはO(1)があり、バイナリminヒープよりも配列を使用するほうが効率的です。

+0

しかし、すべてのパスのコストが同じであれば、優先キューは必要ありません。単なるFIFOキュー。 –