AULA 4. Algoritmo de Euclides. Hoje. Algoritmo de Euclides. Correção. Euclides recursivo

Documentos relacionados
AULA 24. Algoritmos p.856/905

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

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

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

Recursividade. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Algoritmos e Estruturas de Dados I

MC102 Algoritmos e Programação de Computadores

LISTA DE EXERCÍCIOS MÊS 04

Análise de Algoritmos Parte 4

Introdução à Teoria dos Números - Notas 4 Máximo Divisor Comum e Algoritmo de Euclides

Árvores. ! utilizada em muitas aplicações. ! modela uma hierarquia entre elementos. ! O conceito de árvores está diretamente ligado à recursão

Roteiro Prático Nº 13 Recursividade

Aula prática 5. Funções Recursivas

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

Definição. Diremos que um número inteiro d é um divisor de outro inteiro a, se a é múltiplo de d; ou seja, se a = d c, para algum inteiro c.

PCC104 - Projeto e Análise de Algoritmos

1.3 Isomorfismo 12 CAP. 1 CONCEITOS BÁSICOS

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Aula 10 Algoritmos e Funções Recursivas

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

Pensamento Recursivo. O Objeto Carro. O Objeto Carro. O Objeto Carro. O Objeto Carro. O Objeto Carro

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Eduardo Camponogara. DAS-9003: Introdução a Algoritmos

Recursividade. Recursividade

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

ANÁLISE DE ALGORITMOS

Relações de recorrência

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

I. Correção de Algoritmos Não-Recursivos

INF1005: Programação 1. Repetições. 08/03/10 (c) Paula Rodrigues 1

Reconhecimento de Padrões. Prof. Flávio Humberto Cabral Nunes

03 Análise de Algoritmos (parte 3) SCC201/501 - Introdução à Ciência de Computação II

Lista de Exercícios 6 Funções

Introdução à Análise de Algoritmos

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Algoritmos de Busca em Tabelas

Complexidade de Algoritmos

TEOREMA FUNDAMENTAL DA ARITMÉTICA: APLICAÇÕES

Material Teórico - Módulo Números Naturais: Contagem, Divisibilidade e o Teorema da Divisão Euclidiana

Algoritmos e Programação. AULA 21: Recursividade UNIVERSIDADE FEDERAL DE PELOTAS CENTRO DE DESENVOLVIMENTO TECNOLÓGICO CIÊNCIA DA COMPUTAÇÃO

XXXV Olimpíada Cearense de Matemática Nível 3 - Ensino Médio

Multiplicação de inteiros

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Complexidade de algoritmos Notação Big-O

Módulo de Equações do Segundo Grau. Relações entre coeficientes e raízes. Nono Ano

Informática I. Aula 19. Aula 19-31/10/2007 1

Lista de Exercícios sobre Recursividade

Expressão algébrica de padrões gerais

Recursividade UFOP 1/48

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Processamento da Informação Teoria. Recursividade

Complexidade de Algoritmos

XXXIV OLIMPÍADA BRASILEIRA DE MATEMÁTICA PRIMEIRA FASE NÍVEL 2 (8º. e 9º. anos) GABARITO

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Teoria da Computação. Aula 4 Técnicas de Análise 5COP096. Aula 4 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Aula 7 - Mais problemas com inteiros

Números Inteiros Algoritmo da Divisão e suas Aplicações

Árvore Binária de Busca Ótima

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

Projeto e Análise de Algoritmos

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

Algoritmos e Funções Recursivas

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

5 Congruências lineares. Programa. 1 Parte 1 - Conjuntos e Aplicações. 1 Conjuntos. 4 Indução matemática e divisibilidade

Elementos de Matemática Finita

ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

9.2 Relação de Ordem em Q

Estruturas de Dados 2

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

MA14 - Aritmética Lista 1. Unidades 1 e 2

a) Defina uma função para obter o máximo entre dois números

Capítulo 14. Ordenação e pesquisa. Bubblesort. Alguns algoritmos de ordenação e pesquisa Medição do tempo de execução de um programa

Análise de Algoritmos

Introdução à Programação Aula 16 Mais exemplos de recursão

Programação Funcional Aulas 5 & 6

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

Para simplificar a notação, também usamos denotar uma sequência usando apenas a imagem de :

ANÁLISE DE ALGORITMOS: PARTE 3

a complexidade no desempenho de algoritmos

Matemática Básica Relações / Funções

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

Lista de Exercícios 6: Soluções Funções

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

Recursividade e relações de recorrência

Congruências I. Por exemplo, 7 2 (mod 5), 9 3 (mod 6), 37 7 (mod 10) mas 5 3 (mod 4). Veja que a b (mod m) se, e somente se, m a b.

CURSO E COLÉGIO OBJETIVO TREINO PARA PROVA DE FÍSICA PROF. Peixinho 1 o Ano E.M. 2 o Bimestre-2010

MATEMÁTICA. O aluno achou interessante e continuou a escrever, até a décima linha. Somando os números dessa linha, ele encontrou:

