MST: complexidade do algoritmo de Prim, por que não


8

De acordo com o CLRS, os algoritmos do Prim são implementados como abaixo -

MST-PRIM(G,w,r)

  • para cada u∈V[G] Faz
    • key[u]←∞
    • π[u]←NIL
  • key[r]←0
  • Q←V[G]
  • enquanto Q≠∅ Faz // ... O(V)
    • u ← EXTRACT-MIN(u) // ... O(lg⁡V)
      • para cada v∈adj[u] Faz // ... O(E)
        • E se v∈Q e w(u,v)>key[v]
          • então π[v]←u
            • key←w(u,v) // DECREASE-KEY ... O(lg⁡V)

O livro diz que a complexidade total é O(Vlg⁡V+Elg⁡V)≈O(Elg⁡V). No entanto, o que entendi é que o forloop interno com a DECREASE-KEYoperação custaráO(Elg⁡V), e o whileloop externo inclui EXTRACT-MINo forloop interno e o interno , portanto, a complexidade total deve serO(V(lg⁡V+Elg⁡V))=O(Vlg⁡V+EVlg⁡V)≈O(EVlg⁡V).

Por que a análise de complexidade não é realizada como tal? e O que há de errado com minha formulação?

Respostas:


9

A complexidade é derivada da seguinte maneira. Os custos da fase de inicializaçãoO(V). owhile loop é executado |V|vezes. ofor loop aninhado dentro do while loop é executado degree(u)vezes. Finalmente, o lema do aperto de mão implica que existemΘ(E)implícitas DECREASE-KEY's. Portanto, a complexidade é:Θ(V)∗TEXTRACT−MIN+Θ(E)∗TDECREASE−KEY.

A complexidade real depende da estrutura de dados realmente usada no algoritmo. Usando uma matriz,TEXTRACT−MIN=O(V),TDECREASE−KEY=O(1)complexidade é O(V2) no pior dos casos.

Usando uma pilha binária, TEXTRACT−MIN=O(log⁡V),TDECREASE−KEY=O(log⁡V)complexidade é O(Elog⁡V)no pior dos casos. Aqui está o porquê: como o gráfico está conectado, então|E|≥|V|−1e E é no máximo V2(na pior das hipóteses, para um gráfico denso). Provavelmente, você perdeu esse ponto.

Usando uma pilha de Fibonacci, TEXTRACT−MIN=O(log⁡V) amortizado, TDECREASE−KEY=O(1) amortizado, a complexidade é O(E+Vlog⁡V) no pior dos casos.


1

Sua ideia parece correta. Vamos considerar a complexidade como V(lg⁡v+Elg⁡v). Então observe que no loop for interno, estamos passando por todos os vértices, e não pelas arestas, então vamos modificar um pouco para V(lg⁡v+Vlg⁡v), que significa Vlg⁡v+V2lg⁡v. Mas, para a análise do pior caso (gráficos densos),V2 é aproximadamente igual ao número de arestas, Edando Vlg⁡v+Elg⁡v=(V+E)lg⁡v mas desde V≪E, conseqüentemente Elg⁡v.


O que é v? Um erro de digitação paraV?
— precisa saber é o seguinte

Na verdade, eu não entendo nada disso. O que significa dizer "Vamos considerar a complexidade como [expressão 1]" e depois "modificar um pouco para [expressão 2]"? Você não pode simplesmente assumir que o tempo de execução é uma coisa e depois mudar para outra.
— David Richerby
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.