Nuevo

6.3.2 Algoritmos de recorrido y búsqueda A lo ancho


6.3.2 Algoritmos de recorrido y búsqueda A lo ancho





Es un método para explorar un árbol o gráfico. En un BFS, primero explora todos los nodos a un paso, luego todos los nodos a dos pasos, etc.
La búsqueda en primer lugar es como tirar una piedra en el centro de un estanque. Los nodos que exploras "ondulan" desde el punto de partida.
Aquí hay una descripción de cómo un BFS atravesaría este árbol, comenzando con la raíz:

En la primera imagen de la figura anterior, hemos comenzado con el nodo más alto.
En la segunda imagen, recorremos todos los nodos presentes en el segundo nivel. En la tercera imagen, todos los nodos presentes en el tercer nivel y así sucesivamente. Hasta que lleguemos al final.
Ventajas:
·         Un BFS encontrará la  ruta más corta  entre el punto de inicio y cualquier otro nodo accesible. Una búsqueda en profundidad no necesariamente encontrará el camino más corto.

Desventajas
·         Un BFS en un árbol binario  generalmente  requiere más memoria que un DFS.

Ejemplo BFS de búsqueda en C#
En el siguiente código, he intentado crear la misma estructura que se muestra en la siguiente figura.
static void Main(string[] args)
        {
            Node topNode = new Node() { Value = 1 };
            topNode.Neighbours.Add(new Node() { Value = 2, Neighbours = new List<Node> { new Node() { Value = 5, Neighbours = new List<Node> { new Node() { Value = 9 } } } } });
            topNode.Neighbours.Add(new Node() { Value = 3, Neighbours = new List<Node> { new Node() { Value = 6, Neighbours = new List<Node>() { new Node() { Value = 10 } } }, new Node() { Value = 7 } } });
            topNode.Neighbours.Add(new Node() { Value = 4, Neighbours = new List<Node>() { new Node() { Value = 8 } } });
            Queue<Node> queue = new Queue<Node>();
            queue.Enqueue(topNode);
            while (queue.Count > 0)
            {
               var element =  queue.Dequeue();
                if (element.Neighbours.Count > 0)
                {
                    Console.WriteLine(element.Value);
                    foreach (var item in element.Neighbours)
                    {
                        queue.Enqueue(item);
                    }
                }
                else
                    Console.WriteLine(element.Value);
            }
            Console.Read();
        }
        public class Node
        {
            public Node()
            {
                Neighbours = new List<Node>();
            }
            public int Value { get; set; }
            public IList<Node> Neighbours { get; set; }
        }

No comments