このシリーズのアルゴリズムで多くのことを行うことの一つ これは正確にどういう意味ですか?
基本的に、アイデアは、ある頂点から別の頂点にグラフの周りを移動し、それらの相互接続された関係の特性を発見するということです。
最も一般的に使用されるアルゴリズムの二つは、深さ優先検索(DFS)と幅優先検索(BFS)です。,
どちらのこれらのアルゴリズムをトラバースグラフなどが異なる異なる。 DFSから始めましょう。
DFSは、その実装において”深く、頭を最初に行く”という哲学を利用しています。 アイデアは、最初の頂点(または場所)から始めて、終わりに達するまで一つの道を下り、目的地に到達しなければ、戻って別の道を下るということです。
例を見てみましょう。, このような有向グラフがあるとします。
it looks at its neighbors
then it looks at its neighbors’ neighbors
then finally finds t
See how different DFS and BFS behave?, 私はDFSが頭を上げるのが好きだと思うのが好きですが、BFSはそれをゆっくりと見て、すべてを一歩一歩観察するのが好きです。
今、私たちに際立っている一つの質問は次のとおりでなければなりません:”どの隣人がsの隣人から最初に訪問するかをどのように知るのですか?”
さて、キューのfirst-in-first-out(FIFO)プロパティを利用して、キューの最初の頂点をポップし、その未訪問の隣人をキューに追加し、キューが空になるか、追加した頂点が探していた頂点になるまでこのプロセスを続けることができます。,
JavaScriptのコードを見てみましょう。
BFSの分析
BFSが遅いように見えるかもしれません。 しかし、BFSとDFSの両方の視覚化を注意深く見ると、実際には同じランタイムを持っていることがわかります。
キューは、最大ですべての頂点が宛先に到達するまで処理されることを保証します。 つまり、最悪の場合、BFSはすべての頂点とすべてのエッジも調べます。,
BFSは遅く見えるかもしれませんが、より大きなグラフに実装すると、DFSは最終的に間違っている長い道をたどるのに多くの時間を無駄にすることがわかるので、実際にはより速く見なされます。 実際、BFSはある頂点から別の頂点への最短経路を決定するためのアルゴリズムでよく使用されますが、これらについては後で触れます。したがって、ランタイムは同じであるため、BFSのランタイムはO(V+E)であり、最大V頂点を保持できるキューを使用するため、スペースの複雑さはO(V)です。,
との類似
私は個人的にDFSとBFSがどのように機能するかを想像する他の方法であなたを残したいと思います。
DFSを考えるときはいつでも、多くの行き止まりにぶつかることによって正しい道を見つけるものを考えるのが好きです。 通常、これは食べ物を探すために迷路を通過するネズミのようになります。,p>
これは、プロセスの簡略化されたバージョンがどのように見えるかです:
今、bfsのために、私はいつもリップルとしてそれを想像してきました。,div>
BFSがソースから始まり、ソースのネイバーを最初に訪問し、次にネイバーを訪問することによって、より外側に行く方法とよく似ています。
リップルのように
概要
- 深さ優先探索(dfs)と幅優先探索(bfs)はどちらもグラフを走査するために使用されます。,
- DFSは、ターゲットを見つけるためにそのパスを使い果たすまで一つのパスを充電し、BFSは隣接する頂点を通ってリップルしてターゲットを見つけます。
- DFSはスタックを使用し、BFSはキューを使用します。DFSとBFSの両方の実行時間はO(V+E)、スペースの複雑さはO(V)です。
- の両方のアルゴリズムの異なる哲学が共同等の重要性をいかにトラバースです。