¿Se puede implementar BFS sin usar una cola? En caso afirmativo, ¿cuál es la mejor complejidad que se puede lograr?

Creo que hay tres formas de hacerlo sin hacer cola.

1. Use dos pilas para imitar una cola. Insertar elementos [math] n [/ math] y sacarlos de una cola tan falsa es [math] O (n) [/ math] en tiempo y espacio, como siempre fue, por lo que en realidad es una implementación de cola razonable .

2. Si realmente quiere ser confuso por alguna razón, use una pila y recursividad (donde la pila de llamadas al procedimiento toma el rol de una de las dos pilas de la solución 1). Me interesé e intenté implementarlo: creo que el siguiente pseudocódigo debería hacerlo (pero no lo he probado). No incluye código para almacenar realmente la ruta al destino. Lo usa llamando a bfs con un vértice de origen y destino.

bfs = función (src, dst)
crear pila S
empuje src hacia S
mientras que S no está vacío
bfs_recurse (S, dst)
terminar mientras
función final

bfs_recurse = función (S, dst)
si S está vacío, devuelve falso
pop un vértice v de S
si bfs_recurse (S, dst) entonces devuelve verdadero
si v es igual a dst, entonces devuelve verdadero
para w en vecinos (v) hacer
si w no se descubre entonces
etiqueta w como descubierta
presione w sobre S
terminara si
fin para
función final

La complejidad del tiempo sigue siendo la misma de siempre.

3. La tercera forma es utilizar la primera búsqueda en profundidad con profundización iterativa. Es decir, primero realiza una búsqueda profunda pero con un límite en la longitud de la ruta, y aumenta el límite paso a paso. Eso parece muy derrochador, pero dependiendo del gráfico (por ejemplo, si el gráfico es un árbol), la complejidad del tiempo puede ser igual a lo que solía ser. También podría ser mucho peor, por ejemplo, si el gráfico es una secuencia lineal de nodos, entonces la complejidad del tiempo aumenta de [matemática] O (n) [/ matemática] a [matemática] O (n ^ 2) [/ matemática] . Por otra parte, existe la ventaja de que realmente no utiliza una cola, ni siquiera una falsa, y además utiliza mucha menos memoria en la búsqueda.

Este es un algoritmo bfs que solo usa la estructura de datos establecida.

s es nodo de inicio

[matemáticas] L_0 = {s} [/ matemáticas]

[math] L_i [/ ​​math] = conjunto de todos los nodos en el gráfico que tiene un borde directo con todos los nodos en Li-1 pero no está presente en ninguno de [math] L_0… L_ {i-1} [/ math]

Repita hasta que no queden nodos.

Si los conjuntos se pueden implementar utilizando la técnica de bitask y un gráfico con una lista de adyacencia, la complejidad es [matemática] n ^ 2 [/ matemática] en tamaño de los nodos.

More Interesting

Entre C # y Java, ¿cuál es el mejor lenguaje de programación para aprender programación orientada a objetos, estructuras de datos y algoritmos? ¿Por qué?

¿Qué tipo de algoritmo de procesamiento del lenguaje natural se usaría para replicar los resultados de esta charla TED?

¿Qué es un árbol en el estudio de estructuras de datos y algoritmos?

¿Es una matriz que está en un orden ordenado un montón mínimo?

He pensado en un algoritmo simple y cómo algunas empresas podrían usarlo. ¿Cómo puedo ganar dinero con eso?

¿Cómo puede alguien calcular la complejidad de este algoritmo?

En file.log, cada línea comienza con una marca de fecha completa. ¿Qué comando podría usarse para devolverme las líneas N-1, N y N + 1 con una diferencia de tiempo mayor que X segundos entre N y N + 1?

En el algoritmo de coincidencia del patrón de fuerza bruta cuando todos los caracteres en el patrón son únicos, entonces la fuerza bruta se puede implementar en la complejidad Big-oh (n) donde n es la longitud de la cadena (referencia: introducción a los algoritmos). ¿Alguien puede ayudarme con el algoritmo? Gracias por adelantado

¿Qué nivel de estadísticas y algoritmos necesito saber para ser bueno en el aprendizaje automático de estadísticas?

¿Por qué Java utiliza una implementación mediocre de hashCode para cadenas?

¿Cómo se debe aprender la codificación, haciendo algoritmos, desde el nivel básico, dado que no tiene experiencia en codificación? (especialmente desde el punto de vista de la colocación y también dado el hecho de que me queda un año para que comience mi temporada de colocación).

Si dos cadenas de longitud desigual se generan por el mismo patrón, ¿cómo se relacionan sus complejidades de Kolmogorov?

¿Cuáles son algunos diseños de clase mínima para el diseño de elevadores para la construcción de m pisos?

¿Cuál es la importancia del algoritmo en informática?

¿Cuál es el enunciado del problema resuelto por el algoritmo Bellman-Ford?