¿Cuál es una explicación simple de por qué BFS bidireccional se ejecuta en [math] \ Theta (\ sqrt {n}) [/ math]?

No es correcto describir el tiempo de ejecución de BFS bidireccional como [math] \ Theta (\ sqrt N) [/ math], donde N es el número de vértices.

Primero, comencemos por comprender que, en el peor de los casos, ningún algoritmo para encontrar una ruta entre dos vértices puede ser mejor que [math] \ Theta (V + E) [/ math]. Supongamos que hay algún borde que no has mirado y que aún no has encontrado una ruta de A a B. Por lo que sabes, ese borde podría ser instrumental en la conexión de A a B. Por lo tanto, ningún algoritmo, ya sea unidireccional, bidireccional o lo que sea, puede evitar mirar todos los vértices y bordes en el peor de los casos.

Sin embargo, en muchos gráficos, es probable que A y B estén conectados por muchas rutas diferentes, y estamos interesados ​​en encontrar la ruta más corta. Por lo tanto, queremos una búsqueda que priorice la búsqueda de vértices que puedan formar el camino más corto. Además, en muchos casos esperamos que la distancia sea pequeña, por ejemplo en LinkedIn, donde una conexión se clasifica como 1er, 2do o 3+ grado. Más allá de cierta distancia, es posible que no nos importe exactamente cuál es la distancia. En los casos en que la distancia es pequeña, podemos esperar la mayor parte del tiempo para descubrir el camino en mejor que [matemática] \ Theta (V + E) [/ matemática].

Aunque no siempre podemos hacerlo mejor que [matemática] \ Theta (V + E) [/ matemática], la búsqueda bidireccional es una heurística útil para encontrar el camino más corto en tales casos. Puede que no siempre haga menos trabajo que visitar todos los nodos, pero puede hacerlo, y es probable que lo haga si la distancia es pequeña.

Habiendo llegado a esta heurística, queremos comparar su rendimiento probable con el rendimiento de BFS unidireccional. No podemos decir mucho sobre cómo le va en general en los gráficos, por lo que consideraremos un cierto tipo de gráfico común.

Muchos gráficos tienen un grado bastante bajo para cada vértice, lo que significa que cada vértice solo se conecta a un número bastante limitado de otros vértices. Además, el gráfico está altamente interconectado y exhibe una especie de fenómeno de “seis grados de separación” (aunque no específicamente con el número 6), donde los nodos aparentemente no relacionados y distantes están realmente conectados por caminos bastante cortos. Estos tipos de gráficos a menudo se ven en las redes sociales, pero también para otras cosas como conexiones de vuelo, etc.

Para analizar el rendimiento de este tipo de gráficos, elaboramos un cálculo aproximado. Asumimos que cada vértice tendrá vecinos [matemáticos] b [/ matemáticos] (o promediará vecinos [matemáticos] b [/ matemáticos]). Llamamos [math] b [/ math] al factor de ramificación .

En una búsqueda unidireccional, esperamos tener nodos [matemáticos] b [/ matemáticos] a la distancia 1 de la fuente, [nodos matemáticos] b ^ 2 [/ matemáticos] a la distancia 2, hasta [matemáticos] b ^ k [ / math] nodos a distancia [math] k [/ math]. Tenga en cuenta que este es un cálculo muy aproximado e impreciso porque, por supuesto, muchos de los vecinos se superpondrán entre nodos, y este cálculo supone que no se superponen (la cantidad probable de superposición sería difícil de cuantificar). Con base en este cálculo, decimos que si el origen y el destino están a una distancia [matemática] d [/ matemática] aparte, probablemente buscaremos [matemática] 1 + b + b ^ 2 +… + b ^ d = \ Theta ( b ^ d) [/ math] nodos antes de encontrar la ruta.