Errata da lista 1: Na página 4 (respostas), a resposta da letra e da questão 13 é {2, 3, 5, 7, 11, 13, 17} (faltou o número 17)

BC1424 Algoritmos e Estruturas de Dados I Aula 03: Recursão / Recursividade

(a) Indique, em português, o que realiza a seguinte função. [4 pontos]

CEDERJ - CENTRO DE EDUCAÇÃO SUPERIOR A DISTÂNCIA DO ESTADO DO RIO DE JANEIRO

4º 20/10/2003. ÍNDICE

Exemplos: Os números 12, 18 e 30 têm conjuntos de divisores respectivamente iguais a:

double x; x = enigmab1(100);

05 Análise de Algoritmos (parte 4) SCC201/501 - Introdução à Ciência de Computação II

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Transcrição:

Hoje AULA 4 mais análise de algoritmos: algoritmo de Euclides mais recursão: curvas de Hilbert Algoritmo de Euclides Algoritmo de Euclides O máximo divisor comum pode ser determinado através de um algoritmo de 2300 anos (cerca de 300 A.C.), o algoritmo de Euclides. Para calcular o mdc(m, n) o algoritmo de Euclides usa a recorrência: Fonte: http://math.stackexchange.com/ mdc(m, 0) = m; mdc(m, n) = mdc(n, m%n), para n > 0. PF 2 (Exercícios) S 5.1 Assim, por exemplo, http://www.ime.usp.br/ pf/algoritmos/aulas/recu.html http://www.ime.usp.br/ coelho/mac0122-2014/aulas/mdc/ mdc(12, 18) = mdc(18, 12) = mdc(12, 6) = mdc(6, 0) = 6. Correção Euclides recursivo A correção da recorrência proposta por Euclides é baseada no seguinte fato. Se m, n e d são números inteiros, m 0, n, d > 0, então d divide m e n d divide n e m%n. int euclidesr(int m, int n) if (n == 0) return m; return euclidesr(n, m % n);

Euclides iterativo /* Pre-condicao: a funcao supoe n > 0 */ int euclidesi(int m, int n) int r; do r = m % n; m = n; n = r; while (r!= 0); return m; euclidesr(317811,514229) euclidesr(317811,514229) euclidesr(514229,317811) euclidesr(317811,196418) euclidesr(196418,121393) euclidesr(121393,75025) euclidesr(75025,46368) euclidesr(46368,28657) euclidesr(28657,17711) euclidesr(17711,10946) euclidesr(10946,6765) euclidesr(6765,4181) euclidesr(4181,2584) euclidesr(2584,1597) euclidesr(1597,987) euclidesr(987,610) euclidesr(610,377) euclidesr(377,233) euclidesr(233,144) euclidesr(144,89) euclidesr(89,55) euclidesr(55,34) euclidesr(34,21) euclidesr(21,13) euclidesr(13,8) euclidesr(8,5) euclidesr(5,3) euclidesr(3,2) euclidesr(2,1) euclidesr(1,0) mdc(317811,514229) = 1. Qual é mais eciente? Qual é mais eciente? meu_prompt>time./mdc 317811 514229 mdc(317811,514229)=1 real 0m0.004s user 0m0.004s meu_prompt>time./euclidesr 317811 514229 mdc(317811,514229)=1 real 0m0.002s user 0m0.000s meu_prompt>time./mdc 2147483647 2147483646 mdc(2147483647,2147483646)=1 real 0m1.692s user 0m1.684s meu_prompt>time./euclidesr 2147483647 2147483646 mdc(2147483647,2147483646)=1 real 0m0.002s user 0m0.000s Consumo de tempo O consumo de tempo da função euclidesr é proporcional ao número de chamadas recursivas. Suponha que euclidesr faz k chamadas recursivas e que no início da 1a. chamada ao algoritmo tem-se que 0 < n m. Sejam (m, n) = (m 0, n 0 ), (m 1, n 1 ),..., (m k, n k ) = (mdc(m, n), 0), Por exemplo, para m = 514229 e n = 317811 tem-se (m 0, n 0 ) = (514229, 317811), (m 1, n 1 ) = (317811, 196418), (m 2, n 2 ) = (196418, 121393),... =... (m 27, n 27 ) = (1, 0). os valores dos parâmetros no início de cada uma das chamadas da função.

