BCC402 Algoritmos e Programação AvançadaProf. Marco Antonio M. CarvalhoProf. Túlio Ângelo M. Toffolo2011/1
2
Avisos
3
Avisos
Prova no dia 07 de Junho (em 11 dias).
4
Na aula anterior
• Backtracking.
5
Na aula de hoje
• Programação Dinâmica.
6
Programação Dinâmica
• A Programação Dinâmica é uma ferramenta geral muitopoderosa para resolver problemas combinatórios quepossuem elementos com uma certa ordenaçãoesquerda-para-direita– Como strings.
• Uma vez compreendida, torna-se relativamente fácil de ser aplicada.
• Programação Dinâmica parece mágica até que vocêtenha visto exemplos o suficiente– Vamos ver um exemplo clássico de programação
dinâmica então!
7
Coeficientes Binomiais
• A mais importante classe de contagem são oscoeficientes binomiais (ou binômios de Newton)– Em que conta o número de formas em que
podemos escolher k itens entre n possibilidades;• O que pode ser contado?
– Comitês;– Caminhos em uma grade;– Coeficientes de (a-b)n;– O triângulo de Pascal;– Etc.
)(n
k
8
Coeficientes Binomiais
• Quantas formas existem para formarmos um comitê com k membros, se temos n pessoas? – A resposta é .)(
n
k
9
Coeficientes Binomiais
• Quantas formas existem para nos deslocarmosdo canto superior esquerdo de uma grade n×m
até o canto inferior direito, andando apenas para baixo e para a direita?– Cada caminho deve consistir de n+m passos, n
para baixo e m para a direita;– Cada caminho com um conjunto diferente de
passos para baixo é diferente;– Então a quantidade de tais conjuntos ou
caminhos é .)(mn
n
+
10
Coeficientes Binomiais
• Considere (a+b)n;• Observe que
(a+b)3=1a3+3a2b+3ab2+1b3
• Qual é o coeficiente do termo akbn-k?
– ;
– Porque esta é a contagem da quantidade de formas quepodemos escolher os k termos a dentre as npossibilidades;
– Ou ainda, podemos interpretar este número como sendo a quantidade de vezes em que cada multiplicação ocorre naexpansão da expressão algébrica.
)(n
k
11
Coeficientes Binomiais
• Certamente você já utilizou o triângulo de Pascal no ensino médio– Cada número é a soma dos dois números
diretamente sobre ele;
12
Coeficientes Binomiais
• Para quê serve o triângulo de Pascal?– Calcular coeficientes binomiais!– A (n+1)-ésima linha do triângulo nos fornece valores
para 0<=i<=n.– Ou seja, pode ser encontrado no triângulo na linha
n+1 e coluna k
• Lembrando que a primeira coluna é enumerada 0.
• A beleza deste recurso é a forma como ele revelaidentidades interessantes– Como por exemplo, a soma de todos os elementos na
linha n+1 é igual a 2n.
)(n
i
)(n
k
13
Coeficientes Binomiais
• Como são computados coeficientes binomiais?
• Este método possui um problemacomputacional– Os cálculos intermediários de fatorial podem
causar overflow aritmético mesmo quando o resultado total cabe em um tipo inteiro.
!)!(
!)(
kkn
nn
k
−
=
14
Coeficientes Binomiais
• Existe uma maneira mais estávelcomputacionalmente– Utilizar a relação de recorrência implícita na
construção do triângulo de Pascal, ou seja:
)()()(11
1
−−
−+=
n
k
n
k
n
k
15
Coeficientes Binomiais
• Por quê funciona?
– Considere a possibilidade do n-ésimo elemento aparecer
em um dos subconjuntos de k elementos:
• Se pertencer, podemos completar o subconjunto tomandok-1 elementos dentre os outros n-1;
• Se não pertencer, devemos tomar todos os k elementosdentre os n-1 restantes;
– Não há sobreposição entre estes casos, e todas as possibilidades estão inclusas, ou seja, a soma total incluitodos os k-subconjuntos.
)(n
k
16
Coeficientes Binomiais
• Como casos base para esta recorrência, temos:
• Vejamos como avaliar esta recorrênciaalgoritmicamente.
1)(
1)(
)(
0
1
=
=
=
−
k
k
kn
mm
17
Coeficientes Binomiais
• Pelas propriedades do triângulo, sabemos que:1. O elemento do topo é 1;2. Os elementos das extremidades laterais são 1.
• Vamos construir uma tabela/matriz com esta forma
11
11
11
11
1
18
Coeficientes Binomiais
• Pela relação de recorrência, sabemos que:1. .
• Ou seja, m[i][j]=m[i-1][j-1]+m[i-1][j];
)()()(11
1
−−
−+=
n
k
n
k
n
k
14641
1331
121
11
1
19
Coeficientes Binomiais
20
Coeficientes Binomiais
• Para calcularmos o coeficiente binomial criamosuma tabela quadrada de dimensões n+1;
• Não calcularmos o coeficiente diretamente, antes disto, calculamos os coeficientes anteriores– Construindo a solução gradativamente.
• Para calcularmos o coeficiente bastaria adicionaruma linha e coluna à nossa tabela– Aproveitando os resultados anteriores.
• O fundamento da programação dinâmica é exatamenteeste!
)(n
k
)(n
k
21
Programação Dinâmica
• Como visto anteriormente, problemas combinatórios nospedem que achemos a melhor solução possível, respeitando algumas restrições;
• O backtracking busca por todas as soluções possíveis e seleciona a melhor– Logo, retorna a resposta correta;– Para problemas grandes, é inviável.
• Algoritmos gulosos fazem sempre a melhor escolha emcada ponto de decisão– Sem provas de corretude, falham em obter a melhor
solução.
22
Programação Dinâmica
• A programação dinâmica nos fornece umamaneira de projetar algoritmos que: – Sistematicamente exploram todas as
possibilidades (corretude);– Armazena resultados a fim de evitar computação
redundante (eficiência).• Tais algoritmos são definidos por recursividade
– Definem a solução para o problema em termosda solução de problemas menores;
– O que pode até lembrar o backtracking de certaforma.
23
Programação Dinâmica
• Um possível defeito em uma busca recursiva é a computação redundante, ou seja, a exploraçãoredundante do espaço de busca– Para evitar tal defeito, podemos armazenar
informações sobre a busca;– Por exemplo, porque a busca em largura é finita?
• Porque marcarmos vértices já visitados, para quenão os visitemos novamente.
• Porquê o backtracking é ineficiente?– Porque explora todas as possibilidades, ao invés
de explorar apenas aquelas inéditas.
24
Programação Dinâmica
• A Programação Dinâmica é uma técnica para acelerarmos algoritmos recursivos– Armazenando resultados parciais.
• O “macete” é perceber que o algoritmo recursivocomputa os mesmos subproblemas repetidamente– Então, a medida que são computados, armazenamos a
resposta, para que, quando surgirem novamente, apenasconsultemos o resultado armazenado.
• Note que apenas depois de certificar-se que o algoritmorecursivo é correto passamos a nos preocupar emacelerá-lo.
25
Casamento Inexato de Padrões
• Anteriormente vimos o casamento exato de padrões– Dada uma string s e um texto t, verificamos se há alguma
ocorrência exata de s em t.
• Este não é o caso normalmente, o que ocorre na maioriadas vezes é o casamento inexato de padrões– Uma vez que o casamento é inexato, precisamos definir
uma função de custo que nos diga qual é a distânciaentre duas strings
• Ou seja, quantas modificações precisam ser feitas para transformarmos uma string na outra.
26
Casamento Inexato de Padrões
• Substituições– A troca de um caractere do padrão por um caractere
diferente contido no texto• Por exemplo, “calda” e “cauda”.
• Inserção– A inserção de um caractere no padrão para facilitar o
casamento• Por exemplo, “arco” e “barco”.
• Remoção– A remoção de um caractere do padrão para facilitar o
casamento• Por exemplo, “marco” e “arco”.
27
Casamento Inexato de Padrões
• Para determinar a similaridade entre strings precisamosatribuir pesos a estas operações de transformação– Atribuindo peso 1 a cada operação nos fornece a
distância de edição;– Embora outros pesos forneçam resultados interessantes.
• Podemos calcular a distância de ediçãocomputacionalmente, através de um algoritmo recursivo;
• Observemos que: – O último caractere de uma string deve ser “casado”,
substituído, inserido ou deletado;– Ignorando o caractere envolvido na última computação,
nos deixa com um par de strings menores.
28
Casamento Inexato de Padrões
• Se efetuarmos as três operações, teremos 3 pares de strings resultantes– Se soubéssemos qual é o custo em cada
operação, poderíamos simplesmente escolher a mais eficiente, sem efetuar as outras duas;
– Acontece que podemos “aprender” este custo, usando a recursividade.
• Consideremos dois últimos caracteres i e j e seus dois prefixos s e t, respectivamente.
29
Casamento Inexato de Padrões
• Consideremos ainda– 0: Casamento;– 1: Inserção;– 2: Remoção;– indel(c) é o custo de inserir ou remover o
caractere c• Valor 1 para ambos.
– match(c, d) é o custo de transformar o caracterec no caractere d
• Para a distância de edição, 0 caso c=d, e 1 casocontrário.
30
Casamento Inexato de Padrões
31
Casamento Inexato de Padrões
• Este algoritmo guloso é correto, porém, impraticável– Incrivelmente lento para algumas dezenas de caracteres;– Sua complexidade é exponencial, crescendo a 3n
• Claramente são efetuadas computações redundantes;• São possíveis |s|·|t| chamadas recursivas únicas, devido
às combinações de parâmetros (i, j);
• Uma implementação deste algoritmo, acelerado porprogramação dinâmica utiliza uma tabela bidimensionalem que cada uma das |s|·|t| células contém o custo dasolução ótima dos subproblemas– Também há uma célula “pai”, para explicar em que
situação se chega a tal célula.
32
Casamento Inexato de Padrões
33
Casamento Inexato de Padrões
• A versão utilizando programação dinâmica possui trêsdiferenças básicas em relação à gulosa:1. Obtém resultados intermediários procurando na tabela,
ao invés de fazer sempre chamadas recursivas;2. Atualiza o campo “pai” (“parent”) de cada célula, o que
permite a reconstrução da sequência posteriormente;3. É “instrumentada”, utilizando a função goal_cell() entre
outras, ao invés de simplesmente retornar um valor. Istopermite aplicação a outros problemas facilmente.
34
Casamento Inexato de Padrões
• Algumas observações:– O primeiro caractere de uma string é ‘ ’, de
maneira que o primeiro caractere real éarmazenado na posição 1
• A primeira linha e coluna da tabela armazenam a distância de edição em relação a string vazia;
• Para uma string de tamanho i, tal custo é o mesmoque i, inserções ou remoções.
35
Casamento Inexato de Padrões
36
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
37
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
38
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
39
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
40
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
41
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
42
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
43
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
44
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
45
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
46
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
47
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
48
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
49
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shall not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
50
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
51
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
Vermelho: Caracteres comparados;Azul: Troca;Verde: Inserção;Preto: Remoção.
52
Casamento Inexato de Padrões
• Abaixo, um exemplo usando “thou shalt not” e “you should not”.
53
Casamento Inexato de Padrões
• Esta implementação nos retorna o valor da soluçãoótima, porém, não nos retorna a solução em si– Podemos converter “thou shalt not” em “you should not”
em 5 movimentos, mas qual é a sequência de operaçõesde edição?
• As possíveis soluções são descritas por trajetos natabela– Começando pela posição inicial (0, 0);– Até a posição final (|s|, |t|);– A idéia é seguir o trajeto refazendo as operações de cada
passo• Armazenadas no campo parent de cada célula.
54
Casamento Inexato de Padrões• Para fazermos isto, partimos da posição final (|s|, |t|), seguindo o
conteúdo do campo parent até uma célula anterior– Repetimos este processo até chegarmos na posição inicial (0,
0).• O campo parent da posição m[i, j] nos diz se a operação em (i, j) foi
substituição (M), inserção (I) ou remoção (D);• A sequência para o nosso exemplo é
DSMMMMMISMSMMMM• Significando:
– Delete o primeiro ‘t’;– Substitua ‘h’ por ‘y’;– Case os próximos 5 caracteres;– Insira ‘o’;– Substitua ‘a’ por ‘u’;– Substitua ‘t’ por ‘d’.
55
Casamento Inexato de Padrões
56
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
57
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
58
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
59
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
60
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
61
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
62
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
63
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
64
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
65
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
66
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
67
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
68
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
69
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
70
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
71
Casamento Inexato de Padrões• Reconstruindo o caminho até o início
– M: 0 (i-1, j-1);– I: 1 (i, j-1);;– D: 2 (i-1, j).
72
Casamento Inexato de Padrões
• “ thou shalt not”• “ you should not”• DSMMMMMISMSMMMM• Significando:
– Delete o primeiro ‘t’;– Substitua ‘h’ por ‘y’;– Case os próximos 5 caracteres;– Insira ‘o’;– Substitua ‘a’ por ‘u’;– Substitua ‘t’ por ‘d’;
73
Casamento Inexato de Padrões
• Ok, mas para que precisamos das funçõesindel(c), match(c, d), goal_cell() e row_init()?– Já sabemos que seus valores são 1, 0/1, (|s|, |t|)
e 0.
• Realmente esta “infraestrutura” é muito grandepara o problema, mas podemos utilizá-la para resolver casos especiais de casamento inexatode padrões– Basta alterar o conteúdo destas funções.
74
Substring Matching
• Suponha que desejamos encontrar a melhor ocorrênciade um padrão s em um longo texto t
– O início do casamento pode ser em qualquer posição do texto, não necessariamente no início;
– Também, a posição final não necessariamente é o final do texto.
• Por exemplo, queremos encontrar a ocorrência maissemelhante de “Skiena” em “Skienna, Skena, Skina, …”;
• O código anterior não terá sensibilidade suficiente para nos atender.
75
Substring Matching
76
Maior Subsequência Comum
• Nesta variante, estamos interessados em obter a maiorquantidade de caracteres não necessariamentecontíguos mas que aparecem na mesma ordem emduas strings
– Ex.: democrata e republicano.
• Para isto, devemos evitar a substituição de caracteresnão idênticos– Basta tornar o custo de uma substituição maior que uma
inserção somada a uma remoção;– No fim, as posições em que houver casamento indicam os
caracteres envolvidos na maior subsequência comum.
77
Maior Subsequência Comum
78
Maior Subsequência Monotônica
• Uma sequência numérica é monotonicamente crescentese o i-ésimo elemento é no mínimo tão grande quando o elemento i-1
• O problema de maior sequência monotônica procurapela menor quantidade de caracteres a seremremovidos de uma string s tal que o que sobre seja umasubsequência monotonicamente crescente– Ex.: “243517698” produz “23568”.
• Na verdade este problema é de maior subsequência comum, em que a segunda string é formada pelaordenação da primeira– Ex.: “243517698” e “123456789””produzem “23568”.
79
Casamento Inexato de Padrões
• Como vimos, nosso algoritmo para distância de edição simples pode realizar tarefas maisárduas facilmente– A idéia é ter a percepção de que um determinado
problema na verdade é um caso especial de casamento inexato de padrões.
80
Programação Dinâmica
• A programação dinâmica é aplicável a problemas que possuam as seguintes propriedades:– Subestrutura Ótima
• O problema pode ser dividido sucessivamente, e a combinação das soluções ótimas dos subproblemas corresponde à solução ótima do problema original.
– Superposição de Subproblemas• O espaço de subproblemas é pequeno, e eles se repetem
durante a solução do problema original.
• Além disso, a programação dinâmica é melhor utilizada em algoritmos recursivos.
81
Programação DinâmicaTópicos de Projeto
• Ao contrário da estratégia dividir e conquistar, o balanceamento ideal dos subproblemas requer o tamanho deles seja não muito distante do tamanho do problema original– De fato, quando eles são menores que o problema original
por um fator multiplicativo, a abordagem se encaixa melhor na estratégia dividir e conquistar.
• A definição da estrutura da tabela em que são armazenadas as soluções é muito importante– A pesquisa de uma entrada e a recuperação da solução
devem ser eficientes.
82
Programação Dinâmica
• Vantagens:– Economizam computação em problemas que
possuem superposição de subproblemas• Ganho em desempenho.
• Desvantagens:– O número de soluções armazenadas na tabela
pode crescer rapidamente caso o espaço de soluções não seja pequeno
• Exigindo assim muita memória.
83
Sumário dos Arquivos
• binomial.c: computa coeficientes binomiais usandoprogramação dinâmica;
• bool.h: biblioteca com o tipo bool para C;• editbrute.c: calcula a distância de edição usando força
bruta;• editbrute_exemplo.c: mesmo código anterior, porém,
adaptado para a versão básica do problema;• editdistance.h: contém a estrutura e constantes
utilizadas na distância de edição;• editdistance.c: calcula a distância de edição via
programação dinâmica;• editdistance_exemplo.c: mesmo código anterior,
porém, adaptado para a versão básica do problema;
84
Outros ExemplosTemos tempo?
85
Soma de Subconjuntos
• Dado um conjunto de n números ai que somamM, e qualquer K<=M, existe um subconjuntodestes números tal que somem K?– Assumimos n até 1000, mas M ou K menores.
• Podemos usar uma tabela unidimensional m[0 … M], em que m[b] indica se b é um resultadopossível da soma para problemas menores.
86
Soma de Subconjuntos
87
Troco de Moedas
• Pense agora que os números ai são moedas, e vocêquer fazer um troco de exatamente K, porém, com o menor número de moedas possível.
• A estrutura de solução do exemplo anterior não muda, apenas modificamos o significado do vetor m
– Agora, m[b] não é 0 ou 1, mas sim exatamente o númerode moedas necessárias para somar K.
• Nota: se você quiser especificar quantas moedas de cada tipo (valor) são utilizadas, transforme o vetor m emuma matriz, em que a soma K é descrita.
88
Cake Cutting
89
Soma Máxima Em Uma Linha
• Dado um vetor com n números positivos e negativos, encontre o subvetor com um oumais números consecutivos cuja soma é a maior;– O algoritmo intuitivo é O(n3).
• O algoritmo a seguir é O(n)– Seja m[i] a soma máxima de qualquer subvetor
que termina no elemento a[i]. Então m[i] ésimplesmente max(a[i], m[i-1]+a[i]).
90
Perguntas?
91
Na próxima aula
• Práticas.
92
FIM