Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

Javascriptでの深さ優先探索トラバーサル


DFSは、兄弟の頂点にアクセスする前に、子の頂点にアクセスします。つまり、その幅を調べる前に、特定のパスの深さを横断します。スタック(多くの場合、再帰によるプログラムの呼び出しスタック)は、アルゴリズムを実装するときに一般的に使用されます。

以下はDFSの仕組みです-

  • 隣接する未訪問の頂点にアクセスします。訪問済みとしてマークします。表示します。スタックにプッシュします。
  • 隣接する頂点が見つからない場合は、スタックから頂点をポップアップします。 (隣接する頂点がないスタックからすべての頂点がポップアップ表示されます。)
  • スタックが空になるまで、ルール1とルール2を繰り返します。

DFSトラバーサルがどのように機能するかを示す図を見てみましょう。

ステップ トラバーサル 説明
1 Javascriptでの深さ優先探索トラバーサル スタックを初期化します。
2 Javascriptでの深さ優先探索トラバーサル マークS 訪問したとおりにスタックに置きます。 Sから未訪問の隣接ノードを探索します 。 3つのノードがあり、それらのいずれかを選択できます。この例では、ノードをアルファベット順に取り上げます。
3 Javascriptでの深さ優先探索トラバーサル マークA 訪問したとおりにスタックに置きます。 Aから未訪問の隣接ノードを探索します 。両方のS およびD Aに隣接していますが、未訪問のノードのみを対象としています。
4 Javascriptでの深さ優先探索トラバーサル Dにアクセス 訪問済みとしてマークし、スタックに置きます。ここにBがあります およびC Dに隣接するノード そして両方とも訪問されていません。ただし、ここでもアルファベット順に選択します。
5 Javascriptでの深さ優先探索トラバーサル B、を選択します 訪問済みとしてマークし、スタックに置きます。ここでB 未訪問の隣接ノードはありません。そこで、 Bをポップします スタックから。
6 Javascriptでの深さ優先探索トラバーサル スタックトップが前のノードに戻っているかどうかを確認し、未訪問のノードがあるかどうかを確認します。ここに、 Dがあります スタックの一番上になります。
7 Javascriptでの深さ優先探索トラバーサル 未訪問の隣接ノードのみがDからのものです C 今。そこで、 Cにアクセスします 訪問済みとしてマークし、スタックに置きます。

Cとして 未訪問の隣接ノードがないため、未訪問の隣接ノードがあるノードが見つかるまでスタックをポップし続けます。この場合、何も存在せず、スタックが空になるまでポップし続けます。これをJavaScriptで実装する方法を見てみましょう。

DFS(node) {
   // Create a Stack and add our initial node in it
   let s = new Stack(this.nodes.length);
   let explored = new Set();
   s.push(node);

   // Mark the first node as explored
   explored.add(node);

   // We'll continue till our Stack gets empty
   while (!s.isEmpty()) {
      let t = s.pop();

   // Log every element that comes out of the Stack
      console.log(t);

   // 1. In the edges object, we search for nodes this node is directly connected to.
   // 2. We filter out the nodes that have already been explored.
   // 3. Then we mark each unexplored node as explored and push it to the Stack.
   this.edges[t]
   .filter(n => !explored.has(n))
   .forEach(n => {
      explored.add(n);
      s.push(n);
      });
   }
}

まあ、それは簡単でした。キューをスタックと出来上がりに交換しただけです。DFSがあります。これが2.の唯一の違いです。DFSは再帰を使用して実装することもできます。ただし、この場合、グラフが大きくなると、呼び出しスタックを追跡するためだけに追加のメモリが必要になるため、これは避けるのが最善です。

-

を使用してこれをテストできます
let g = new Graph();
g.addNode("A");
g.addNode("B");
g.addNode("C");
g.addNode("D");
g.addNode("E");
g.addNode("F");
g.addNode("G");

g.addEdge("A", "C");
g.addEdge("A", "B");
g.addEdge("A", "D");
g.addEdge("D", "E");
g.addEdge("E", "F");
g.addEdge("B", "G");

g.DFS("A");

出力

これにより、出力が得られます。

A
D
E
F
B
G
C

  1. JavaScriptでのスタックの実装

    以下は、JavaScriptでスタックを実装するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style>  

  2. JavaScriptでの線形検索の実装

    以下は、JavaScriptで線形検索を実装するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style>