En una búsqueda bidireccional, se encuentra un nodo intermedio de conexión entre el conjunto de nodos accesibles desde la fuente y el conjunto de nodos accesibles desde el destino cuando todos los nodos dentro de una distancia de [math] d / 2 [/ math] desde ambos puntos finales tienen sido visitado Por lo tanto, el número de nodos que se examinarán se aproxima a [matemáticas] 2 \ cdot (1 + b + b ^ 2 +… + b ^ {d / 2}) = \ Theta (b ^ {d / 2}) [ /mates].

Si dejamos que [math] S [/ math] sea el tamaño del conjunto de nodos visitados con búsqueda unidireccional en esta aproximación (es decir, [math] S = \ Theta (b ^ d) [/ math]), entonces bidireccional la búsqueda solo visita los nodos [math] \ Theta (\ sqrt S) [/ math].

Además, BFS bidireccional puede visitar (casi) todos los nodos siempre que el nodo de destino no sea accesible desde el nodo de origen. Sin embargo, puede optimizarlo un poco: suponga que [math] A [/ math] es el componente conectado que contiene el nodo fuente, y [math] B [/ math] es el componente conectado que contiene el nodo de destino. Si, en su implementación, expande el árbol de búsqueda más pequeño, el peor de los casos es proporcional a [math] 2 \ min (| A |, | B |) [/ math].

Primero, veamos la complejidad de BFS unidireccional. En el peor de los casos, debe mirar cada nodo del árbol. Por lo tanto, es Theta (N). Pero podemos ver N, el número de nodos, de una manera diferente. Podemos representar N como b ^ d, donde d es la profundidad del árbol yb es cuántas ramas por nodo (supongamos uniformidad por simplicidad). Theta (N) puede reescribirse como Theta (b ^ d). Veremos por qué esto fue útil a continuación.

Ahora, pasemos a BFS bidireccional. Nuestra configuración es un poco diferente de la unidireccional, donde teníamos un solo árbol desde nuestro nodo inicial. Ahora tenemos dos árboles, cada uno con una profundidad de la mitad del árbol unidireccional original. Con el mismo factor de ramificación b, podemos ver que cada uno de los nuevos árboles tiene nodos b ^ (d / 2), lo que se simplifica a sqrt (b ^ d). Si sumamos los dos árboles, obtenemos 2sqrt (b ^ d). Como 2 es una constante, obtenemos Theta (sqrt (b ^ d)).

More Interesting

¿Cuál es el método de práctica más eficiente para mejorar las preguntas sobre algoritmos?

¿Puede la longitud de un comando Mathematica o Wolfram | Alpha ser una aproximación aproximada de su complejidad de Kolmogorov?

¿Cuál es el número total de comparaciones en un tipo de burbuja?

¿Cuál es el mejor algoritmo de reconocimiento de patrones hoy?

He estado haciendo programación competitiva durante años, pero ahora me encuentro despistado en mi clase de Algoritmos. ¿Qué tengo que hacer?

¿Es mejor hacer InterviewBit ahora (actualmente estoy en mi quinto semestre) o hacer SPOJ ahora y luego hacer InterviewBit solo 3 o 4 meses antes de las entrevistas? Solo conozco algunas estructuras de datos y algoritmos básicos. He hecho 40 problemas en SPOJ.

¿Qué tipo de algoritmos / pruebas / procedimientos analíticos se utilizan en el comercio minorista y para estudiar el comportamiento del consumidor?

¿Cuál es la complejidad de tiempo en el peor de los casos para la eliminación en una cola?

¿Cuál es la diferencia entre un código y un algoritmo?

¿Cuál es el problema de partición y cómo lo resolvemos?

Silicon Valley (serie de televisión): ¿Cuál es el ejemplo más cercano en la vida real al algoritmo de compresión de Pied Piper?

¿Cuál fue el primer algoritmo ejecutado por computadora?

Si una computadora toma el control total del control del tráfico aéreo, ¿cómo será el algoritmo? ¿Cómo manejará los aterrizajes de emergencia y cómo manejará una pista paralela?

¿Por qué la búsqueda de Breadth-first (y otros algoritmos relacionados) se consideran parte del campo de IA?

Cómo generar todas las permutaciones de fila de una matriz 2D dada de forma recursiva