Algoritmos e complexidade Notas de aula - Arquivo Escolar
Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar
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
- Page 52 and 53: 2. Análise de complexidade A compl
- Page 54 and 55: 2. Análise de complexidade • Fre
- Page 56 and 57: 2. Análise de complexidade Exemplo
- Page 58 and 59: 2. Análise de complexidade 1 i f l
- Page 60 and 61: 2. Análise de complexidade Novamen
- Page 62 and 63: 2. Análise de complexidade Logo te
- Page 64 and 65: 2. Análise de complexidade 7 for c
- Page 66 and 67: 2. Análise de complexidade Com iss
- Page 68 and 69: 2. Análise de complexidade funçã
- Page 70 and 71: 2. Análise de complexidade Algorit
- Page 72 and 73: 2. Análise de complexidade resolve
- Page 75: 3. Introdução Resolver problemas
- Page 78 and 79: 4. Algoritmos gulosos A abordagem g
- Page 80 and 81: 4. Algoritmos gulosos Do outro lado
- Page 82 and 83: 4. Algoritmos gulosos Aplicações
- Page 84 and 85: 4. Algoritmos gulosos 1 V ′ := {v
- Page 86 and 87: 4. Algoritmos gulosos Algoritmo de
- Page 88 and 89: 4. Algoritmos gulosos Implementaç
- Page 90 and 91: 4. Algoritmos gulosos Variação do
- Page 92 and 93: 4. Algoritmos gulosos • Como comp
- Page 94 and 95: 4. Algoritmos gulosos Proposição
- Page 96 and 97: 4. Algoritmos gulosos Resultados O
- Page 98 and 99: 5. Programação dinâmica É simpl
- Page 100 and 101: 5. Programação dinâmica soluçã
- Page 104 and 105: 5. Programação dinâmica e calcul
- Page 106 and 107: 5. Programação dinâmica 5.2.2. S
- Page 108 and 109: 5. Programação dinâmica 11 sol1
- Page 110 and 111: 5. Programação dinâmica O algori
- Page 112 and 113: 5. Programação dinâmica Dependen
- Page 114 and 115: 5. Programação dinâmica Análise
- Page 116 and 117: 5. Programação dinâmica curto do
- Page 118 and 119: 5. Programação dinâmica Logo, po
- Page 120 and 121: 5. Programação dinâmica (começa
- Page 122 and 123: 5. Programação dinâmica Árvore
- Page 125 and 126: 6. Divisão e conquista 6.1. Introd
- Page 127 and 128: Recorrências simplificadas Formalm
- Page 129 and 130: 6.2. Resolver recorrências • Usa
- Page 131 and 132: 6.2. Resolver recorrências Para co
- Page 133 and 134: 6.2. Resolver recorrências O algor
- Page 135 and 136: • Prove por indução que T (n) =
- Page 137 and 138: Saída A potência a n . 1 i f n =
- Page 139 and 140: 3 Quicksort (l ,m − 1 ,a ) ; 4 Qu
- Page 141 and 142: 6.2. Resolver recorrências 1. Se f
- Page 143 and 144: 6.3. Algoritmos usando divisão e c
- Page 145 and 146: 6.3. Algoritmos usando divisão e c
- Page 147 and 148: 6.3. Algoritmos usando divisão e c
- Page 149 and 150: 6.3. Algoritmos usando divisão e c
- Page 151 and 152: unidade. Em total a avaliação pro
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