Escolar Documentos
Profissional Documentos
Cultura Documentos
7 de novembro de 2011
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Árvore Geradora Mı́nima Exemplo
8 7
b c d
Problema da Árvore Geradora Mı́nima 4 9
2
a 11 i 4 14 e
Entrada: grafo conexo G = (V , E) com pesos w(u, v ) para 7 6
8 10
cada aresta (u, v ). h g f
1 2
Saı́da: subgrafo gerador conexo T de G cujo peso total
X
8 7
w(T ) = w(u, v ) b c d
(u,v )∈T 4 9
2
a 11 i 4 14 e
seja o menor possı́vel. 6
7
8 10
h g f
1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Algoritmo genérico Como encontrar arestas seguras
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
8 7
b c d Os algoritmos de Prim e Kruskal são especializações do
4 9 algoritmo genérico e fazem uso do Corolário 23.2.
2
a 11 i 4 14 e S
7 6
8 10 V −S
h g f
1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Prim O algoritmo de Prim
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Prim O algoritmo de Prim
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Prim O algoritmo de Prim
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Corretude do algoritmo de Prim Complexidade do algoritmo de Prim
Obviamente, a complexidade de AGM-P RIM depende de como
a fila de prioridade Q é implementada.
O algoritmo mantém os seguintes invariantes.
Vejamos o que acontece se implementarmos Q como um
min-heap.
No inı́cio de cada iteração das linhas 6–11:
A = {(u, π[u]) : u ∈ V − {r } − Q}. As linhas 1–5 podem ser executadas em tempo O(V )
usando B UILD -M IN -H EAP.
O conjunto de vértices da árvore é exatamente V [G] − Q. O laço da linha 6 é executado |V | vezes e cada operação
E XTRACT-M IN consome tempo O(lg V ), resultando em um
Para cada v ∈ Q, se π[v ] 6= NIL, então key[v ] é o peso de
tempo total O(V lg V ) para todas as chamadas de
uma aresta (v , π[v ]) de menor peso ligando v a um vértice
E XTRACT-M IN.
π[v ] na árvore.
O laço das linhas 8–11 é executado O(E) vezes no total.
Esse invariantes garantem que o algoritmo sempre escolhe O teste de pertinência à fila Q pode ser feito em tempo
uma aresta segura para acrescentar a A e portanto, o constante usando um vetor booleano.
algoritmo está correto. Ao atualizar a chave de um vértice na linha 11 é feita uma
chamada implı́cita a D ECREASE -K EY que consome tempo
O(lg V ).
O tempo total é O(V lg V + E lg V ) = O(E lg V ).
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Usando um heap de Fibonacci para implementar Q Um detalhe de implementação importante é como encontrar a
melhoramos o tempo para O(E + V lg V ). aresta de menor peso ligando componentes distintos.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Kruskal O algoritmo de Kruskal
8 7
8 7 b c d
b c d
4 9
4 9 2
2 a 11 14 e
11 14 i 4
a i 4 e 6
6 7
7 8 10
8 10 h g f
h g f 1 2
1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
8 7 8 7
b c d b c d
4 9 4 9
2 2
11 14 a 11 i 4 14 e
a i 4 e
6 7 6
7
8 10 8 10
h h g f
g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Kruskal O algoritmo de Kruskal
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
8 7
b c d 8 7
b c d
4 9
2 4 9
a 11 14 e
2
i 4 11 14
6 a i 4 e
7 6
8 10 7
h
8 10
g f
1 2 h g f
1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Kruskal O algoritmo de Kruskal
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
8 7
8 7 b c d
b c d
4 9
4 9 2
2 a 11 14 e
11 14 i 4
a i 4 e 6
6 7
7 8 10
8 10 h g f
h g f 1 2
1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Kruskal O algoritmo de Kruskal
8 7 8 7
b c d b c d
4 9 4 9
2 2
a 11 i 4 14 e a 11 i 4 14 e
7 6 7 6
8 10 8 10
h g f h g f
1 2 1 2
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
O algoritmo de Kruskal Estrutura de dados para conjuntos disjuntos
Dado um vértice u, determinar o componente de GA que Quem é o representante é irrelevante, mas se o conjunto
contém u e não for modificado, então o representante não pode ser
alterado.
dados dois vértices u e v em componentes distintos C e
C ′ , fazer a união desses em um novo componente.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Componentes conexos O algoritmo de Kruskal
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Representação por listas ligadas Representação por listas ligadas
b d a c e g f
e g f
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Uma heurı́stica simples Representação por disjoint-set forests
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
b e h j
a b e f h j
G a d g f i
c d g i
c
Grafo com vários componentes.
Como é a representação dos componentes na estrutura de Cada conjunto corresponde a uma árvore enraizada.
dados disjoint-set forests? Cada elemento aponta para seu pai.
A raiz é o representante do conjunto e aponta para si
mesma.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Representação por disjoint-set forests Representação por disjoint-set forests
b e h j
U NION(a, f )
b x′ h j
a d g f i
a d e y′ i
c
c g f
M AKE -S ET(x)
1 pai[x] ← x U NION(x, y)
1 x ′ ← F IND -S ET(x)
F IND -S ET(x) 2 y ′ ← F IND -S ET(y )
1 se x = pai[x] 3 pai[y ′ ] ← x ′
2 então devolva x
3 senão devolva F IND -S ET(pai[x])
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
U NION(a, f )
b x′ h j
Com a implementação descrita até agora, não há melhoria
assintótica em relação à representação por listas ligadas.
a d e y′ i É fácil descrever uma sequência de n − 1 chamadas a U NION
que resultam em uma cadeia linear com n nós.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Union by rank Union by rank
M AKE -S ET(x)
1 pai[x] ← x
2 rank[x] ← 0
A idéia é emprestada do weighted-union heuristic.
U NION(x, y)
Cada nó x possui um “posto” rank[x] que é um limitante
1 L INK(F IND -S ET(x), F IND -S ET(y ))
superior para a altura de x.
Em union by rank a raiz com menor rank aponta para a raiz L INK(x, y) ⊲ x e y são raı́zes
com maior rank. 1 se rank[x] > rank[y]
2 então pai[y] ← x
3 senão pai[x] ← y
4 se rank[x] = rank[y]
5 então rank[y ] ← rank[y] + 1
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
c a c
b d
b
a F IND -S ET(x)
F IND -S ET(x)
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Path compression Análise de union by rank com path compression
e
Vamos descrever (sem provar) a complexidade de uma
d
sequência de operações M AKE -S ET, U NION e F IND -S ET
quando union by rank e path compression são usados.
c
a F IND -S ET(x)
n+1 se m = 0,
A(m, n) = A(m − 1, 1) se m > 0 e n = 0
A(m − 1, A(m, n − 1)) se m > 0 e n > 0
Análise de union by rank com path compression Análise de union by rank com path compression
Tudo que você precisa saber é que ela cresce muito rápido.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Análise de union by rank com path compression O algoritmo de Kruskal (de novo)
AGM-K RUSKAL(G, w)
1 A←∅
2 para cada v ∈ V [G] faça
3 M AKE -S ET(v )
Teorema. Uma sequência de m operações M AKE -S ET, U NION 4 Ordene as arestas em ordem não-decrescente de peso
e F IND -S ET pode ser executada em uma estrutura de dados 5 para cada (u, v ) ∈ E nessa ordem faça
para disjoint-set forests com union by rank e path compression 6 se F IND -S ET(u) 6= F IND -S ET(v )
em tempo O(mα(n)) no pior caso. 7 então A ← A ∪ {(u, v )}
8 U NION(u, v )
Vamos voltar agora à implementação do algoritmo de Kruskal. 9 devolva A
Complexidade:
Ordenação: O(E lg E)
|V | chamadas a M AKE -S ET
|E| + |V | − 1 = O(E) chamadas a U NION e F IND -S ET
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Ordenação: O(E lg E)
|V | chamadas a M AKE -S ET
O(E) chamadas a U NION e F IND -S ET
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1