Saltar a un capítulo clave
¿Qué es la Búsqueda del Primero en Amplitud en Informática?
La búsqueda por amplitud (BFS) es una técnica clave en informática, sobre todo en las áreas de teoría de grafos y manipulación de estructuras de datos. Es esencialmente un algoritmo para recorrer o buscar estructuras de datos en forma de árbol o grafo. El factor único de este algoritmo de búsqueda es que explora todos los vértices de un grafo en el nivel de profundidad actual antes de pasar a los nodos del siguiente nivel de profundidad.
El nivel de profundidad, en este contexto, se refiere a la distancia (el número mínimo de aristas) desde la raíz o nodo inicial designado. Así, el nivel de profundidad 0 significa el nodo inicial; el nivel de profundidad 1 incluye todos los nodos conectados directamente al nodo inicial, y así sucesivamente.
Comprender el algoritmo de búsqueda Breadth First
El algoritmo de Búsqueda Primero en Profundidad visita sistemáticamente todos los nodos del nivel de profundidad actual antes de pasar al siguiente. Este proceso "nivel a nivel" distingue al BFS de otros algoritmos de búsqueda, como la Búsqueda Primero en Profundidad, que recorre un camino lo más profundo posible antes de retroceder. Para implementar el algoritmo BFS, se utiliza principalmente una estructura de datos llamada Cola, siguiendo la estrategia FIFO (First in, First out).
El pseudocódigo sencillo para BFS es el siguiente:BFS (grafo G, vértice inicial s): // todos los nodos inicialmente inexplorados marca s como explorados deja Q = estructura de datos de cola, inicializada con s mientras Q no esté vacío: elimina el primer nodo de Q, llámalo v para cada arista(v, w): // para los vecinos de v si w no está explorado: marca w como explorado añade w a Q (al final)
Componentes clave del algoritmo de búsqueda Breadth First
Los componentes principales del algoritmo de búsqueda Breadth First Search son:- El grafo: una estructura de datos no lineal formada por nodos y aristas.
- La cola: un tipo particular de estructura de datos abstracta en la que los elementos se mantienen en orden, y las operaciones principales son poner en cola (adición de entidades) y quitar de cola (eliminación de entidades).
- La matriz visitada: para llevar la cuenta de los nodos ya visitados, evitando bucles infinitos.
Ejemplos prácticos de BFS
Cuando utilizas el algoritmo BFS en una estructura de grafos, creas implícitamente un árbol Breadth-First. Este árbol tiene su raíz en el nodo origen, y todos los nodos a la misma distancia del origen están en el mismo nivel de profundidad del árbol.Supongamos un grafo no ponderado y no dirigido como el siguiente:
1 | --- | 2 |
| | | | |
3 | --- | 4 |
Casos reales de uso de la búsqueda BFS
BFS tiene mucha importancia práctica en los escenarios de la vida real. Aquí tienes unos cuantos:- En los algoritmos de encaminamiento de redes, la BFS ayuda a encontrar todos los nodos vecinos.
- Para encontrar rutas en mapas geográficos reales, basados en píxeles o virtuales.
- En el rastreo web, donde las arañas utilizan BFS para limitar su profundidad de rastreo.
- En sitios web de redes sociales, donde el BFS puede ayudar a encontrar a todas las personas que se encuentran a una determinada distancia de "amistad", por ejemplo.
Además, el algoritmo BFS es fundamental para el aprendizaje automático. Desempeña un papel crucial en el modelo de aprendizaje basado en árboles de decisión a la hora de extraer patrones útiles o árboles de decisión de los conjuntos de datos.
Búsqueda en primer lugar en amplitud frente a Búsqueda en primer lugar en profundidad
Al examinar el contraste entre la Búsqueda Primero en Amplitud (BFS) y la Búsqueda Primero en Profundidad (DFS), observamos que en realidad son dos piedras angulares diferentes de la teoría de grafos en informática, cada una con características y casos de uso distintivos. Su principal punto en común es que ambos son algoritmos para recorrer y buscar dentro de estructuras de datos de grafos, pero la forma en que llevan a cabo este proceso es muy diferente.
Similitudes y diferencias: Búsqueda en primer lugar en amplitud y búsqueda en primer lugar en profundidad
A pesar de sus evidentes diferencias, BFS y DFS comparten un puñado de características. Por ejemplo, ambos comienzan en un nodo raíz o en cualquier nodo arbitrario para recorrer el grafo. Además, su objetivo es visitar cada nodo del grafo exactamente una vez, por lo que mantienen una lista o hash "visitado" para rastrear los nodos ya encontrados.
La principal diferencia entre estos algoritmos de búsqueda radica en su forma de recorrer la estructura. El BFS recorre el grafo nivel a nivel. Visita los nodos nivel por nivel, es decir, primero visita los nodos del nivel de profundidad 0 (la raíz), luego los del nivel de profundidad 1, y así sucesivamente. Por el contrario, DFS sigue una estrategia diferente. Recorre un camino lo más profundo posible antes de retroceder.
Otra diferencia considerable es la estructura de datos que utilizan. BFS utiliza una Cola, que sigue la regla FIFO (First In First Out). En cambio, DFS utiliza una Pila, que obedece al principio del Último en Entrar, Primero en Salir (LIFO).
Vamos a articular más claramente el BFS y el DFS:
Algoritmo | Patrón de Recorrido | Estructura de datos |
Búsqueda por niveles | Nivel por nivel | Cola (FIFO) |
Búsqueda en profundidad | Tan profunda como sea posible | Pila (LIFO) |
Otro aspecto destacable de BFS y DFS es su complejidad temporal y espacial. Tanto BFS como DFS tienen una complejidad temporal lineal, marcada como \( O(V + E) \), donde \( V \) es el número de vértices, y \( E \) es el número de aristas. Aunque su complejidad temporal es similar, su complejidad espacial difiere debido a su naturaleza contrastada. La complejidad espacial del BFS puede ser mayor, sobre todo cuando se trata de un grafo que crece exponencialmente, mientras que el DFS ocupa menos espacio, ya que sólo necesita almacenar los nodos de la rama activa del árbol o grafo.
Elegir entre la Búsqueda Primero en Amplitud y la Búsqueda Primero en Profundidad: Cuándo y por qué
Para decidir entre utilizar BFS o DFS, debes tener en cuenta la naturaleza del problema al que te enfrentas y lo que esperas conseguir. A continuación encontrarás una guía que te ayudará a hacer una selección consciente:
- Si sabes que existe una solución cerca de la raíz del árbol, BFS sería una mejor opción, ya que minimiza el coste del camino.
- Si el árbol es muy ancho (es decir, contiene muchos nodos), quizá te convenga utilizar DFS, ya que ocupa menos memoria.
- Si el grafo es acíclico o arborescente, DFS puede ser más beneficioso.
- Si necesitas encontrar el camino más corto o necesitas un recorrido nivel a nivel, BFS debería ser tu elección.
- DFS puede serte significativamente más útil si está bien obtener cualquier respuesta válida, no necesariamente el camino más corto.
Merece la pena mencionar que cuando se trata de cuestiones de conectividad o de encontrar puentes/puntos de articulación en una red, DFS suele superar a BFS y es preferible. Pero recuerda que BFS suele ser lo más adecuado para grafos no ponderados o para encontrar la ruta más corta en grafos ponderados que tengan pesos no negativos.
Al final, la elección entre BFS y DFS no siempre está clara. A menudo, el algoritmo más eficaz dependerá en gran medida de las características específicas de la tarea en cuestión.
Explorando el árbol de búsqueda BFS
Cuando se trata de la implementación del algoritmo de Búsqueda Primero en Amplitud (BFS), podemos visualizar el proceso y el resultado a través de un tipo particular de árbol llamado árbol BFS. Esta estructura de datos representa esencialmente la secuencia de exploración utilizada durante el recorrido BFS.
Estructura y función del árbol de búsqueda BFS
El árbol BFS, también conocido como Árbol de Búsqueda Primero en Amplitud, es un árbol enraizado que se utiliza para mostrar el orden de exploración de los nodos durante un algoritmo de travesía BFS. Es una representación diagramática fiable que esboza claramente cómo BFS explora los nodos de un grafo, procediendo nivel a nivel.
El árbol BFS está diseñado de tal forma que tiene su raíz en un nodo específico llamado nodo "origen" o "inicio" o en cualquier nodo arbitrario del grafo. A continuación, el árbol se expande a lo ancho, incorporando todos los nodos alcanzables desde el origen. Cada nodo del árbol representa un vértice del grafo, y cada arista del árbol corresponde a una arista directa del grafo. El árbol crece nivel a nivel, y cada nivel comprende nodos que están a la misma distancia (número de aristas) del nodo raíz. Cada nivel se explora por completo antes de pasar al siguiente.
Un nivel, en este caso, se refiere al conjunto de nodos que están a la misma distancia del nodo raíz. El nivel 0 es el nodo inicial; el nivel 1 son todos los nodos conectados directamente al nodo inicial, y así sucesivamente.
Nodo en el Árbol BFS | Corresponde a |
Nodo Raíz | Vértice Origen/Inicio en el Gráfico |
Arista en el Árbol BFS | Arista directa en el gráfico |
Nivel en el Árbol BFS | Nodos a la misma distancia del Nodo Raíz |
Para un grafo conectado, el árbol BFS suele ser único, dado que se especifica el vértice inicial. Sin embargo, para un grafo desconectado o un grafo en el que el vértice inicial no es único, puede haber múltiples árboles BFS posibles.
La función principal de este árbol es destacar cómo se encuentran los nodos durante el recorrido BFS. Además, también ayuda a ilustrar cómo el BFS puede encontrar el camino más corto entre dos nodos en función del número de saltos (o aristas).
El proceso de desarrollo de un árbol de búsqueda BFS
La construcción de un árbol BFS se alinea con el funcionamiento sistemático del algoritmo BFS. Si recuerdas, BFS avanza nivel a nivel, visitando cada nodo no visitado en el nivel actual antes de pasar al siguiente. Cada vez que se descubre un nuevo nodo durante este recorrido, se crea una arista desde el nodo actual (que ya forma parte del árbol BFS) hasta el nodo recién descubierto. Este enfoque sistemático da como resultado la formación de un árbol BFS.
El proceso de elaboración de un árbol BFS puede ilustrarse con los siguientes pasos:
Empieza por un nodo raíz del grafo G. Crea una cola, Q, y añade la raíz a ella. Marca la raíz como visitada. Mientras Q no esté vacío, realiza los siguientes pasos: retira de la cola el primer nodo de Q, haz referencia a él como "n". Para cada nodo adyacente aún no visitado, "m", de "n": añade "m" a Q y márcalo como visitado. Dibuja una arista de "n" a "m" en el árbol BFS.
Siguiendo este proceso, obtendrás un árbol BFS que refleja los pasos dados por el algoritmo BFS durante el recorrido del grafo original. Recuerda que el árbol BFS no representará necesariamente la estructura del grafo original en su totalidad, pero sí el camino más corto (menor número de aristas) desde el nodo raíz a cualquier otro nodo del árbol.
En resumen, crear un árbol de Búsqueda Primero en Amplitud implica utilizar un algoritmo sistemático para recorrer un grafo nivel a nivel. Al desarrollar un árbol de este tipo, podemos visualizar el camino que recorre el algoritmo BFS y obtener el camino más corto desde el nodo raíz a cualquier otro nodo dentro del árbol.
La Complejidad Temporal de la Búsqueda Primero en Amplitud
En el ámbito de la informática, comprender la complejidad temporal es fundamentalmente crucial. Te permite evaluar la eficiencia de un algoritmo en términos del tiempo que tarda en completarse dado su tamaño de entrada. Al aplicar el algoritmo de Búsqueda Primero en Amplitud (BFS), debes comprender su complejidad temporal para juzgar su rendimiento y eficacia, sobre todo en conjuntos de datos grandes.
Comprender la Complejidad Temporal de la Búsqueda Primero en Amplitud
La complejidad temporal se refiere esencialmente a la complejidad computacional que describe la tasa de crecimiento del tiempo que tarda un algoritmo con respecto a su tamaño de entrada. Proporciona un límite superior del tiempo necesario para ejecutar un programa. En términos de BFS, la complejidad temporal es decisiva para evaluar el rendimiento y la escalabilidad del algoritmo.
El algoritmo BFS comienza en un nodo raíz elegido y explora los nodos vecinos en el nivel de profundidad actual antes de pasar a los nodos del siguiente nivel de profundidad. Como el BFS explora cada arista del grafo una vez, la complejidad temporal puede asociarse al número de aristas y vértices que procesa el algoritmo.
En BFS, cada vértice se procesa exactamente una vez y cada arista también se procesa una vez cuando llegamos a cualquiera de sus extremos. Por tanto, el tiempo total para procesar todos los vértices y aristas es proporcional al número de vértices más el número de aristas. Esto puede expresarse como
\[ \text{complejidad temporal de BFS}} = O (V + E) \]donde:
- \(O\) representa la notación Big O, utilizada para describir el límite superior de la complejidad temporal.
- \(V\) representa el número de vértices del grafo.
- \(E\) representa el número de aristas del grafo.
Ten en cuenta que la complejidad temporal se aplica tanto al peor de los casos como al caso medio, ya que cada vértice y arista siempre se explorará una vez en un grafo conectado. También hay que mencionar que la complejidad temporal no tiene en cuenta el tiempo necesario para inicializar o declarar la estructura de datos auxiliar (la cola), que puede aumentar el requisito de tiempo dependiendo de la implementación.
Mejora de la Complejidad Temporal de los Algoritmos de Búsqueda Primero en Amplitud
La complejidad temporal de un algoritmo BFS puede considerarse eficiente en la mayoría de los casos prácticos, ya que aumenta linealmente con el tamaño del grafo de entrada (número de vértices y aristas). Sin embargo, ciertos ajustes y enfoques pueden optimizar aún más su tiempo de ejecución, especialmente en casos de uso o condiciones de datos específicos.
Un factor crucial que influye en la complejidad temporal del BFS es la estructura de datos auxiliar utilizada. El BFS suele utilizar una cola implementada como una lista enlazada o una matriz dinámica, lo que contribuye a una complejidad temporal constante para las operaciones de puesta en cola y retirada de la cola. Sin embargo, en algunos casos, utilizar una deque (cola de doble extremo) puede mejorar la eficiencia temporal de BFS, sobre todo si el algoritmo requiere una búsqueda inversa o bidireccional.
Otro aspecto a considerar es la representación del grafo. La complejidad temporal del BFS supone que el grafo se representa mediante una lista de adyacencia. Si se utiliza una matriz de adyacencia, la complejidad temporal aumentaría, haciendo que el BFS fuera mucho más lento. Por tanto, elegir una representación de lista de adyacencia en lugar de una matriz de adyacencia puede suponer un gran ahorro de tiempo, especialmente para grafos dispersos.
Escribir un código eficiente y bien estructurado también puede contribuir a reducir el tiempo de ejecución. Esto incluye evitar cálculos innecesarios, utilizar operaciones adecuadas en estructuras de datos y garantizar una gestión adecuada de la memoria. Por ejemplo, marcar los nodos visitados inmediatamente cuando se añaden a la cola puede ayudar a evitar volver a visitar los nodos, mejorando así la eficiencia.
Además, el BFS puede paralelizarse para aprovechar la concurrencia y los sistemas multinúcleo. El concepto de frontera en el BFS, que se refiere a todos los nodos que se exploran en el nivel de profundidad actual, puede aprovecharse para crear un BFS paralelo en el que puedan procesarse simultáneamente varios nodos de la misma frontera.
Aunque puede haber formas de optimizar un algoritmo BFS, es esencial hacerlo con cautela. Cada optimización debe estar justificada por la naturaleza del problema y del grafo de entrada, y hay que tener cuidado de que dichas optimizaciones no introduzcan inadvertidamente complejidad o errores.
Implementación práctica de la Búsqueda de Amplitud Inicial
Poner en práctica la Búsqueda Primero en Amplitud (BFS) implica una serie de pasos que debes seguir cuidadosamente para resolver con eficacia un problema que tengas entre manos. No se trata sólo de comprender los conceptos básicos, también es esencial aplicarlos de forma estratégica y lógica. A continuación, profundizaremos en los pasos que debes tener en cuenta para que la BFS te funcione eficazmente, seguidos de algunos casos prácticos reales que ponen de relieve su aplicación en problemas de codificación.
Pasos para aplicar la Búsqueda Primero en Amplitud en la resolución de problemas
La aplicación práctica de BFS implica un enfoque lógico y bien planificado. Este enfoque puede desglosarse sistemáticamente, guiándote para pasar de la teoría a la aplicación sin esfuerzo.
- Identifica el problema que requiere una aplicación BFS.
- Determina la representación del grafo. Para BFS, una lista de adyacencia suele ser la mejor opción, ya que optimiza la complejidad temporal.
- Define la raíz o el nodo inicial del grafo.
- Crea una cola y una lista visitada (o hash). Coloca la raíz en la cola y márcala como visitada.
- Inicia un bucle que continúe hasta que la cola esté vacía. Durante cada iteración:
- Retira un nodo de la cola.
- Procesa el nodo (operación que depende del problema concreto que se vaya a resolver).
- Para cada vértice adyacente al nodo actual que aún no haya sido visitado, márcalo como visitado y ponlo en cola.
Ten en cuenta que el algoritmo BFS visita cada vértice una vez y recorre cada arista una vez, lo que lleva a una complejidad temporal global de \( O(V+E) \) donde \( V \) es el número de vértices y \( E \) es el número de aristas. Esto respalda su naturaleza eficiente y escalable.
Casos prácticos: La Búsqueda Primero en Amplitud en Problemas de Codificación del Mundo Real
BFS encuentra aplicaciones en múltiples escenarios del mundo real, especialmente cuando existen problemas de optimización en el enrutamiento de redes, IA, rastreo web, búsqueda de rutas en mapas geográficos y redes sociales. Aquí veremos un par de casos más concretos en los que la aplicación de BFS en la resolución de problemas ha resultado indispensable.
Caso práctico 1: Sugerencia de amigos en redes socialesEn servicios de redes sociales como Facebook o LinkedIn, la función "Gente que quizá conozcas" o "Sugerencia de amigos" es muy popular. Utilizando BFS, podemos implementar fácilmente dicha función.Inicialmente, se puede ejecutar un BFS desde el nodo de un usuario hasta 2 niveles de profundidad (teniendo en cuenta que las personas con hasta 2 grados de separación tienen más probabilidades de conocerse). Los nodos descubiertos en el segundo nivel (sin tener en cuenta los del primer nivel, puesto que ya son amigos del usuario y a los que no conoce), sirven como lista de sugerencias de amigos.
Caso práctico 2: La ruta más corta de Google MapsBFS es un componente básico del algoritmo de la ruta más corta utilizado en Google Maps. Cuando un usuario quiere encontrar la ruta más eficiente desde el lugar A al lugar B, BFS acude al rescate.En este escenario, cada lugar del mapa es un nodo, y los caminos que conectan estos lugares son aristas. El objetivo es encontrar el camino más corto, el que tenga el menor peso o coste (el coste puede representar la distancia, el tiempo o las condiciones de la carretera). Si la distancia o el coste es uniforme para todas las aristas (lo que implica un grafo no ponderado), una simple BFS del origen al destino encontraría el camino más corto. Pero si el grafo tiene pesos (cada arista tiene un coste diferente), el BFS se puede convertir en un algoritmo de Dijkstra, que encuentra el camino más corto en un grafo con pesos no negativos.
Estos casos prácticos ponen de manifiesto la utilidad y la potencia del BFS. Sin embargo, dada la complejidad temporal lineal del BFS y su estilo de recorrido basado en la amplitud, no siempre es el enfoque óptimo. Por eso, saber cuándo utilizar BFS es tan importante como saber cómo utilizarlo.
La Búsqueda Primero en Amplitud - Puntos clave
- La Búsqueda Primero en Amplitud (BFS) es un algoritmo de recorrido de grafos que explora los nodos nivel a nivel, partiendo de un nodo raíz. Se utiliza mucho en algoritmos de enrutamiento de redes, búsqueda de rutas en mapas, rastreo web y redes sociales.
- Tanto BFS como Depth First Search (DFS) son algoritmos de recorrido de grafos, pero con estrategias diferentes. BFS explora los nodos nivel a nivel utilizando una estructura de datos de Cola, mientras que DFS explora lo más profundo posible un camino antes de retroceder utilizando una estructura de datos de Pila.
- La complejidad temporal de BFS es \(O(V + E)\), donde \(V\) es el número de vértices y \(E\) es el número de aristas. Esto se aplica tanto al peor de los casos como al caso medio, ya que cada vértice y arista siempre se explorará una vez en un grafo conectado.
- Un árbol de búsqueda BFS es un árbol enraizado que muestra el orden de exploración de los nodos durante un algoritmo de recorrido BFS. Es una representación fidedigna de cómo BFS recorre los nodos de un grafo nivel a nivel.
- Decidir entre utilizar BFS o DFS depende de la naturaleza del problema y de los resultados deseados. Normalmente se elige BFS cuando existe una solución cerca de la raíz o se requiere un recorrido nivel a nivel, mientras que se prefiere DFS cuando el árbol es muy ancho o no requiere necesariamente la ruta más corta.
Aprende con 15 tarjetas de Búsqueda en Anchura en la aplicación StudySmarter gratis
¿Ya tienes una cuenta? Iniciar sesión
Preguntas frecuentes sobre Búsqueda en Anchura
Acerca de StudySmarter
StudySmarter es una compañía de tecnología educativa reconocida a nivel mundial, que ofrece una plataforma de aprendizaje integral diseñada para estudiantes de todas las edades y niveles educativos. Nuestra plataforma proporciona apoyo en el aprendizaje para una amplia gama de asignaturas, incluidas las STEM, Ciencias Sociales e Idiomas, y también ayuda a los estudiantes a dominar con éxito diversos exámenes y pruebas en todo el mundo, como GCSE, A Level, SAT, ACT, Abitur y más. Ofrecemos una extensa biblioteca de materiales de aprendizaje, incluidas tarjetas didácticas interactivas, soluciones completas de libros de texto y explicaciones detalladas. La tecnología avanzada y las herramientas que proporcionamos ayudan a los estudiantes a crear sus propios materiales de aprendizaje. El contenido de StudySmarter no solo es verificado por expertos, sino que también se actualiza regularmente para garantizar su precisión y relevancia.
Aprende más