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 Proposição 4.4 O conjunto das folhas de cada árvore binária corresponde com um código livre de prefixo. Prova. Dado uma árvore binária com as folhas representando códigos, nenhum código pode ser prefixo de outro: senão ocorreria como nó interno. Qual o melhor código? • A teoria de informação (Shannon) fornece um limite. • A quantidade de informação contido num símbolo que ocorre com freqüência f é − log 2 f, logo o número médio de bits transmitidos (para um número grande de símbolos) é H = − fi log 2 fi. • H é um limite inferior para qualquer código. • Nem sempre é possível atingir esse limite. Com A = 1/3, B = 2/3; H ≈ 0.92b mas o código ótimo precisa ao menos 1b por símbolo. • Nosso exemplo: H ≈ 1.92. Como achar o melhor código? 92 • Observação 1: Uma solução ótima é uma árvore completa. • 1 • ∗ • 0 1 • • ⇒ • 1 • 0 1 • • • Observação 2: Em uma solução ótima, os dois símbolos com menor freqüência ocorrem como irmãos no nível mais alto. Logo: Podemos substituir eles com um nó cujo freqüência é a soma dos dois.

Algoritmo • 1 • 0 1 fi fj ⇒ • 1 fi + fj 4.4. Tópicos Algoritmo 4.8 (Huffman) Entrada Um alfabeto de símbolos S com uma freqüência fs para cada s ∈ S. Saída Uma árvore binária que representa o melhor código livre de prefixos para S. 1 Q := {Leaf(fs) | s ∈ S} { f i l a de prioridade } 2 while |Q| > 0 do 3 b1 := Q. min() com b1 = Node(fi, bi1, bi2) 4 b2 := Q. min() com b2 = Node(fj, bj1, bj2) 5 Q := Q.add(Node(fi + fj, b1, b2)) 6 end while Exemplo 4.4 Saccharomyces cerevisiae Considere a sequência genética do Saccharomyces cerevisiae (inglês: baker’s yeast) MSIT NGT SRSV SAMGHP AV ERY T P GHIV CV GT HKV EV V . . . com 2900352bp. O alfabeto nessa caso são os 20 amino-ácidos S = {A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y } que ocorrem com as freqüências A C D E F G H I K L 0.055 0.013 0.058 0.065 0.045 0.050 0.022 0.066 0.073 0.096 M N P Q R S T V W Y 0.021 0.061 0.043 0.039 0.045 0.090 0.059 0.056 0.010 0.034 93

Algoritmo<br />

• <br />

1<br />

<br />

•<br />

0<br />

<br />

1 <br />

<br />

fi<br />

fj<br />

⇒ • <br />

1 <br />

fi + fj<br />

4.4. Tópicos<br />

Algoritmo 4.8 (Huffman)<br />

Entrada Um alfabeto <strong>de</strong> símbolos S com uma freqüência fs para cada<br />

s ∈ S.<br />

Saída Uma árvore binária que representa o melhor código livre <strong>de</strong> prefixos<br />

para S.<br />

1 Q := {Leaf(fs) | s ∈ S} { f i l a <strong>de</strong> priorida<strong>de</strong> }<br />

2 while |Q| > 0 do<br />

3 b1 := Q. min() com b1 = No<strong>de</strong>(fi, bi1, bi2)<br />

4 b2 := Q. min() com b2 = No<strong>de</strong>(fj, bj1, bj2)<br />

5 Q := Q.add(No<strong>de</strong>(fi + fj, b1, b2))<br />

6 end while<br />

Exemplo 4.4<br />

Saccharomyces cerevisiae<br />

Consi<strong>de</strong>re a sequência genética do Saccharomyces cerevisiae (inglês: baker’s<br />

yeast)<br />

MSIT NGT SRSV SAMGHP AV ERY T P GHIV CV GT HKV EV V . . .<br />

com 2900352bp. O alfabeto nessa caso são os 20 amino-ácidos<br />

S = {A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y }<br />

que ocorrem com as freqüências<br />

A C D E F G H I K L<br />

0.055 0.013 0.058 0.065 0.045 0.050 0.022 0.066 0.073 0.096<br />

M N P Q R S T V W Y<br />

0.021 0.061 0.043 0.039 0.045 0.090 0.059 0.056 0.010 0.034<br />

93

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

Saved successfully!

Ooh no, something went wrong!