BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Documentos relacionados
Recursividade, Tentativa e Erro

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Prof. A. G. Silva. 25 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de / 35

Algoritmos Combinatórios: Introdução

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Análise e Complexidade de Algoritmos

Técnicas de análise de algoritmos

# Estrutura de Dados # Aula 08 Recursão (conceito, utilização, exemplos) Prof. Leinylson Fontinele Pereira

Técnicas de projeto de algoritmos: Indução

Aula prática 5. Funções Recursivas

Paradigmas de Projetos de Algoritmos

BCC202 - Estrutura de Dados I

Estrutura de Dados Conceitos Iniciais

Generating Fast, Sorted Permutation

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

BCC204 - Teoria dos Grafos

ALGORITMOS AVANÇADOS UNIDADE I Análise de Algoritmo - Notação O. Luiz Leão

MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

Teoria dos Grafos Aula 14

Estruturas de Dados Algoritmos

Projeto e Análise de Algoritmos

Aula 05: - Recursão (parte 1)

Introdução Paradigmas

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Projeto e Análise de Algoritmos. Introdução. Prof. Ademir Constantino Universidade Estadual de Maringá Departamento de Informática

Recursão. Prof. Cristiano André da Costa. [Versão de Março de 2000] Definição

Aula 05: - Recursão (parte 1)

BCC202 - Estrutura de Dados I

Complexidade de Algoritmos

Projeto e Análise de Algoritmos

Introdução a Algoritmos Parte 08

Algoritmos e Estruturas de Dados I Linguagem C

Revisão: Tipo Abstrato de Dados Recursividade

Projeto e Análise de Algoritmos

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Análise de Algoritmos Parte 4

SCC Capítulo 2 Recursão

Estruturas de Dados 2

Abordagens para Resolução de Problemas

Teoria da Computação. Complexidade computacional classes de problemas

Aula 05. Modularização Função Subrotina Recursividade

Aula 7. Aula de hoje. Aula passada

4. COMBINATÓRIA BÁSICA. Combinatória: ramo da matemática que trata de arranjos de objetos (configurações satisfazendo propriedades específicas).

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

Programação Dinâmica I SCC0210 Algoritmos Avançados (2/2011) Lucas Schmidt Cavalcante

Cálculo Numérico BCC760

Programação. Prof Marcelo Zorzan Prof a Melissa Zanatta

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Buscas Informadas ou Heurísticas - Parte II

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO PRÓ-REITORIA DE ENSINO DE GRADUAÇÃO

Informática Parte 17 Prof. Márcio Hunecke

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

> Princípios de Contagem e Enumeração Computacional 1/13

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Curso: Ciência da Computação Turma: 6ª Série. Teoria da Computação. Aula 6. Programas, Máquinas e Computações

Recursividade Alguns problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema.

Algoritmos de Ordenação

PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos

Um alfabeto é um conjunto de símbolos indivisíveis de qualquer natureza. Um alfabeto é geralmente denotado pela letra grega Σ.

Análise e Complexidade de Algoritmos

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO PRÓ-REITORIA DE ENSINO DE GRADUAÇÃO

Técnicas de Programação III Análise de Algoritmos (Continuação)

Análise de Algoritmos. Prof. Sérgio Carlos Portari Júnior

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Universidade Federal do Espírito Santo Centro de Ciências Agrárias CCA UFES Departamento de Computação. Combinatória

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular ALGORITMOS E ESTRUTURAS DE DADOS Ano Lectivo 2018/2019

BCC402 Algoritmos e Programação Avançada. Prof. Marco Antonio M. Carvalho Prof. Túlio Toffolo 2012/1

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Preliminares. Profa. Sheila Morais de Almeida. agosto

Backtracking. Túlio Toffolo Marco Antônio Carvalho BCC402 Aula 10 Algoritmos e Programação Avançada

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Programação I Estruturas de Repetição

Programação Estruturada

ANÁLISE DE ALGORITMOS

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

Algoritmos de Ordenação

Notas sobre Sequências e Cardinalidade (1)

Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens

