MST: la complejidad del algoritmo de Prim, ¿por qué no ?

8

Según CLRS, los algoritmos de Prim se implementan a continuación:

MST-PRIM(G,w,r)

  • para cada douV[G]
    • key[u]
    • π[u]NIL
  • key[r]0
  • QV[G]
  • mientras que do // ...QO(V)
    • u EXTRACT-MIN(u) // ...O(lgV)
      • para cada do // ...vadj[u]O(E)
        • si yvQw(u,v)>key[v]
          • entoncesπ[v]u
            • keyw(u,v) // ...DECREASE-KEYO(lgV)

El libro dice que la complejidad total es . Sin embargo, lo que entendí es que el bucle interno con la operación costará , y el bucle externo encierra tanto el bucle interno como el interno , por lo que la complejidad total debería ser .O(VlgV+ElgV)O(ElgV)forDECREASE-KEYO(ElgV)whileEXTRACT-MINforO(V(lgV+ElgV))=O(VlgV+EVlgV)O(EVlgV)

¿Por qué el análisis de complejidad no se realiza como tal? y ¿Qué hay de malo en mi formulación?

ramgorur
fuente

Respuestas:

9

La complejidad se deriva de la siguiente manera. La fase de inicialización cuesta . El bucle se ejecutaveces. El bucle anidado dentro de la bucle se ejecuta veces. Finalmente, el lema del apretón de manos implica que hay implícitas DECREASE-KEY's. Por lo tanto, la complejidad es: .O(V)while|V|forwhiledegree(u)Θ(E)Θ(V)TEXTRACTMIN+Θ(E)TDECREASEKEY

La complejidad real depende de la estructura de datos realmente utilizada en el algoritmo. Usando una matriz, , la complejidad es en el peor de los casos.TEXTRACTMIN=O(V),TDECREASEKEY=O(1)O(V2)

Usando un montón binario, , la complejidad es en el peor de los casos. Aquí está la razón: dado que el gráfico está conectado, entonces , y es como máximo (peor de los casos, para un gráfico denso). Probablemente, te perdiste este punto.TEXTRACTMIN=O(logV),TDECREASEKEY=O(logV)O(ElogV)|E||V|1EV2

Usando un montón de Fibonacci, amortizado, amortizado, la complejidad es en el peor de los casos.TEXTRACTMIN=O(logV)TDECREASEKEY=O(1)O(E+VlogV)

Massimo Cafaro
fuente
1

Tu idea parece correcta. Tomemos la complejidad como . Luego observe que en el bucle for interno, en realidad estamos atravesando todos los vértices, y no los bordes, así que modifiquemos un poco a , lo que significa . Pero para el análisis del peor de los casos (gráficos densos), es aproximadamente igual al número de aristas, , dando pero desde , por lo tanto .V(lgv+Elgv)V(lgv+Vlgv)Vlgv+V2lgvV2EVlgv+Elgv=(V+E)lgvVEElgv

usuario3473400
fuente
¿Cuál es ? ¿Un error tipográfico para ? vV
David Richerby
En realidad, no entiendo esto en absoluto. ¿Qué significa decir "Tomemos la complejidad como [expresión 1]" y luego "modifiquemos un poco a [expresión 2]"? No puede asumir que el tiempo de ejecución es una cosa y luego cambiarlo por otra.
David Richerby