Algoritmo de búsqueda en amplitud (BFS)

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 amplitud (BFS) es comenzar desde un determinado vértice inicial del gráfico, primero visitar todos los vértices vecinos de este vértice por turno y luego atravesar todos los vértices del gráfico capa por capa. De acuerdo con la distancia, primero visite el vértice más cercano al vértice actual y luego expanda gradualmente hacia afuera. Específicamente, el algoritmo BFS se implementa utilizando una estructura de datos de cola: después de visitar un vértice, sus vecinos no visitados se agregan a la cola y se marcan como visitados. Luego saque el siguiente vértice no visitado de la cola y repita el proceso anterior hasta que la cola esté vacía.

Complejidad temporal y complejidad espacial

La complejidad temporal del algoritmo de búsqueda en amplitud (BFS) 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 BFS utiliza una estructura de datos de cola para almacenar los vértices a los que se accederá y los vértices vecinos, por lo que la complejidad del espacio depende de la cantidad de elementos almacenados en la cola. En el peor de los casos, es decir, cuando el gráfico es un árbol binario completo, la cantidad de elementos que el algoritmo BFS necesita almacenar alcanza el nivel O (V), por lo que la complejidad del espacio también es O (V).

Implementación de algoritmo

El siguiente es un código de muestra para implementar el algoritmo de búsqueda en amplitud en lenguaje C#:

    /// <summary>
    /// 广度搜索算法
    /// </summary>
   public class BreadthFirstSearch
    {
        private int V;              // 图中节点的数量
        private List<int>[] adj;    // 存储邻接表表示的图

        public BreadthFirstSearch(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);
        }

        // 查找从起点s到终点t的最短路径
        public List<int> BFS(int s, int t)
        {
            bool[] visited = new bool[V];
            int[] prev = new int[V];
            for (int i = 0; i < V; i++)
            {
                prev[i] = -1;
            }
            Queue<int> queue = new Queue<int>();
            visited[s] = true;
            queue.Enqueue(s);
            while (queue.Count > 0)
            {
                int v = queue.Dequeue();
                for (int i = 0; i < adj[v].Count; i++)
                {
                    int w = adj[v][i];
                    if (!visited[w])
                    {
                        visited[w] = true;
                        prev[w] = v;
                        queue.Enqueue(w);
                        if (w == t)
                        {
                            return GetPath(prev, s, t);
                        }
                    }
                }
            }
            return null;
        }

        // 根据prev数组生成路径
        private List<int> GetPath(int[] prev, int s, int t)
        {
            List<int> path = new List<int>();
            int x = t;
            while (x != s)
            {
                path.Add(x);
                x = prev[x];
            }
            path.Add(s);
            path.Reverse();
            return path;
        }
    }



        static void Main(string[] args)
        {

            BreadthFirstSearch g = new BreadthFirstSearch(6);
            g.AddEdge(0, 1);
            g.AddEdge(0, 2);
            g.AddEdge(1, 3);
            g.AddEdge(1, 4);
            g.AddEdge(2, 4);
            g.AddEdge(3, 5);
            g.AddEdge(4, 5);

            List<int> path = g.BFS(0, 5);
            foreach (int node in path)
            {
                Console.Write(node + " ");
            }
            Console.ReadLine();
        }

En el código de muestra anterior, se define una clase BreadthFirstSearch para representar el gráfico, que contiene métodos para agregar aristas y realizar una búsqueda en amplitud. En la función Principal se crea un gráfico con 6 vértices y se agregan 6 aristas. Finalmente, se llama al método BFS para realizar una búsqueda en amplitud en el gráfico, comenzando desde el vértice 2. En el método BFS, se utiliza una matriz visitada para registrar los vértices visitados y una cola para almacenar los vértices a visitar. Cada vez que se visita un vértice, sus vecinos no visitados se agregan a la cola y luego el siguiente vértice no visitado se saca de la cola y el proceso anterior se repite hasta que la cola esté vacía. 

Pros y contras del algoritmo

Ventajas del algoritmo de búsqueda en amplitud:

  1. Puede encontrar el camino más corto desde el punto de partida hasta todos los demás vértices, por lo que es más adecuado para resolver el problema del camino más corto que la búsqueda en profundidad.

  2. En algunos casos especiales, la eficiencia del algoritmo BFS es mayor que la del algoritmo DFS. Por ejemplo, cuando el gráfico es relativamente denso o el nodo objetivo está relativamente cerca del nodo inicial, el algoritmo BFS suele ser más rápido que el algoritmo DFS.

  3. El algoritmo BFS se puede utilizar para juzgar si un gráfico es bipartito, etc., y tiene una amplia gama de aplicaciones.

Desventajas del algoritmo de búsqueda en amplitud:

  1. La complejidad del espacio puede ser alta cuando se trata de gráficos más grandes. En el peor de los casos, es decir, cuando el gráfico es un árbol binario completo, la cantidad de elementos que el algoritmo BFS necesita almacenar alcanza el nivel O (V), por lo que la complejidad del espacio también es O (V).

  2. Para algunos gráficos, es posible que el algoritmo BFS no pueda encontrar la ruta más corta, porque el algoritmo solo puede encontrar la ruta más corta desde el punto inicial y no puede garantizar que sea la ruta más corta en todo el gráfico. Por ejemplo, el algoritmo BFS no puede calcular correctamente la ruta más corta en un gráfico con bordes ponderados negativamente.

Campo de aplicación

El algoritmo de búsqueda en amplitud (BFS) tiene una amplia gama de aplicaciones en muchos campos; las siguientes son algunas áreas de aplicación comunes:

  1. Procesamiento de imágenes: el algoritmo BFS se puede utilizar en segmentación de imágenes, detección de objetos, etc. Por ejemplo, en una imagen binaria, el algoritmo BFS se puede utilizar para encontrar todos los píxeles conectados a un punto determinado.

  2. Procesamiento del lenguaje natural: el algoritmo BFS se puede utilizar para resolver el problema de la relación léxica en el lenguaje. Por ejemplo, el algoritmo BFS se puede utilizar para encontrar todos los sinónimos posibles que comiencen con una palabra.

  3. Diseño de juegos: el algoritmo BFS se puede utilizar en la planificación de rutas en juegos, simulación de comportamiento de IA, etc. Por ejemplo, en terrenos complejos, el algoritmo BFS se puede utilizar para encontrar el camino más corto para evitar obstáculos.

  4. Búsqueda web: el algoritmo BFS se puede utilizar para rastrear páginas y clasificar páginas web en motores de búsqueda. Por ejemplo, en Internet, puede utilizar el algoritmo BFS para buscar todos los sitios web relacionados con palabras clave y clasificarlos.

  5. Optimización de consultas de bases de datos: el algoritmo BFS se puede utilizar en la optimización de consultas en la optimización de bases de datos y otros aspectos. Por ejemplo, en una base de datos relacional, puede utilizar el algoritmo BFS para buscar todas las tablas e índices de datos relacionados.

  6. Aprendizaje automático: el algoritmo BFS se puede utilizar en árboles de decisión, clasificación de imágenes, etc. Por ejemplo, en la clasificación de árboles de decisión, el algoritmo BFS se puede utilizar para la selección de características y la división de nodos.

En resumen, el algoritmo BFS es un algoritmo muy general que puede desempeñar un papel en muchos campos, especialmente para resolver el problema de la ruta más corta en un gráfico.

Supongo que te gusta

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