Análise do problema. Desenvolvimento de programas. Desenvolvimento do algoritmo. Análise do problema

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

TEORIA: 60 LABORATÓRIO: 0

Análise de Algoritmos Estrutura de Dados II

Aula 1. Teoria da Computação III

Projeto de Algoritmos e Indução Matemática

Técnicas de Projeto de Algoritmos

Análise e Projeto de Algoritmos

Desenvolvimento de programas. Análise do problema. Análise do problema. Análise do problema. Desenvolvimento do algoritmo. Codificação do programa

Faculdade de Computação

Análise Combinatória

Projeto e Análise de Algoritmos NP Completude. Prof. Humberto Brandão

Desenvolvimento de programas

Transcrição:

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Na aula anterior Prova 2

Na aula de hoje Técnicas básicas de contagem; Tentativa e Erro; Recursividade. 3

Problemas Combinatórios Combinatória é a matemática do contar Existem diversos problemas básicos de contagem que ocorrem repetidamente em ciência da computação e em programação. Problemas Combinatórios são aqueles em que uma solução é a combinação de um subconjunto de elementos São famosos por sua relação com a esperteza e insights; Uma vez que se coloca o problema sob a perspectiva certa, a solução pode se tornar óbvia. 4

Problemas Combinatórios O espaço de busca de um problema combinatório é o conjunto de todas as soluções possíveis, podendo ser restrito as soluções viáveis ou não; Uma solução viável é uma solução completa, que atende aos requisitos do problema; Uma solução inviável é uma solução incompleta ou mesmo uma solução nula. 5

Problemas Combinatórios Ainda, podemos ter soluções equivalentes, ou seja, mais de uma solução viável par ao mesmo problema; Alguns problemas possuem apenas uma solução melhor que todas as outras, chamada de solução ótima. 6

Técnicas Básicas de Contagem Basicamente, existem três regras básicas de contagem a partir das quais várias formas de contagem são geradas: Regra da Soma; Regra do Produto; Regra de Inclusão-Exclusão. 7

Técnicas Básicas de Contagem Regra da Soma: Se há A possibilidades em um conjunto A e B possibilidades em um conjunto B, então há A + B possibilidades de A ou B ocorrerem, assumindo que os conjuntos possuem elementos distintos. 8

Técnicas Básicas de Contagem Regra do Produto: Se há A possibilidades em um conjunto A e B possibilidades em um conjunto B, então há A B formas de combinar um elemento de A com um elemento de B. 9

Técnicas Básicas de Contagem Regra da Inclusão-Exclusão: A regra da soma é um caso especial da regra de Inclusão-Exclusão; Normalmente, os elementos dos conjuntos podem ser repetidos, e portanto, induzirem ao erro de serem contados mais de uma vez; A U B = A + B A B ; Outra técnica poderosa é estabelecer bijeções Ou seja, um mapeamento um para um entre elementos de diferentes conjuntos. 10

Estratégias de Projeto de Algoritmos Existem diferentes maneiras de se projetar um algoritmo para solução de um determinado problema combinatório; Ao projetar um algoritmo, pensamos no problema e em suas características Que tipo de algoritmo teria melhor desempenho para este problema? 11

Estratégias de Projeto de Algoritmos Ao tratarmos de problemas difíceis, como os NP- Completos, sabemos que não são conhecidas técnicas eficientes para a sua resolução Então, podemos analisar as características da entrada para o problema para obter alguma vantagem no projeto de uma solução? 12

Tentativa e Erro Tentativa e Erro, Força Bruta ou Busca Exaustiva é a estratégia mais trivial e intuitiva para solução de problemas Consiste em enumerar todas as combinações possíveis para uma solução e avaliar se satisfazem ao problema Escolhe a melhor das soluções, ou solução ótima. Apesar de trivial, possui desempenho muito ruim. 13

Tentativa e Erro Consideremos o Problema da Mochila: Dada uma mochila com capacidade C, e n objetos com peso p i (i=1 n), o objetivo é preencher a mochila com o maior peso total, respeitando a capacidade C. 14

