Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2023/2024

Solución del ejercicio 14 del tema 6

En la versión del algoritmo de Dijkstra que aparece en este apartado "Using a priority queue" de la página "Dijkstra's algorithm", se realizan estas operaciones con la cola de prioridad en el peor caso:

El coste temporal del algoritmo depende del coste de esas operaciones. El resto de cosas que hace el algoritmo no son más costosas. Y el coste de esas operaciones depende de cómo se implemente la cola de prioridad, cuya talla es O(|V|). Considerando que hacemos lo necesario para poder acceder en tiempo O(1) al elemento al que le queremos disminuir la prioridad (es decir, para que no haya que buscarlo en la cola de prioridad):

  1. Si la cola de prioridad se implementa utilizando un vector no ordenado:

    • add_with_priority cuesta O(1)

    • extract_min cuesta O(|V|)

    • decrease_priority cuesta O(1)

    Por tanto, el coste total del algoritmo es O(|V| + |V|2 + |E|) = O(|V|2).

  2. Si la cola de prioridad se implementa utilizando un montículo binario:

    Por tanto, el coste total del algoritmo es O(|V| log |V| + |V| log |V| + |E| log |V|). Si consideramos que existe al menos un arco por vértice cuando aplicamos al algoritmo de Dijkstra, el coste es O(|E| log |V|).

Cuál de esas dos implementaciones es mejor para este algoritmo depende de cómo sea el grafo. Considerando estas dos situaciones extremas:

  1. Si |E| = O(|V|), el grafo se denomina disperso. Es lo que sucede, por ejemplo, si cada vértice está conectado mediante un arco con a lo sumo 4 vecinos. En ese caso, el coste del algoritmo con un montículo binario es menor que con un vector no ordenado.

  2. Si |E| = O(|V2|), el grafo se denomina denso. Es lo que sucede, por ejemplo, si cada vértice está conectado mediante un arco con la mitad de los demás vértices. En ese caso, el coste del algoritmo es menor (e inmejorable) con un vector no ordenado.

Existen otras implementaciones posibles. Para saber más, mira también: