深さ優先検索 (DFS) アルゴリズムのアイデア、アルゴリズムの実装、およびその応用シナリオ


序文

  深さ優先検索 (DFS) アルゴリズムは、グラフやツリーに関連する問題を解決するためによく使用される古典的なグラフ走査アルゴリズムです。開始ノードから開始し、続行できなくなるまで下方向に探索を続け、その後前のノードに戻り、グラフまたはツリー全体が探索されるまで他の未探索のパスを探索し続けます。

  この記事では、DFS アルゴリズムのアルゴリズムのアイデア、アルゴリズムの実装、およびアプリケーション シナリオについて詳しく紹介します。


1. DFSアルゴリズムの考え方

深さ優先検索アルゴリズムは、ツリーの前順序走査に似ており、スタックのデータ構造に基づいて実装されます。アルゴリズムの考え方は次のとおりです。

  1. 開始ノードを現在のノードとして選択し、訪問済みとしてマークします
  2. 現在のノードの隣接ノードを確認し、未訪問の隣接ノードを次の現在のノードとして選択し、スタックに追加します 3. 現在のノードの
  場合ノードに未訪問の隣接ノードがない場合は、前のノードに戻ります、つまり、スタックからノードを現在のノードとしてポップします; 4.
  スタックが空になるか、すべてのノードがアクセスされるまで、ステップ 2 と 3 を繰り返します。

  DFS アルゴリズムは、再帰または明示的なスタックを使用して上記のプロセスを実装します。その中心となるアイデアは、続行できなくなるまでパスをできるだけ深く探索し、その後、前のノードに戻って他のパスの探索を続けることです。


2. DFSアルゴリズムの実装(擬似コード)

再帰的な実装

// 图的邻接矩阵表示
int graph[MAX][MAX];
int visited[MAX]; // 记录节点是否被访问

// DFS递归实现
void DFS(graph G, int v)
{
    
    // 从顶点v出发深度优先遍历图G
	visit(v);			// 访问顶点v
	visited[v] = 1;		// 更改已访问标记
	for(int w = FirstNeighbor(G,v); w >= 0; w = NextNeighbor(G,v,w) )
		if(!visited[w])
			DFS(G,w);
}

非再帰的な実装

// 图的邻接矩阵表示
int graph[MAX][MAX];
int visited[MAX]; // 记录节点是否被访问

// 栈的定义
int stack[MAX];
int top = -1;

// 压栈操作
void push(int v)
{
    
    
    stack[++top] = v;
}

// 出栈操作
int pop()
{
    
    
    return stack[top--];
}

// DFS非递归实现
void DFS_iterative(int start, int n)
{
    
    
    int i, v;

    // 将起始节点标记为已访问,并将其压入栈中
    visited[start] = 1;
    push(start);

    while (top != -1)
    {
    
    
    	// 出栈当前节点
        v = pop();
        // 访问当前节点
 		visit(v);

        // 遍历当前节点的邻接节点
        for (i = 0; i < n; i++) {
    
    
            // 如果邻接节点未被访问过,将其标记为已访问并压入栈中
            if (graph[v][i] == 1 && !visited[i]) 
            {
    
    
                visited[i] = 1;
                push(i);
            }
        }
    }
}

  再帰を使用して実装された DFS アルゴリズムはシンプルで明確ですが、大規模なグラフではスタック オーバーフローの問題が発生する可能性があります。明示的スタックによって実装された DFS アルゴリズムは、大規模なグラフの処理により適していますが、コードはより複雑です。


3. DFS アルゴリズムの適用シナリオ

DFS アルゴリズムは、次の側面を含むがこれらに限定されない、多くの分野で広く使用されています。

1. グラフの走査

DFS アルゴリズムを使用すると、無向グラフまたは有向グラフをトラバースし、グラフの接続性やパス検索などの問題に対する効果的な解決策を提供できます。

2. トポロジカルソート

DFS アルゴリズムは、トポロジカル ソートの考え方を使用して有向非巡回グラフをソートでき、タスク スケジューリング、コンパイラ、その他の分野で一般的に使用されます。

3. 接続性分析

DFS アルゴリズムを使用すると、グラフの接続性を判断することができます。つまり、グラフ内の 2 つの指定されたノードを接続するパスが存在するかどうかを判断できます。

4. バックトラッキングアルゴリズム

バックトラッキング アルゴリズムは、DFS アルゴリズムに基づく特別なアプリケーションであり、組み合わせ最適化、順列、組み合わせなどの問題を解決するためによく使用されます。

5. 迷路を解く

DFS アルゴリズムは、迷路の問題を解く、つまり、開始点から終了点までの経路を見つけるために使用できます。


要約する

  深さ優先検索 (DFS) アルゴリズムは、グラフ走査にとって重要なアルゴリズムです。グラフ内の各パスの最大深さを調査することにより、グラフのノードを横断します。DFS アルゴリズムは、スタックのデータ構造を使用して非再帰的トラバーサルを実装し、再帰的呼び出しスタックのオーバーフローの問題を回避します。

  DFS アルゴリズムの非再帰的実装では、最初に開始ノードを選択し、それを訪問済みとしてマークし、スタックにプッシュします。次に、スタックの最上位ノードをポップし、そのノードにアクセスし、ノードの近隣ノードを走査するという手順をループします。訪問されていない隣接ノードについては、それらを訪問済みとしてマークし、スタックにプッシュします。スタックが空になるまで上記の手順を繰り返します。

  DFS アルゴリズムは無限ループに陥る可能性があるため、繰り返しの訪問を避けるために、アルゴリズムに訪問ノードのマーキングと判定を追加する必要があることに注意してください。

  DFS アルゴリズムのアルゴリズムの考え方と実装方法を理解することは、アルゴリズムをより深く理解し、適用してグラフ関連のさまざまな実際的な問題を解決するのに役立ちます。

おすすめ

転載: blog.csdn.net/qq_43341612/article/details/129540553