Tentativa e Erro Suponha uma mochila de capacidade 15 kg e objetos de peso 12 kg, 2 kg, 4 kg e 8 kg; Este problema possui mais que uma solução ótima, ou seja, possui soluções ótimas equivalentes: 12 kg + 2 kg; 8 kg + 2 kg + 4 kg. Soluções viáveis seriam, entre outras: 12 kg, 2 kg, 4 kg, 8 kg, 2kg + 4 kg, etc. Uma solução inviável seria 12 kg + 4 kg. 15

Tentativa e Erro Um método baseado em tentativa e erro testaria todas as combinações entre elementos checando: Se a solução é viável; Se a solução possui valor melhor que outra encontrada anteriormente. Para determinar se uma solução é a melhor de todas desta forma, é necessário enumerar todas. 16

Tentativa e Erro Consideremos agora, o problema decifrar uma senha que contém apenas números: Só existe uma solução ótima; Não são consideradas soluções parciais. 17

Tentativa e Erro Um método baseado em tentativa e erro: Enumera todas as combinações dos números 0-9 para cada dígito da senha; Quanto maior a senha, pior o desempenho; Poderia ser utilizado um método que levasse em consideração alguma estatística sobre composição de senhas e dar prioridade às mais prováveis. 18

Tentativa e Erro Dependendo da característica do problema caímos em uma das situações para tentativa e erro: Gerar todas as Combinações; Gerar todos os Arranjos; Gerar todas as Permutações. 19

Permutação Dado um conjunto U com n elementos, uma permutação de seus elementos é uma ordenação dos mesmos; A quantidade de permutações possíveis para n elementos é definida pelo fatorial da cardinalidade do conjunto Ou seja n!; Que equivale a n (n-1) (n-2) 1. 20

Permutação Por exemplo, o conjunto U={1, 2, 3} de cardinalidade 3, possui 6 permutações: 1 2 3; 1 3 2; 2 1 3; 2 3 1; 3 1 2; 3 2 1. 21

Gerando Permutações A geração de todas as permutações pode ser feita seguindo uma ordem lógica Estabelecendo uma relação entre uma permutação e a próxima; Desta forma, é possível numerar cada uma das permutações dentro da sequência gerada; Dada uma determinada posição dentro da sequência de todas permutações, é possível determinar qual é a permutação correspondente (rank); Ainda, dada uma permutação, é possível determinar qual é sua posição (número) dentro da sequência de todas as permutações (unrank). 22

Gerando Permutações Na linguagem C++ a função next_permutation() gera permutações de um vetor Em ordem lexicográfica; A partir de uma permutação, gera a próxima em ordem lexicográfica crescente e true; Caso não haja tal permutação, gera a menor permutação em ordem lexicográfica e false; Não gera permutações de repetições. 23

Gerando Permutações 24

Gerando Permutações Como dito anteriormente, o número de permutações é fatorial no número de elementos O que significa crescimento muito rápido. Diferentes algoritmos de geração de permutações possuem velocidades diferentes Muito depende da complexidade da relação entre uma permutação e a próxima. Um algoritmo de bom desempenho é o Trotter- Johnson. 25

Gerando Permutações O algoritmo Trotter-Johnson (ou Steinhaus Johnson Trotter) gera permutações de troca mínima: A partir de uma permutação, apenas dois elementos são trocados de lugar (i. e., transpostos) para gerar a próxima permutação. 1 2 3 1 3 2 3 1 2 3 2 1 2 3 1 2 1 3 26

Gerando Permutações Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; Porém, 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. 27

Gerando Permutações O código do algoritmo Trotter-Johnson está disponível no Moodle Além dele, o algoritmo de Dijkstra para geração de permutações em ordem lexicográfica e sem repetições também está disponível. 28

Combinação Dado um conjunto U com n elementos, uma combinação sem repetição indica quantos subconjuntos diferentes de s elementos do conjunto U podem ser formados, não considerando a ordem dos elementos; Denotada por C n s n! = s!( n s)! 29

Combinação Por exemplo, o conjunto U = {A, B, C, D} possui 6 subconjuntos de dois elementos, são eles: AB,AC,AD,BC,BD,CD. 30

