DFS、BFS、BackTracking
7604 ワード
深度優先ナビゲーション
:ツリー資料構造でよく使われる探索方法.
ルートノード(または他の任意のノード)では、まずサブノードを完全にナビゲートします.すなわち,広範な探索を行う前に,まず深い探索を行う.
単純探索速度自体は幅優先探索(BFS)よりも遅いが,この方法ですべてのノードにアクセスできる.
DFSは再帰的に実現できる.今回の復帰を通じて、昨日と今日はN-Queens問題を理解し、解答しました.
写真でもっと詳しく見てみましょう.
この図は、ルートノード1号が呼び出されたときです.この絵の右側にはスタックが表現されています.1番を呼ぶと、1番はスタックに積み上げられます.
次は子供を見ることです.2番の子供を見てから、2番が山のように積まれているのを見ることができます.
次はもちろん3番スタックです.しかし、3日にはもう子供がいません.これで3番スタックが消え、2番スタックが再確認されます.2番も巡回できる子がいないので、2番スタックも削除できます.その結果を下図に示します.
2番と3番の子供がいないので、1番のスタックしか残っていません.1番のもう一人の子供は4番で、4番のスタックが1番のスタックに積み上げられます.
その後、上記の手順を繰り返し、5番と6番がスタックに積み上げられます.
6番には子供がいないので、6番スタックは消え、5番スタックは巡回しますが、5番にも子供がいないので、5番スタックも消えます.だから5番の下の4番のスタックの中ですでに5番を巡視したので、他の子供の7番を巡視して、7番のスタックがあります.
このプロセス全体を繰り返すと、次の図で終わります.
幅優先ナビゲーション
:BFSメソッドはDFSと同じですが、隣接ノードへの順次アクセスを実現します.つまり、同じレベルのノードに先にアクセスします.この場合、スタックではなくキューを使用して実装できます.
BFSを使用してキューを実装します。
:実はこのコードは私が書いたものではありません.私たちのCodeStatesのKing God Mincheolはテンプレートのように使えばいいとコード説明を書いています.理解して暗記すればいい.
function bfs() {
let Q = [
[0, 0],
[0, 1],
[0, 2],
[0, 3],
];
function enQ(ele) {
Q.push(ele)
}
function deQ() {
let head = Q[0];
Q = Q.slice(1);
return head;
}
// 4 X 4
while (Q.length > 0) {
// [0, 0]
let choice = deQ();
// [0, 1], [0, 2], [0, 3],
let row = choice[0];
let col = choice[1];
for (let col = 0; col < N; col++){
if (map[row + 1][col]에 놓을 수 있냐?) {
enQ([row + 1, col])
}
}
}
}
詳細 BackTracking
:
Reference
この問題について(DFS、BFS、BackTracking), 我々は、より多くの情報をここで見つけました https://velog.io/@hwanieee/DFSBFS-그리고-Backtrackingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol