La idea del algoritmo de Dijkstra es realmente fácil. Supongamos que arrojamos una gran colonia de hormigas en el nodo fuente [math] u [/ math] en el momento [math] 0 [/ math]. Se separaron de allí y siguen todos los caminos posibles a través del gráfico a una velocidad de una unidad por segundo. Entonces, la primera hormiga que encuentra el nodo objetivo [matemática] v [/ matemática] lo hará en el momento [matemática] d (u, v) [/ matemática] segundos, donde [matemática] d (u, v) [/ matemática ] es la distancia más corta desde [math] u [/ math] a [math] v [/ math]. ¿Cómo encontramos cuando eso es? Solo necesitamos observar la expansión del frente de onda de las hormigas.
Con ese fin, mantengamos dos estructuras de datos:
- Un programa para realizar un seguimiento de los tiempos de llegada futuros de las primeras hormigas en ruta a cada nodo. (Se muestra en rojo en mi animación. Inicialmente, las hormigas solo están programadas para llegar a [matemáticas] u [/ matemáticas] a la hora [matemáticas] 0 [/ matemáticas].)
- Una matriz visitada para marcar los nodos que las hormigas ya han alcanzado, para asegurarse de que no desperdiciemos el seguimiento de todas las hormigas detrás de las líneas del frente. (Se muestra en verde en mi animación. Inicialmente, no se han visitado nodos).
Mientras observamos la marcha de las hormigas, actualizaremos estas estructuras de la siguiente manera. Considere la hora de llegada más temprana en el horario: nodo [matemática] i [/ matemática] a la hora [matemática] t [/ matemática]. En ese momento, haremos tres cosas:
- ¿Cómo pueden la IA y el aprendizaje automático ayudar a llevar la inclusión social a la India?
- Si pudieras retroceder en el tiempo con una unidad flash moderna, ¿cómo conseguirías que una computadora la lea?
- Se le da la oportunidad de tirar un dado de 100 lados y, sin importar cuántos puntos aparezcan, puede elegir (a): tomar tantos dólares, o (b): pagar $ 1 y tirar nuevamente. ¿Cuál es la estrategia óptima y el valor esperado?
- ¿Cómo funcionan realmente las tablas de arcoiris y el hash?
- ¿Cuál es el principio de localidad en informática?
- Marcaremos el nodo [math] i [/ math] como visitado.
- Eliminaremos [math] i [/ math] del horario.
- Para cada borde desde [matemática] i [/ matemática] a un nodo no visitado [matemática] j [/ matemática], las hormigas comenzarán a pulularse por ese borde. (Las hormigas también comenzarán a pulular hacia los nodos visitados, pero no nos importan esas hormigas, ya que nunca serán las primeras en encontrar nuevos nodos). Notaremos en el cronograma que las hormigas llegarán a [ matemática] j [/ matemática] en el tiempo [matemática] t + w [/ matemática], donde [matemática] w [/ matemática] es la longitud del borde, a menos que el programa ya tuviera una entrada anterior para [matemática] j [ / math], en cuyo caso no lo cambiaremos. Sin embargo, podríamos reemplazar una entrada posterior por [math] j [/ math].
Luego, repetimos este proceso con la próxima hora de llegada más temprana en el programa, y así sucesivamente, hasta que las hormigas finalmente visiten el nodo [math] v [/ math]. Dado que el cronograma contendrá toda la información que necesitamos para determinar cuándo llegarán las hormigas, podemos implementar esto como un algoritmo en lugar de un horrible proyecto de feria de ciencias en la escuela intermedia.
Por cierto, puedes ver el algoritmo de Dijkstra que ocurre en la naturaleza cuando un rayo busca el camino de menor resistencia al suelo. Esto es mucho más genial que ver una colonia de hormigas.
Para que el algoritmo sea eficiente, la programación solo necesita admitir tres operaciones rápidamente:
- elimine la entrada con el tiempo más temprano (esto sucede hasta una vez para cada nodo).
- agregue una nueva entrada (esto sucede hasta una vez para cada nodo),
- disminuya el tiempo asociado con una entrada existente (esto sucede hasta una vez para cada borde).
Dicha estructura de datos se denomina cola prioritaria , y hay varias implementaciones con diferentes propiedades.
- Una matriz simple admite estas operaciones en tiempo [matemático] O (n), O (1), O (1) [/ matemático], lo que lleva a un algoritmo de tiempo [matemático] O (| V | ^ 2) [/ matemático] .
- Un montón (o un árbol de búsqueda equilibrado) admite estas operaciones en [math] O (\ log n), O (\ log n), O (\ log n) [/ math] time, lo que lleva a un [math] O ( | E | \ log | V |) [/ math] algoritmo de tiempo.
- Una estructura de cola de prioridad más optimizada, como un montón de Fibonacci, admite estas operaciones en tiempo [matemático] O (\ log n), O (1), O (1) [/ matemático], lo que lleva a un [matemático] O (| V | \ log | V | + | E |) [/ math] algoritmo de tiempo. Estas estructuras son complicadas: si solo está aprendiendo sobre el algoritmo de Dijkstra por primera vez, no necesita comprenderlas.