Algoritmo de búsqueda en profundidad (DFS)

Tabla de contenido

pensamiento algorítmico

Complejidad temporal y complejidad espacial

Implementación de algoritmo

Pros y contras del algoritmo

Campo de aplicación


pensamiento algorítmico

La idea del algoritmo de búsqueda en profundidad (DFS) es comenzar desde un determinado vértice inicial del gráfico, seguir una ruta para visitar todos los vértices del gráfico lo más profundamente posible, hasta que no pueda continuar, y luego regresar. y explorar otros caminos. Específicamente, el algoritmo DFS se implementa utilizando una estructura de datos de pila: después de visitar un vértice, sus vecinos no visitados se insertan en la pila y se marcan como visitados. Luego saque el siguiente vértice no visitado de la pila y repita el proceso anterior hasta que la pila esté vacía.

Complejidad temporal y complejidad espacial

La complejidad temporal del algoritmo de búsqueda en profundidad (DFS) es O (V + E), donde V es el número de vértices y E es el número de aristas. Esto se debe a que, en el peor de los casos, es necesario visitar todos los vértices y aristas para completar el recorrido.

El algoritmo DFS utiliza una estructura de datos de pila para almacenar los vértices a visitar y sus vértices vecinos, por lo que la complejidad del espacio depende de la cantidad de elementos almacenados en la pila. En el peor de los casos, es decir, cuando el gráfico es una estructura de cadena, la cantidad de elementos que el algoritmo DFS necesita almacenar alcanza el nivel O (V), por lo que la complejidad del espacio también es O (V).

Cabe señalar que en aplicaciones prácticas, la complejidad espacial del algoritmo DFS puede reducirse aún más mediante la limitación de llamadas recursivas. En algunos casos especiales, por ejemplo, se puede reducir aún más la ocupación del espacio de almacenamiento mediante poda.

Implementación de algoritmo

La siguiente es una implementación básica del algoritmo de búsqueda en profundidad de C#:

 /// <summary>
    /// 深度优先搜索算法
    /// </summary>
    public class DepthFirstSearch
    {
        private int V; // 图形中的顶点数
        private List<int>[] adj; // 邻接表表示

        public DepthFirstSearch(int v)
        {
            V = v;
            adj = new List<int>[V];
            for (int i = 0; i < V; ++i)
                adj[i] = new List<int>();
        }

        public void AddEdge(int v, int w)
        {
            adj[v].Add(w); // 将 w 添加到 v 的邻接表中
        }

        // 深度优先遍历算法
        private void DFSUtil(int v, bool[] visited)
        {
            visited[v] = true;
            Console.Write(v + " ");

            foreach (int i in adj[v])
            {
                if (!visited[i])
                    DFSUtil(i, visited);
            }
        }

        // 从顶点 v 开始进行深度优先遍历
        public void DFS(int v)
        {
            bool[] visited = new bool[V];
            DFSUtil(v, visited);
        }

    }



static void Main(string[] args)
    {
        DepthFirstSearch g = new DepthFirstSearch(4);
        g.AddEdge(0, 1);
        g.AddEdge(0, 2);
        g.AddEdge(1, 2);
        g.AddEdge(2, 0);
        g.AddEdge(2, 3);
        g.AddEdge(3, 3);

        Console.WriteLine("从顶点 2 开始的深度优先遍历:");
        g.DFS(2);
    }

La implementación define una DepthFirstSearchclase para representar un gráfico, que contiene una matriz de listas de adyacencia y métodos para agregar bordes y recorrido en profundidad. En DFSUtilel método, se utiliza una matriz booleana visitedpara realizar un seguimiento de los vértices visitados, y DFSUtilsus vecinos no visitados se atraviesan mediante llamadas recursivas. En DFSel método, cree una nueva visitedmatriz y llámela comenzando desde el vértice inicial especificado DFSUtil. Finalmente, Maincree una nueva Graphinstancia en el método y llame DFSal método para realizar un recorrido en profundidad comenzando desde el vértice 2. 

Pros y contras del algoritmo

Ventajas del algoritmo de búsqueda en profundidad:

  1. Fácil de implementar: el algoritmo de búsqueda en profundidad de C# es relativamente fácil de implementar y adecuado para que los principiantes lo aprendan y comprendan.
  2. Baja complejidad espacial: cuando la profundidad del recorrido excede la profundidad promedio del gráfico, la complejidad espacial del algoritmo de búsqueda en profundidad de C# es menor que la del algoritmo de búsqueda en amplitud.
  3. Encuentre un camino más rápido: debido a la naturaleza del algoritmo de búsqueda en profundidad, es más fácil encontrar un camino desde un vértice inicial hasta un vértice objetivo.

Desventajas del algoritmo de búsqueda en profundidad:

  1. Es posible que no se encuentre la ruta más corta: debido a la naturaleza del algoritmo de búsqueda en profundidad, es posible que no necesariamente pueda encontrar la ruta más corta desde el vértice inicial hasta el vértice objetivo. Cuando el vértice objetivo está en un nivel poco profundo, es posible que sea necesario atravesar una gran cantidad de nodos para alcanzar el vértice, lo que resulta en una baja eficiencia del algoritmo.
  2. Posibilidad de entrar en un bucle infinito: si hay ciclos en el gráfico, el algoritmo de búsqueda en profundidad puede quedarse atascado en un bucle infinito y no encontrar una ruta desde el vértice inicial a cualquier otro vértice. Por lo tanto, antes de aplicar el algoritmo de búsqueda en profundidad, debe asegurarse de que la entrada esté libre de ciclos.
  3. Menos eficiente para gráficos con bifurcaciones: en gráficos con una gran cantidad de ramas, el algoritmo de búsqueda en profundidad puede eliminar muchos nodos, lo que hace que el algoritmo sea menos eficiente.

Campo de aplicación

El algoritmo de búsqueda en profundidad (DFS) es un algoritmo básico de recorrido de gráficos que puede usarse ampliamente en muchos campos. Las siguientes son algunas áreas de aplicación típicas:

  1. Recorrido de gráficos: el algoritmo DFS se puede utilizar para recorrer gráficos, incluida la búsqueda de rutas, conectividad y bucles.

  2. Problemas de búsqueda: mediante el uso de técnicas de retroceso, el algoritmo DFS se puede utilizar para problemas de búsqueda, como problemas de laberintos, problemas de Sudoku, etc.

  3. Árbol de expansión mínimo: al ordenar todos los bordes por peso y agregar bordes al árbol de expansión, el algoritmo DFS puede implementar el algoritmo de Prim y el algoritmo de Kruskal para construir un árbol de expansión mínimo.

  4. Gráfico acíclico dirigido: en el gráfico acíclico dirigido (DAG), el algoritmo DFS se puede utilizar para problemas como la clasificación topológica y el cálculo de la ruta más larga.

  5. Inteligencia artificial: el algoritmo DFS también se puede utilizar en el campo de la inteligencia artificial, como el algoritmo de poda Alfa-Beta, la búsqueda heurística, etc.

En una palabra, el algoritmo DFS, como algoritmo básico de recorrido de gráficos, tiene una amplia gama de aplicaciones y puede resolver diversos problemas en muchos campos.

Supongo que te gusta

Origin blog.csdn.net/beenles/article/details/130729940
Recomendado
Clasificación