Hoje. mais análise de algoritmos: algoritmo de Euclides mais recursão: curvas de Hilbert

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

Mais recursão ainda AULA 4. Máximo divisor comum. Divisibilidade. Máximo divisor comum. Divisibilidade PF 2.1, 2.2, 2.3 S 5.1

Recursão. Prof. Fabrício Olivetti de França. (com inspirações do slide do prof. Rodrigo Hausen)

AULA 17. Melhores momentos. Segmento de soma máxima. Segmento de soma máxima. Conclusões. Algumas técnicas

AULA 24. Algoritmos p.856/905

Algoritmos e Estruturas de Dados

Algoritmos e Estruturas de Dados

Recursão David Déharbe

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

Programação Estruturada

Estruturas de Dados Aula 14: Recursão

Estruturas de Dados Aula 14: Recursão 19/05/2011

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

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

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

Estruturas de Repetição

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

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

AED2 - Aula 11 Problema da separação e quicksort

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

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

Complexidade de Algoritmos

ÁRVORES BALANCEADAS (AVL)

Processamento da Informação

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Recursividade

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

Algoritmos e Estruturas de Dados I Linguagem C

Aula 21 - Algoritmos e Funções Recursivas

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

Recursividade. Prof. Jesus José de Oliveira Neto

AED2 - Aulas 06 e 07 Árvores AVL e rubro-negras

if not(isinstance(a, int)) or a < 0: raise ValueError ( misterio: arg devia ser inteiro nao negativo ) else: return misterio_aux(a, a + 1)

Análise e Complexidade de Algoritmos

Análise de Algoritmos Parte 4

LISTA DE EXERCÍCIOS MÊS 04

Solução de Recorrências

Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio

Análise e Complexidade de Algoritmos

Algoritmos e Estruturas de Dados I

controle de fluxo repetições iterativas

Universidade Estadual de Santa Cruz

Árvores Binárias de Busca

Lista 2 - PMR2300/3200

Bucketsort. CLRS sec 8.4. Algoritmos p. 1

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

Roteiro Prático Nº 13 Recursividade

Módulo Tópicos Adicionais. Recorrências

Algoritmos de Busca em Tabelas

Aula 18 Algoritmos básicos de busca e classificação

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof Márcio Bueno. / Material da Prof a Ana Eliza

Algoritmos e Estruturas de Dados LEE 2013/2014. popular devido à facilidade de implementação e eficiência

Melhores momentos AULA 1. Algoritmos p.38/86

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

Recursividade. Objetivos do módulo. O que é recursividade

Aula 10 Algoritmos e Funções Recursivas

Resposta pergunta 1: i n t dectobin ( i n t n ) { i n t mdc( i n t x, i n t y ) ; void testpalindromo ( ) ; i n t main ( ) { testmult ( ) ;

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

ANÁLISE DE ALGORITMOS

Capítulo 6 Análise de Algoritmos Capítulo 6

Estrutura de Dados Conceitos Iniciais

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

CORREÇÃO DE ALGORITMOS E

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

Árvores AVL. Nesta aula será apresentado o ADT árvore AVL que são árvores binárias de altura equilibrada. Algoritmos e Estruturas de Dados I

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

Árvores Binárias de Busca

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

Recursividade. Recursividade

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

Técnicas de análise de algoritmos

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.

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

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Introdução a AVL: teoria e prática. 22/11, 25/11 e 30/11

Análise de Complexidade de Algoritmos

AULA 19 AULA 20. Ordenação: algoritmo Quicksort. Resumo. Melhores momentos

Árvores. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Algoritmos e Estruturas de Dados. Décima sexta aula: Quicksort

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof a Karina Oliveira. Fonte: Prof a Ana Eliza

Algoritmos e Funções Recursivas

Aula prática 5. Funções Recursivas

Introdução à Análise de Algoritmos

LISTA DE EXERCÍCIOS. Humberto José Bortolossi

Análise de Complexidade para algoritmos iterativos e recursivos

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

AULA 15. Algoritmos p.600/637

Programação I Aula 16 Mais exemplos de recursão Pedro Vasconcelos DCC/FCUP

Princípios de Desenvolvimento de Algoritmos MAC122

7 a Lista de Exercícios Assunto: Funções e passagem por referência com vetor e matriz (Tópico 7)

Aula T13 BCC202 Árvores. Túlio Toffolo

LISTAS - ARMAZENAMENTO NÃO SEQUENCIAL COM MEMÓRIA DINÂMICA

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

MC102 Algoritmos e Programação de Computadores

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

Linguagem de Programação. Thiago Leite Francisco Barretto

Lista de Exercícios de Algoritmos e Estruturas de Dados

SCC Capítulo 2 Recursão

Árvores & Árvores Binárias

Transcrição:

AULA 4

Hoje mais análise de algoritmos: algoritmo de Euclides mais recursão: curvas de Hilbert

Algoritmo de Euclides Fonte: http://math.stackexchange.com/ PF 2 (Exercícios) S 5.1 http://www.ime.usp.br/ pf/algoritmos/aulas/recu.html http://www.ime.usp.br/ coelho/mac0122-2014/aulas/mdc/

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: mdc(m, 0) = m; mdc(m, n) = mdc(n, m%n), para n > 0. Assim, por exemplo, mdc(12, 18) = mdc(18, 12) = mdc(12, 6) = mdc(6, 0) = 6.

Correção 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.

Euclides recursivo 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? meu_prompt>time./mdc 317811 514229 mdc(317811,514229)=1 real 0m0.004s user 0m0.004s sys 0m0.000s meu_prompt>time./euclidesr 317811 514229 mdc(317811,514229)=1 real 0m0.002s user 0m0.000s sys 0m0.000s

Qual é mais eciente? meu_prompt>time./mdc 2147483647 2147483646 mdc(2147483647,2147483646)=1 real 0m1.692s user 0m1.684s sys 0m0.000s meu_prompt>time./euclidesr 2147483647 2147483646 mdc(2147483647,2147483646)=1 real 0m0.002s user 0m0.000s sys 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), os valores dos parâmetros no início de cada uma das chamadas da função.

Número de chamadas recursivas 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).

