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

5. Programação dinâmica Teorema: Subestrutura Ótima de uma SCML Sejam as sequências X = 〈x1, x2, . . . , xm〉 e Y = 〈y1, y2, . . . , yn〉, e seja Z = 〈z1, z2, . . . , zk〉 qualquer SCML de X e Y • Se xm = yn, então zk = xm = yn e Zk−1 é uma SCML de Xm−1 e Yn−1 • Se xm = yn, então zk = xm implica que Z é uma SCML de Xm−1 e Y • Se xm = yn, então zk = ym implica que Z é uma SCML de X e Yn−1 Notação: Se Z = 〈z1, z2, . . . , zn〉, para 0 ≤ k ≤ n, Zk = 〈z1, z2, . . . , zk〉 Denotando com S(X, Y ) a subsequências mais longa entre X e Y , isso leva ao definição recursiva 8 >< S(X S(X, Y ) = >: ′ , Y ′ ) + 1 se X = X ′ c, Y = Y ′ c max{S(X, Y ′ ), S(X ′ , Y )} se X = X ′ c1, Y = Y ′ 0 c2 e c1 = c2 se X = ɛ ou Y = ɛ Qual a complexidade de implementação recursiva (naiva)? No pior caso executamos T (n, m) = T (n − 1, m) + T (n, m − 1) + Θ(1) operações. Isso com certeza é mais que o número de caminhos de (n, m) até (0, 0), que é maior que m+n n , i.e. exponential no pior caso. Com memoização ou armazenamento de valores intermediários, podemos reduzir o tempo e espaço para O(nm): SCML Algoritmo 5.1 (SCML) Entrada Dois strings X e Y e seus respectivos tamanhos m e n medidos em número de caracteres. 100 Saída O tamanho da maior subsequência comum entre X e Y . 1 m := comprimento (X) 2 n := comprimento (Y) 3 for i := 0 to m do c [ i , 0 ] := 0 ; 4 for j := 1 to n do c [ 0 , j ] := 0 ; 5 for i := 1 to m do 6 for j := 1 to n do 7 i f xi = yj then

8 c[i, j] := c[i − 1, j − 1] + 1 9 else 10 c[i, j] := max(c[i, j − 1], c[i − 1, j]) 11 end i f 12 end for 13 return c[m, n] Exemplo Exemplo 5.1 . B D C A B A . 0 0 0 0 0 0 0 A 0 0 0 0 1 1 1 B 0 1 1 1 1 2 2 C 0 1 1 2 2 2 2 B 0 1 1 2 2 3 3 D 0 1 2 2 2 3 3 A 0 1 2 2 3 3 4 B 0 1 2 2 3 4 4 P R O G R A M A 0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 P 1 0 1 1 1 1 1 1 1 1 E 2 0 1 1 1 1 1 1 1 1 S 3 0 1 1 1 1 1 1 1 1 Q 4 0 1 1 1 1 1 1 1 1 U 5 0 1 1 1 1 1 1 1 1 I 6 0 1 1 1 1 1 1 1 1 S 7 0 1 1 1 1 1 1 1 1 A 8 0 1 1 1 1 2 2 2 2 5.2. Comparação de sequências Caso só o comprimento da maior subsequência em comum importa, podemos reduzir o espaço usado. Os valores de cada linha ou coluna dependem só dos valores da linha ou coluna anterior. Supondo, que o comprimento de uma linha e menor que o comprimento de uma coluna, podemos manter duas linhas ♦ 101

8 c[i, j] := c[i − 1, j − 1] + 1<br />

9 else<br />

10 c[i, j] := max(c[i, j − 1], c[i − 1, j])<br />

11 end i f<br />

12 end for<br />

13 return c[m, n]<br />

Exemplo<br />

Exemplo 5.1<br />

. B D C A B A<br />

. 0 0 0 0 0 0 0<br />

A 0 0 0 0 1 1 1<br />

B 0 1 1 1 1 2 2<br />

C 0 1 1 2 2 2 2<br />

B 0 1 1 2 2 3 3<br />

D 0 1 2 2 2 3 3<br />

A 0 1 2 2 3 3 4<br />

B 0 1 2 2 3 4 4<br />

P R O G R A M A<br />

0 1 2 3 4 5 6 7 8<br />

0 0 0 0 0 0 0 0 0 0<br />

P 1 0 1 1 1 1 1 1 1 1<br />

E 2 0 1 1 1 1 1 1 1 1<br />

S 3 0 1 1 1 1 1 1 1 1<br />

Q 4 0 1 1 1 1 1 1 1 1<br />

U 5 0 1 1 1 1 1 1 1 1<br />

I 6 0 1 1 1 1 1 1 1 1<br />

S 7 0 1 1 1 1 1 1 1 1<br />

A 8 0 1 1 1 1 2 2 2 2<br />

5.2. Comparação <strong>de</strong> sequências<br />

Caso só o comprimento da maior subsequência em comum importa, po<strong>de</strong>mos<br />

reduzir o espaço usado. Os valores <strong>de</strong> cada linha ou coluna <strong>de</strong>pen<strong>de</strong>m só dos<br />

valores da linha ou coluna anterior. Supondo, que o comprimento <strong>de</strong> uma linha<br />

e menor que o comprimento <strong>de</strong> uma coluna, po<strong>de</strong>mos manter duas linhas<br />

♦<br />

101

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

Saved successfully!

Ooh no, something went wrong!