Algoritmos e complexidade Notas de aula - Arquivo Escolar

Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar

arquivoescolar.org
from arquivoescolar.org More from this publisher
13.04.2013 Views

4. Algoritmos gulosos Implementação Algoritmo 4.5 (Seqüenciamento de intervalos) Entrada Um conjunto de intervalos S = {[ci, fi] | 1 ≤ i ≤ n}, cada com começo ci e fim fi tal que ci < fi. Saída Um conjunto máximo de intervalos compatíveis C. 1 C := ∅ 2 while S = ∅ do 3 Seja [c, f] ∈ S com f mínimo 4 C := C ∪ [c, f] 5 S := S \ {i ∈ S | i ∩ [c, f] = ∅} 6 end while 7 return C Seja C = ([c1, f1], . . . , [cn, fn]) o resultado do algoritmo Seqüenciamento de intervalos e O = ([c ′ 1, f ′ 1], . . . , [c ′ m, f ′ m]) seqüenciamento máximo, ambos em ordem crescente. Proposição 4.2 Para todo 1 ≤ i ≤ n temos fi ≤ f ′ i . Prova. Como O é ótimo, temos n ≤ m. Prova por indução. Base: Como o algoritmo guloso escolhe o intervalo cujo terminação é mínima, temos f1 ≤ f ′ 1. Passo: Seja fi ≤ f ′ i com i < n. O algoritmo guloso vai escolher entre os intervalos que começam depois fi o com terminação mínima. O próximo intervalo ] do seqüenciamento ótimo está entre eles, porque ele começa depois [c ′ i+1 , m′ i+1 f ′ i e f ′ i ≥ fi. Portanto, o próximo intervalo escolhido pelo algoritmo guloso termina antes de f ′ i+1 , i.e. fi+1 ≤ f ′ i+1 . Proposição 4.3 O seqüenciamento do algoritmo guloso é ótimo. Prova. Suponha que o algoritmo guloso retorna menos intervalos C que um seqüenciamento ótimo O. Pela proposição 4.2, o último (n-ésimo) intervalo do C termina antes do último intervalo de O. Como O tem mais intervalos, existe mais um intervalo que poderia ser adicionado ao conjunto C pelo algoritmo guloso, uma contradição com o fato, que o algoritmo somente termina se não sobram intervalos compatíveis. 86

Complexidade • Uma implementação detalhada pode 4.3. Algoritmos de seqüenciamento – Ordenar os intervalos pelo fim deles em tempo O(n log n) – Começando com intervalo 1 sempre escolher o intervalo atual e depois ignorar todos intervalos que começam antes que o intervalo atual termina. – Isso pode ser implementado em uma varredura de tempo O(n). – Portanto o complexidade pessimista é O(n log n). Conjunto independente máximo Considere o problema Conjunto independente máximo, CIM Instância Um grafo não-direcionado G = (V, E). Solução Um conjunto independente M ⊆ V , i.e. todo m1, m2 ∈ V temos {m1, m2} ∈ E. Objetivo Maximiza a cardinalidade |M|. (inglês: maximum independent set, MIS) Grafos de intervalo • Uma instância S de seqüenciamento de intervalos define um grafo nãodirecionado G = (V, E) com V = S; E = {{i1, i2} | i1, i2 ∈ S, i1 ∩ i2 = ∅} • Grafos que podem ser obtidos pelo intervalos são grafos de intervalo. • Um conjunto compatível de intervalos corresponde com um conjunto independente nesse grafo. • Portanto, resolvemos CIM para grafos de intervalo! • Sem restrições, CIM é NP-completo. 87

4. <strong>Algoritmos</strong> gulosos<br />

Implementação<br />

Algoritmo 4.5 (Seqüenciamento <strong>de</strong> intervalos)<br />

Entrada Um conjunto <strong>de</strong> intervalos S = {[ci, fi] | 1 ≤ i ≤ n}, cada com<br />

começo ci e fim fi tal que ci < fi.<br />

Saída Um conjunto máximo <strong>de</strong> intervalos compatíveis C.<br />

1 C := ∅<br />

2 while S = ∅ do<br />

3 Seja [c, f] ∈ S com f mínimo<br />

4 C := C ∪ [c, f]<br />

5 S := S \ {i ∈ S | i ∩ [c, f] = ∅}<br />

6 end while<br />

7 return C<br />

Seja C = ([c1, f1], . . . , [cn, fn]) o resultado do algoritmo Seqüenciamento<br />

<strong>de</strong> intervalos e O = ([c ′ 1, f ′ 1], . . . , [c ′ m, f ′ m]) seqüenciamento máximo, ambos<br />

em or<strong>de</strong>m crescente.<br />

Proposição 4.2<br />

Para todo 1 ≤ i ≤ n temos fi ≤ f ′ i .<br />

Prova. Como O é ótimo, temos n ≤ m. Prova por indução. Base: Como o<br />

algoritmo guloso escolhe o intervalo cujo terminação é mínima, temos f1 ≤ f ′ 1.<br />

Passo: Seja fi ≤ f ′ i com i < n. O algoritmo guloso vai escolher entre os intervalos<br />

que começam <strong>de</strong>pois fi o com terminação mínima. O próximo intervalo<br />

] do seqüenciamento ótimo está entre eles, porque ele começa <strong>de</strong>pois<br />

[c ′ i+1 , m′ i+1<br />

f ′ i e f ′ i ≥ fi. Portanto, o próximo intervalo escolhido pelo algoritmo guloso<br />

termina antes <strong>de</strong> f ′ i+1 , i.e. fi+1 ≤ f ′ i+1 . <br />

Proposição 4.3<br />

O seqüenciamento do algoritmo guloso é ótimo.<br />

Prova. Suponha que o algoritmo guloso retorna menos intervalos C que um<br />

seqüenciamento ótimo O. Pela proposição 4.2, o último (n-ésimo) intervalo do<br />

C termina antes do último intervalo <strong>de</strong> O. Como O tem mais intervalos, existe<br />

mais um intervalo que po<strong>de</strong>ria ser adicionado ao conjunto C pelo algoritmo<br />

guloso, uma contradição com o fato, que o algoritmo somente termina se não<br />

sobram intervalos compatíveis. <br />

86

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!