Professional Documents
Culture Documents
Na aula anterior
! Prova
Na aula de hoje
! Tcnicas bsicas de contagem; ! Tentativa e Erro; ! Recursividade.
Problemas Combinatrios
! Combinatria a matemtica do contar
! Existem diversos problemas bsicos de contagem que ocorrem repetidamente em cincia da computao e em programao.
Problemas Combinatrios
! O espao de busca de um problema combinatrio o conjunto de todas as solues possveis, podendo ser restrito as solues viveis ou no; ! Uma soluo vivel uma soluo completa, que atende aos requisitos do problema; ! Uma soluo invivel uma soluo incompleta ou mesmo uma soluo nula.
Problemas Combinatrios
! Ainda, podemos ter solues equivalentes, ou seja, mais de uma soluo vivel par ao mesmo problema; ! Alguns problemas possuem uma soluo melhor que todas as outras, chamada de soluo tima.
Estratgias de Projeto de Algoritmos ! Existem diferentes maneiras de se projetar um algoritmo para soluo de um determinado problema combinatrio; ! Ao projetar um algoritmo, pensamos no problema e em suas caractersticas
! Que tipo de algoritmo teria melhor desempenho para este problema?
11
Estratgias de Projeto de Algoritmos ! Ao tratarmos de problemas difceis, como os NPCompletos, sabemos que no so conhecidas tcnicas eficientes para a sua resoluo
! Ento, podemos analisar as caractersticas da entrada para o problema para obter alguma vantagem no projeto de uma soluo?
12
TENTATIVA E ERRO
Tentativa e Erro
! Tentativa e Erro, Fora Bruta ou Busca Exaustiva a estratgia mais trivial e intuitiva para soluo de problemas ! Consiste em enumerar todas as combinaes possveis para uma soluo e avaliar se satisfazem ao problema
Tentativa e Erro
! Consideremos o Problema da Mochila: ! Dada uma mochila com capacidade C, e n objetos com peso pi (i=1n), o objetivo preencher a mochila com o maior peso total, respeitando a capacidade C.
15
Tentativa e Erro
! Suponha uma mochila com capacidade de 15 kg e objetos de peso 12 kg, 2 kg, 4 kg e 8 kg; ! Este problema possui mais que uma soluo tima, ou seja, possui solues timas equivalentes:
! 12 kg + 2 kg; ! 8 kg + 2 kg + 4 kg.
16
Tentativa e Erro
! Um mtodo baseado em tentativa e erro testaria todas as combinaes entre elementos checando: ! Se a soluo vivel; ! Se a soluo possui valor melhor que outra encontrada anteriormente. ! Para determinar se uma soluo a melhor de todas desta forma, necessrio enumerar todas.
17
Tentativa e Erro
! Consideremos agora, o problema de decifrar uma senha que contm apenas nmeros: ! S existe uma soluo tima; ! No so consideradas solues parciais.
18
Tentativa e Erro
! Um mtodo baseado em tentativa e erro: ! Enumera todas as combinaes dos nmeros 0-9 para cada dgito da senha; ! Quanto maior a senha, pior o desempenho; ! Poderia ser utilizado um mtodo que levasse em considerao alguma estatstica sobre composio de senhas e dar prioridade s mais provveis.
19
Tentativa e Erro
! Dependendo da caracterstica do problema camos em uma das situaes para tentativa e erro: ! Gerar todas as Combinaes; ! Gerar todos os Arranjos; ! Gerar todas as Permutaes.
20
Permutao
! Dado um conjunto U com n elementos, uma permutao de seus elementos uma ordenao dos mesmos; ! A quantidade de permutaes possveis para n elementos definida pelo fatorial da cardinalidade do conjunto
! Ou seja n!; ! Que equivale a n!(n-1) !(n-2) !!1.
22
Permutao
! Por exemplo, o conjunto U={1, 2, 3} de cardinalidade 3, possui 6 permutaes:
! 1 2 3; ! 1 3 2; ! 2 1 3; ! 2 3 1; ! 3 1 2; ! 3 2 1.
23
Gerando Permutaes ! A gerao de todas as permutaes pode ser feita seguindo uma ordem lgica
! Estabelecendo uma relao entre uma permutao e a prxima; ! Desta forma, possvel numerar cada uma das permutaes dentro da sequncia gerada;
24
Gerando Permutaes
26
Gerando Permutaes
! Como dito anteriormente, o nmero de permutaes fatorial no nmero de elementos
! O que significa crescimento muito rpido.
27
Gerando Permutaes
! O algoritmo Trotter-Johnson (ou SteinhausJohnson Trotter) gera permutaes de troca mnima:
! A partir de uma permutao, apenas dois elementos so trocados de lugar (i. e., transpostos) para gerar a prxima permutao.
1 2 3 1 3 2 3 1 2 3 2 1 2 3 1 2 1 3
28
Gerando Permutaes ! Curiosamente, Trotter (1962) e Johnson (1963) proporam o algoritmo e ambos levaram o crdito; ! Porm, Donald Knuth, no terceiro volume do The Art of Programming diz que nem um nem outro.
! Tocadores de sinos, segundo registrado por um livro antigo teriam desenvolvido o algoritmo.
29
Combinao
! Dado um conjunto U com n elementos, uma combinao sem repetio indica quantos subconjuntos diferentes de s elementos do conjunto U podem ser formados, no considerando a ordem dos elementos; ! Denotada por
n! C = s!(n ! s )!
n s
30
Combinao ! Por exemplo, o conjunto U = {A, B, C, D} possui 6 subconjuntos de dois elementos. So eles:
! AB, AC, AD, BC, BD, CD.
31
Arranjo
! Dado um conjunto U com n elementos, um arranjo simples indica quantas ordenaes dos elementos de U tomados r a r so possveis, em que se diferencia a ordem dos elementos, sem repeties; ! Denotada por
n! A = (n ! r )!
n r
32
Arranjo
! Dado um conjunto U com n elementos, um arranjo com repeties indica quantas ordenaes dos elementos de U tomados r a r so possveis, em que se diferencia a ordem dos elementos, com repeties; ! Denotada por
A =n
n r
33
Arranjo
! Por exemplo, o conjunto U = {A, B, C, D} possui 12 arranjos simples e 16 arranjos com repetio ! AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC; ! AA, AB, AC, AD, BA, BB, BC, BD, CA, CB, CC, CD, DA, DB, DC, DD.
34
Gerao de Subconjuntos ! Atravs de backtracking, possvel gerar todos os subconjuntos e tambm todas as permutaes; ! Tema de uma aula futura (ou do fim desta aula?)
35
RECURSIVIDADE
Recursividade ! Uma funo pode chamar quaisquer outras funes, inclusive a si mesma
! Uma funo que faz chamadas a si prpria dita recursiva.
37
Recursividade
! Vantagem
! Reduo do tamanho do cdigo fonte.
! (Des)Vantagem
! Permite descrever algoritmos de forma mais clara e concisa.
! Desvantagens
! Reduo do desempenho de execuo devido ao tempo para gerenciamento de chamadas; ! Dificuldades na depurao de programas recursivos, especialmente se a recurso for muito profunda.
38
Recursividade
! Usa-se uma pilha para armazenar os dados usados em cada chamada de uma funo que ainda no terminou; ! Todos os dados no globais so armazenados na pilha, informando o resultado corrente; ! Quando uma ativao anterior prossegue, os dados da pilha so recuperados.
39
Recursividade
40
Recursividade
! Por exemplo, consideremos a definio de uma funo que calcula o fatorial de um nmero n:
! No recursiva
!! n! = 1 !! n! = 1!2 !3 !4 ! !n para n=0; para n >= 1;
! Recursiva
!! n! = 1 !! n! = n !(n-1)! para n=0; para n >= 1.
41
Recursividade
42
Recursividade
! Primeira chamada
5*
43
Recursividade
! Segunda chamada
4* 5*
44
Recursividade
! Terceira chamada
3* 4* 5*
45
Recursividade
! Quarta chamada
2* 3* 4* 5*
46
Recursividade
! Quinta chamada 1 2* 3* 4* 5*
47
Recursividade
! Primeiro retorno 1 2* 3* 4* 5*
48
Recursividade
! Segundo retorno
2*1 3* 4* 5*
49
Recursividade
! Terceiro retorno
3*2 4* 5*
50
Recursividade
! Quarto retorno
4*6 5*
51
Recursividade
! Quinto e ltimo retorno ! Por fim, a funo retorna 120, o resultado de 5!
5*24
52
Recursividade
! O projeto de uma funo recursiva exige considerarmos duas partes cruciais: ! Critrio de parada; ! Operaes e chamada recursiva.
53
Recursividade
! Funes recursivas introduzem a possibilidade de Loop Infinito ! fundamental que a chamada recursiva a uma funo A esteja sujeita a uma condio C, a qual se torna satisfeita em algum momento da computao. ! Se no existisse a condio n=0, no exemplo anterior, quando a funo terminaria? ! Critrio de parada ! Faz com que o procedimento termine !!!
54
Recursividade
55
Recursividade
! Para projetar um algoritmo recursivo
! Defina pelo menos um caso bsico (condio de terminao); ! Quebre o problema em problemas menores, definindo o(s) caso(s) com recurso(es); ! Fazer o teste de finitude, isto , certificar-se de que as sucessivas chamadas recursivas levam obrigatoriamente, e numa quantidade finita de vezes, ao(s) caso(s) bsico(s). ! Uma dica vlida o uso de variveis globais quando possvel, para evitar confuso na passagem de parmetros.
56
Recursividade
! Em comparao, verses iterativas so geralmente mais rpidas ! Porm, existem problemas inerentemente recursivos
! Percurso em rvores e grafos; ! Algoritmos de diviso e conquista.
! Em suma, a maioria dos algoritmos iterativos que usam pilhas tendem a ser modelados mais facilmente em verses recursivas; ! Erros de implementao geralmente acarretam em estouro de pilha.
57
Na prxima aula
! Diviso e Conquista.
59
Perguntas?