DFSまたはBFSにスタックを使用するか、キューを使用するかを常に混同しています。どのアルゴリズムがどのデータ構造を使用しているかを覚える方法について、誰かが直感を教えてくれませんか?
15 に答える
キューは一般に構造が水平であると考えることができます。つまり、幅/幅はキューに起因する可能性があります-BFS、
スタックは垂直構造として視覚化されるため、深さ-DFSがあります。
一枚の紙に小さなグラフを描き、各実装でノードが処理される順序について考えます。ノードに遭遇する順序とノードを処理する順序は、検索間でどのように異なりますか?
それらの1つはスタック(深さ優先)を使用し、もう1つはキュー(幅優先)を使用します(少なくとも非再帰的な実装の場合)。
バーベキューを心に留めて覚えています。バーベキューは「B」で始まり、「q」のような音で終わります。したがって、BFS->キューと残りのDFS->スタックです。
BFSは、最初に最も近い頂点を探索/処理してから、ソースから離れて外側に移動します。これを前提として、クエリされたときに、挿入された順序に基づいて最も古い要素を提供するデータ構造を使用する必要があります。キューは先入れ先出し(FIFO)であるため、この場合に必要なものです。一方、DFSは、最初に各ブランチに沿って可能な限り探索し、次にブラックトラックを探索します。この場合、スタックはLIFO(後入れ先出し)であるため、より適切に機能します。
BFSは常にキューを使用し、Dfsはスタックデータ構造を使用します。前の説明で、DFSがバックトラッキングを使用していることを説明しました。バックトラックはスタックによってのみ続行できることを忘れないでください。
アルファベット順に取ってください...
.... B(BFS)..... C ...... D(DFS)... ..
.... Q(キュー)... R ...... S(スタック)..。
BFS->B->バーベキュー->キュー
DFS->S->スタック
何も覚えていない。
検索に使用されるデータ構造がXであると仮定します。
幅優先=先にXに入ったノード最初にツリーで生成する必要があります。Xはキューです。
深さ優先=後でXに入ったノード最初にツリーで生成する必要があります。Xはスタックです。
簡単に言うと、スタックは後入れ先出し、つまりDFSです。キューは先入れ先出し、つまりBFSです。
Bfs;幅=>キュー
Dfs;深さ=>スタック
それらの構造を参照してください
深さ優先探索では、を使用しStack
て、行き止まりに達したときにどこに進むべきかを記憶します。
DFSS
スタック(後入れ先出し、LIFO)。DFSの場合、ルートから可能な限り最も遠いノードまで取得します。これはLIFOと同じ考え方です。
キュー(先入れ先出し、FIFO)。BFSの場合、1レベルずつ取得します。ノードの上位レベルにアクセスした後、ノードの下位レベルにアクセスします。これはFIFOと同じ考え方です。
特に若い学生にとって覚えやすい簡単な方法は、同様の頭字語を使用することです。
BFS =>キューにいるBoyFriendS(明らかに人気のある女性の場合)。
それ以外の場合、DFSは(スタック)です。
私はこの答えを共有したいと思います: https ://stackoverflow.com/a/20429574/3221630
BFSを取得し、キューをスタックに置き換えると、DFSと同じ訪問順序が再現され、実際のDFSアルゴリズムよりも多くのスペースが使用されます。
これは覚えておくべき簡単な例えです。BFSでは、一度に1つのレベルに移動しますが、DFSでは、他のレベルにアクセスする前に、できるだけ左に深く移動します。基本的に、たくさんのものを積み上げて、それらを1つずつ分析します。したがって、これがSTACKの場合、もう1つはキューです。
可能な限り大きく、「積み上げる」、「積み上げる」ことを忘れないでください。(DFS)。