Estimaremos o valor de k em função de n = min(m, n). Note que m i+1 = n i e n i+1 = m i %n i para i=1,2,...,k. Note ainda que para inteiros a e b, 0 < b a vale que a%b < a 2 (verique!). Desta forma tem-se que n 2 = m 1 %n 1 = n 0 %n 1 < n 0 /2 = n/2 = n/2 1 n 4 = m 3 %n 3 = n 2 %n 3 < n 2 /2 < n/4 = n/2 2 n 6 = m 5 %n 5 = n 4 %n 5 < n 4 /2 < n/8 = n/2 3 n 8 = m 7 %n 7 = n 6 %n 7 < n 6 /2 < n/16 = n/2 4 n 10 = m 9 %n 9 = n 8 %n 9 < n 8 /2 < n/32 = n/2 5 Percebe-se que depois de cada 2 chamadas recursivas o valor do segundo parâmetro é reduzido a menos da sua metade. Seja t o número inteiro tal que 2 t n < 2 t+1 Da primeira desigualdade temos que t lg n, onde lg n denota o logaritmo de n na base 2. Da desigualde estrita, concluímos que k 2(t + 1) 1 = 2t + 1 Logo, o número k de chamadas recursivas é não superior a 2t + 1 2 lg n + 1. Para o exemplo acima, onde m=514229 e n=317811, temos que 2 lg n + 1 = 2 lg(317811) + 1 < 2 18,3 + 1 < 37,56 e o número de chamadas recursivas feitas por euclidesr(514229,317811) foram 27. Consumo de tempo Resumindo, a quantidade de tempo consumida pelo algoritmo de Euclides é, no pior caso, proporcional a lg n. Este desempenho é signicativamente melhor que o desempenho do algoritmo café com leite, já que a função f(n) = lg n cresce muito mais lentamente que a função g(n) = n. Consumo de tempo n (int) lg n 4 2 5 2 6 2 10 3 64 6 100 6 128 7 1000 9 1024 10 1000000 19 1000000000 29

Conclusões Conclusões Suponha que m > n. Suponha que m > n. O número de chamadas recursivas da função euclidesr é 2(lg n) 1. O consumo de tempo da função euclidesr é O(lg n). No pior caso, o consumo de tempo da função euclidesr é proporcional a lg n. Para que o consumo de tempo da função euclidesr dobre é necessário que o valor de n seja elevado ao quadrado. Euclides e Fibonacci Curvas de Hilbert Demonstre por indução em k que: Se m > n 0 e se a chamada euclidesr(m,n) faz k 1 chamadas recursivas, então m fibonacci(k + 2) e n fibonacci(k + 1). Fonte: http://momath.org/home/math-monday-03-22-10 Niklaus Wirth, Algorithms and Data Structures Prentice Hall, 1986. http://en.wikipedia.org/wiki/hilbert_curve Curvas de Hilbert H 1 As curvas a seguir seguem um certo padrão regular e podem ser desenhadas na tela sobre o controle de um programa. O objetivo é descobrir o esquema de recursão para construir tais curvas. Estes padrões serão chamados de H 0, H 1, H 2.... Cada H i denomina a curva de Hilbert de ordem i, em homenagem a seu inventor, o matemático David Hilbert.

H 2 H 3 H 4 Padrão As guras mostram que H i+1 é obtida pela composição de 4 instâncias de H i de metade do tamanho e com a rotação apropriada, ligadas entre si por meio de 3 linhas de conexão. Por exemplo: H 1 é formada por 4 H 0 (vazio) conectados por 3 linhas. H 2 é formada por 4 H 1 conectados por 3 linhas H 3 é formada por 4 H 2 conectados por 3 linhas H 2 H 3

H 4 Partes da curva Para ilustrar, denotaremos as quatro possíveis instâncias por A, B, C e D: A será o padrão que tem a abertura para direita; B será o padrão que tem a abertura para baixo; C será o padrão que tem a abertura para esquerda; e D será o padrão que tem a abertura para cima. Representaremos a chamada da função que desenha as interconexões por meio da setas,,,. A 1 e A 2 B 2 e B 3 C 2 e C 3 D 4

Esquema recursivo Assim, surge o seguinte esquema recursivo: A k : D k 1 A k 1 A k 1 B k 1 B k : C k 1 B k 1 B k 1 C k 1 C k : B k 1 C k 1 C k 1 D k 1 D k : A k 1 D k 1 D k 1 C k 1 Para desenhar os segmentos utilizaremos a chamada de uma função linha(x,y,direcao,comprimento) que move um pincel da posição (x,y) em uma dada direcao por um certo comprimento. typedef enum DIREITA, ESQUERDA, CIMA, BAIXO Direcao; linha(int *x, int *y,direcao direcao, int comprimento) switch (direcao) case DIREITA : *x = *x + comprimento; case ESQUERDA : *x = *x - comprimento; case CIMA : *y = *y + comprimento; case BAIXO : *y = *y - comprimento; desenhelinha(*x, *y); A k a(int k, int *x, int *y, int comprimento) if (k > 0) linha(x, y, ESQUERDA, comprimento); linha(x, y, BAIXO, comprimento); linha(x, y, DIREITA, comprimento); B k b(int k, int *x, int *y, int comprimento) if (k > 0) linha(x, y, CIMA, comprimento); linha(x, y, DIREITA, comprimento); linha(x, y, BAIXO, comprimento); C k c(int k, int *x, int *y, int comprimento) if (k > 0) linha(x, y, DIREITA, comprimento); linha(x, y, CIMA, comprimento); linha(x, y, ESQUERDA, comprimento); D k d(int k, int *x, int *y, int comprimento) if (k > 0) linha(x, y, BAIXO, comprimento); linha(x, y, ESQUERDA, comprimento); linha(x, y, CIMA, comprimento);