誰でも私がDijkstraアルゴリズムのj2ME実装を高速化するのを助けることができますか?私は2つのループを持っています。私はほとんど23000ノードとそれらを接続50000のエッジを有するこの最も速いDijkstraアルゴリズムfor j2ME
while(for each item in Q)
{
//...do something.
//the following loop is to find the minimum
for(all un-visited nodes in Q)
{
//.. do something to get min.
}
}
よう...インナーループは、以下に言及される全ての改良後169330131回の平均を実行します。これは私のw910i携帯電話では5分、エミュレータでは数分以上かかる。これは私のためにあまりにも多く見えます。改善のための提案はありますか?私はすでに以下の改善が行われています。
- ベクトルの代わりに配列を使用します。
- 内部ループが訪問先ノードを考慮していないことを確認してください。訪問したすべてのノードは配列の最後にあり、Iノードはカウントを知っています。だから、私は簡単にそれらをすべてスキップすることができます。
私はこのアルゴリズムを参照しました。私はもっと簡単なアルゴリズムを見つけました。 Wikipediaで実装しなければならない場合、内部ループは2つあります。 Qは空ではありません。//外側ループ。 u:最小のdist [];を持つQの頂点//最初の内部ループ。 .... u://の2番目の内側ループの各近隣ループ。 2番目の内側ループが小さくなります。各ノードに対して最大5つのエッジが存在するため、最大4〜5回実行される可能性があります。エッジが2つ以上あるノードの数は、23000個のノードのうち1000個です。したがって、内部ループの実行時間は無視できます。 – dmantamp
実行時間についてのウィキペディアのセクションを読んだことがありますか?隣接リストとバイナリヒープまたはその他の構造体を優先キューとして使用することをお勧めします。これにより、最初の内部ループが大幅に削除されます –
Deekshit - Qの優先順位キュー(ヒープ)を使用すると、 Qの最小要素はO(1)であり、ノードとエッジの数でランタイムO(n + m)を合計します。 –