Número de chamadas recursivas 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!).

Número de chamadas recursivas 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.

Número de chamadas recursivas 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.

Número de chamadas recursivas 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 Suponha que m > n. O número de chamadas recursivas da função euclidesr é 2(lg n) 1. No pior caso, o consumo de tempo da função euclidesr é proporcional a lg n.

Conclusões Suponha que m > n. O consumo de tempo da função euclidesr é O(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 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).

http://en.wikipedia.org/wiki/hilbert_curve Curvas de Hilbert Fonte: http://momath.org/home/math-monday-03-22-10 Niklaus Wirth, Algorithms and Data Structures Prentice Hall, 1986.

Curvas de Hilbert 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.

H1

H2

H3

H4

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

H2

H3

H4

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,,,.

A1 e A2

B2 e B3

C2 e C3

D4

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; void linha(int *x, int *y,direcao direcao, int comprimento) { switch (direcao) { case DIREITA : *x = *x + comprimento; break; case ESQUERDA : *x = *x - comprimento; break; case CIMA : *y = *y + comprimento; break; case BAIXO : *y = *y - comprimento; break; } desenhelinha(*x, *y); }

A k void a(int k, int *x, int *y, int comprimento) { if (k > 0) { d(k-1, x, y, comprimento); linha(x, y, ESQUERDA, comprimento); a(k-1, x, y, comprimento); linha(x, y, BAIXO, comprimento); a(k-1, x, y, comprimento); linha(x, y, DIREITA, comprimento); b(k-1, x, y, comprimento); } }

B k void b(int k, int *x, int *y, int comprimento) { if (k > 0) { c(k-1, x, y, comprimento); linha(x, y, CIMA, comprimento); b(k-1, x, y, comprimento); linha(x, y, DIREITA, comprimento); b(k-1, x, y, comprimento); linha(x, y, BAIXO, comprimento); a(k-1, x, y, comprimento); } }

C k void c(int k, int *x, int *y, int comprimento) { if (k > 0) { b(k-1, x, y, comprimento); linha(x, y, DIREITA, comprimento); c(k-1, x, y, comprimento); linha(x, y, CIMA, comprimento); c(k-1, x, y, comprimento); linha(x, y, ESQUERDA, comprimento); d(k-1, x, y, comprimento); } }

D k void d(int k, int *x, int *y, int comprimento) { if (k > 0) { a(k-1, x, y, comprimento); linha(x, y, BAIXO, comprimento); d(k-1, x, y, comprimento); linha(x, y, ESQUERDA, comprimento); d(k-1, x, y, comprimento); linha(x, y, CIMA, comprimento); c(k-1, x, y, comprimento); } }