Arranjo Dado um conjunto U com n elementos, um arranjo simples indica quantas ordenações de dos elementos de U tomados r a r são possíveis, em que se diferencia a ordem dos elementos, sem repetições; Denotada por A n r n! = ( n r)! 31

Arranjo Dado um conjunto U com n elementos, um arranjo com repetições indica quantas ordenações de dos elementos de U tomados r a r são possíveis, em que se diferencia a ordem dos elementos, com repetições; n r Denotada por A = n r 32

Arranjo Por exemplo, o conjunto U = {A, B, C, D} possui 12 arranjos simples e 16 arranjos com repetição 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. 33

Geração de Subconjuntos Através de backtracking, é possível gerar todos os subconjuntos e também todas as permutações; Tema de uma aula futura. 34

Recursividade Uma função pode chamar quaisquer outras funções, inclusive a si mesma Uma função que faz chamadas a si própria é dita recursiva. É um conceito poderoso, pois define conjuntos infinitos com instruções finitas. 35

Recursividade Vantagem Redução do tamanho do código fonte. (Des)Vantagem Permite descrever algoritmos de forma mais clara e concisa. Desvantagens Redução do desempenho de execução devido ao tempo para gerenciamento de chamadas; Dificuldades na depuração de programas recursivos, especialmente se a recursão for muito profunda. 36

Recursividade Usa-se uma pilha para armazenar os dados usados em cada chamada de uma função que ainda não terminou; Todos os dados não globais são armazenados na pilha, informando o resultado corrente; Quando uma ativação anterior prossegue, os dados da pilha são recuperados. 37

Recursividade 38

Recursividade Por exemplo, consideremos a definição de uma função que calcula o fatorial de um número n: Não recursiva n! = 1 para n=0; n! = 1 2 3 4 n para n >= 1; Recursiva n! = 1 para n=0; n! = n (n-1) 1 para n >= 1. 39

Recursividade 40

Recursividade Primeira chamada. 5* 41

Recursividade Segunda chamada. 4* 5* 42

Recursividade Terceira chamada. 3* 4* 5* 43

Recursividade 2* Quarta chamada. 3* 4* 5* 44

Recursividade 1 2* Quinta chamada. 3* 4* 5* 45

Recursividade 2*1 Primeiro retorno. 3* 4* 5* 46

Recursividade Segundo retorno. 3*2 4* 5* 47

Recursividade Terceiro retorno. 4*6 5* 48

Recursividade Quarto retorno. 5*24 49

Recursividade Por fim, a função retorna 120, o fatorial de 5. 50

Recursividade O projeto de uma função recursiva exige considerarmos duas partes cruciais: Condição de terminação; Operações e chamada recursiva. 51

Recursividade Funções recursivas introduzem a possibilidade de Loop Infinito É fundamental que a chamada recursiva a uma função A esteja sujeita a uma condição C, a qual se torna satisfeita em algum momento da computação. Se não existisse a condição n=0, no exemplo anterior, quando a função terminaria? Condição de terminação Permite que o procedimento deixe de ser executado O procedimento deve ter pelo menos um caso básico para cada caso recursivo, o que significa a finalização da função. 52

Recursividade 53

Recursividade Para projetar um algoritmo recursivo Defina pelo menos um caso básico (condição de terminação); Quebre o problema em problemas menores, definindo o(s) caso(s) com recursão(õ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) básico(s). Uma dica válida é o uso de variáveis globais quando possível, para evitar confusão na passagem de parâmetros. 54

Recursividade Em comparação, versões iterativas são mais rápidas, pois na versão recursiva, a troca de contextos a cada chamada acaba gastando mais tempo; Porém, existem problemas inerentemente recursivos Percurso em árvores e grafos; Algoritmos de divisão e conquista. Em suma, a maioria dos algoritmos iterativos que usam pilhas tendem a ser modelados mais facilmente em versões recursivas; Erros de implementação geralmente acarretam em estouro de pilha. 55

Perguntas? 56

Na próxima aula Divisão e Conquista. 57

FIM 58