無向グラフ、重み付けされていないグラフをトラバースするコードを作成しようとしています。本質的に、メソッドはノード(すべての隣接ノードを知っている)を渡されます。次に、この方法は、ノードからノードへ移動し、ノードが互いにリンクする情報を収集することによって、グラフのモデルを効率的に構築しなければならない*。最後に、このメソッドには、すべてのノードとそれらを接続するすべての頂点の完全なリストがあります。ひねられた無向グラフの重み付けされていないグラフをトラバースする:各ノードの最小訪問数
*問題の要点は効率的に言葉にあり、私がそれを意味するものです。私はこの小さなグラフにあなたの注意を向けてみましょう:
するのは、私は私が最小限に抑えたいC、B、F、D、H、JまたはEを訪問することができますいずれかのノードでG.を開始しましょう私がノードにアクセスした回数、ノードを訪問するためには、そのノードに向かう途中のすべてのノードを通過する必要があります。
例:次のノードはA、B、F、D、H、J、Eのいずれかになります。ただし、A以外のノードを訪問するには、非効率的であると考えられるGを再び通過する。 Aを訪問するには、GとCをもう一度訪問し、Cを通過してGを通過してグラフの残りの部分に戻る必要があります。だから、私はAに行くことにしました。これは、Gに到達するためにCを再び通過しなければならないことを意味します。したがって、論理的な観点からは、最後にCブランチを訪れるのは理にかなっています。
ただし、プログラムがノードGで開始するとき、分岐Cがデッドエンドにつながることは認識しません。私はこれを書いているので、それは不可能かもしれないと思うが、とにかく尋ねる:与えられた情報のみを使って、できるだけ効率的にこのグラフを横断することがある(すなわち、ノードは、その訪問し、エッジはそれらのノードから出てくる?それとも私はちょうど私がすべてのノードを訪れる保証するために変動ダイクストラのアルゴリズムで行くべき?
ことが重要ならばこれは、すべてJavaで記述されます。
DFSは、多数のサイクルを考慮した方が効率的でしょうか?私は両方を書くことができ、いくつかのデータセットを使って実験的に調べることができると思います。私はこれを忘れたとは信じられませんが、おそらく最高の答えです。ありがとう! – Smipims
@Smipims、Breadth First SearchまたはDjikstraは、再帰よりも優れた、または悪いサイクルにはなりません。すべてのノードにアクセスするには、すべてのノードにアクセスする必要があります。深刻なコールスタック(大きなグラフの場合)を避けるために、非再帰的なソリューションを使用すると利点があります。 –
私はそれがあなたが持っているリソースに依存し、さらに価値があると思います:時間および/またはメモリ空間:拡張されたノードを追跡しなければならないが、まだBFSで訪問する必要があると考えてください。あなたのグラフがすべてメモリ上にとどまることができるならば、それは問題ではないと思います(しかしノードごとに探索する暗黙のグラフを想像してください)。 – rano