web-dev-qa-db-ja.com

深さ優先検索と幅優先検索の理解

私はTetrisを楽しい副プロジェクト(宿題ではない)として作成しており、コンピューターがそれ自体を再生できるようにAIを実装したいと考えています。私がそれを行うと聞いた方法は、利用可能な場所を検索するためにBFSを使用してから、最も賢明なドロップ位置の合計スコアを作成することです...

しかし、BFSおよびDFSアルゴリズムを理解するのに苦労しています。私が最もよく学ぶ方法は、それを引き出すことです...私の図面は正しいですか?

enter image description here


enter image description here

ありがとう!

25
Growler

あなたのトラバーサルの最終結果は正しいです、あなたはかなり近いです。ただし、詳細は少しずれています。

深さ優先検索では、ノードをポップし、訪問済みとしてマークし、訪問していない子をスタックします。その順番で。順序はツリーには無関係に見えるかもしれませんが、サイクルのあるグラフがある場合、無限ループに陥る可能性がありますが、これは別の議論です。

アルゴリズムのベースラインを考えると、ルートノードをスタックにプッシュした後、最初の反復を開始し、すぐにAをポップします。これは、アルゴリズムが終了するまでスタックに残りません。 Aをポップし、D、C、Bを一度にスタックし(またはB、C、D、左から右、または右から左に選択できます)、Aを訪問済みとしてマークします。現在、スタックの下部がD、中央がC、上部がBです。

次にポップされるノードはBです。FとEをスタックにプッシュし(順序はあなたのものと同じにします)、Bを訪問済みとしてマークします。スタックには、上からE F C Dがあります。次に、Eがポップされ、新しいノードは追加されず、Eは訪問済みとしてマークされます。ループは続行され、F、C、およびDに対して同じことを行います。最後の順序はA B E F C Dです。

私はあなたと同じようにアルゴリズムを書き直そうとします:

Push root into stack
Loop until stack is empty
    Pop node N on top of stack
    Mark N as visited
    For each children M of N
        If M has not been visited (M.visited() == false)
            Push M on top of stack

幅優先検索の詳細については説明しません。アルゴリズムはまったく同じです。違いは、データ構造とその動作にあります。キューはFIFO(先入れ先出し))であり、そのため、下位レベルのノードへのアクセスを開始する前に、同じレベルのすべてのノードにアクセスします。

3
Vitor De Mario

まず第一に、私はあなたのトラバーサルが(簡単な概要から)大丈夫だと思います。以下に役立つリンクをいくつか紹介します。

私はこれについてこれまでにYouTubeでまともなビデオをいくつか見つけましたが、これはそれをカバーするもの(私が見た中では最高のものではありません)です http://www.youtube.com/watch?v=eXaaYoTKBlE 。おもしろい場合は、DFSとBFSの2つのバージョンを作成し、それらをベンチマークして、違いを観察します。理解を深めるためにトレースしたい場合は、グラフサーチャーやその他の便利なツールを http://www.aispace.org/downloads.shtml からダウンロードしてください。そして最後に、DFSとBFSに関するスタックオーバーフローの質問 http://www.stackoverflow.com/questions/687731/

1
wazy