270 likes | 396 Views
Análise de algoritmos. RECURSIVIDADE UNISUL Ciência da Computação Prof. Maria Inés Castiñeira, Dra. Recursividade. um procedimento recursivo é aquele que contém uma ou mais chamadas a si mesmo a todo procedimento recursivo corresponde um não recursivo
E N D
Análise de algoritmos • RECURSIVIDADE • UNISUL • Ciência da Computação • Prof. Maria Inés Castiñeira, Dra.
Recursividade • um procedimento recursivo é aquele que contém uma ou mais chamadas a si mesmo • a todo procedimento recursivo corresponde um não recursivo • os programas recursivos são mais concisos • aparente relação direta com a prova por indução matemática
Recursividade • Cálculo de fatorial x! = se x <=0 1 senão x * (x-1)! • Implementação não recursiva int fatorial (int N) { int result = 1; for (i=1; i<=N; i++) result = result * i; return (result); }
Recursividade • Implementação recursiva int fatorial (int N) { if (N<= 1) return(1); else return( N * fatorial(N-1)); }
Recursividade • X= fatorial (4) • return( 4* fatorial(3) ) • return( 3* fatorial(2) ) • return( 2* fatorial(1) ) • return( 1 )
Análise de Recursividade • relação de recorrência – a função é definida em termos dela própria, recursivamente • substituição repetida • int fatorial (int N) • { • if (N<= 1) • return(1); • else • return( N * fatorial(N-1)); • }
Análise de Recursividade T(n) • tempo de processar o algoritmo para entrada n em função do número de passos ou operações dominantes Fatorial T(n) = 1, se n = 0 = T(n-1) +1, se n > 0 mas quanto é T(n-1)?
T(n) - Fatorial = (T(n-1)) + 1 = (T(n-2) + 1) + 1 = T(n-2) + 2 = (T(n-3) + 1) + 2 = T(n-3) + 3 ..... • forma geral, T(n) = T(n-k) + k, 1 k n • fazendo n = k, reduzimos a T(n) = n
A notação • Para procedimentos recursivos pode-se aplicar a seguinte técnica • determina-se o número total de chamadas ao procedimento recursivo • calcula-se a complexidade de execução de uma única chamada • complexidade número de chamadas complexidade de uma chamada
T(n) - Fatorial = (T(n-1)) + 1 = (T(n-2) + 1) + 1 = T(n-2) + 2 = (T(n-3) + 1) + 2 = T(n-3) + 3 ..... forma geral, T(n) = T(n-k) + k, 1 k n fazendo n = k, reduzimos a T(n) = n Fatorial = O(n) 10
Relação de recorrência Como proceder para derivar uma relação de recorrência para a análise do tempo de execução de um algoritmo: • Determinar qual o tamanho n do problema. • Verificar que valor de n é usado como base da recursão. Em geral é um valor único (n=1, por exemplo), mas pode ser valores múltiplos. Vamos considerar esse valor como n0. • Determinar T(n0). Pode-se usar uma constante c, mas, em muitos, casos um número específico é necessário 11
Relação de recorrência • T(n) é definido como uma soma de várias ocorrências de T(m) (chamadas recursivas), mais a soma de outras instruções efetuadas. Em geral, as chamadas recursivas estão relacionadas com subproblemas do mesmo tamanho f(n), definindo um termo a.T(f(n)) na relação de recorrência. • A relação de recorrência é definida por: – T(n) = c, se n = n0 – T(n) = a.T(f(n)) + g(n), caso contrário. 12
Derivando relação de recorrência MergeSort(A, n) if n ≤ 1 return A return merge(MergeSort(A1, n/2), MergeSort(A2, n/2)) Relação de Recorrência do MergeSort T(1) = c T(n) = 2.T(n/2) + d.n 13
Resolvendo relação de recorrência • Resolver uma relação de recorrência nem sempre é fácil. • Resolvendo uma relação de recorrência, determina-se o tempo de execução do algoritmo recursivo correspondente. • Relação de recorrência: T(n) = T(n1) + T(n2) +...+ T(na) + f(n) • É mais fácil quando temos a subproblemas de mesmo tamanho que é uma fração de n (por exemplo, n/b): – T(n) = a.T(n/b) + f(n) • Como resolver: – Método do desdobramento – Método master 14
Resolvendo a relação de recorrência: Desdobramento Método do desdobramento Consiste em: – Usar (algumas poucas) substituições repetidamente até encontrar um padrão. – Escrever uma fórmula em termos de n e o número de substituições i. – Escolher i de tal forma que todas as referências a T() sejam referências ao caso base. – Resolver a fórmula. 15
Resolvendo a relação de recorrência: Desdobramento Exemplo: divisão da pizza 16
Divisão da pizza Corte – Fatia 1 – 2 2 – 4 3 – 7 4 – 11 5 – 16 6 – 22 7 – 29 ....... O n-ésimo cortecria n novos pedaços. Logo o número total de pedaços obtidos com n cortes é chamado P(n): P(1) = 2 P(n) = P(n-1) + n, para n>=2 18
Divisão da pizza • Solução para o problema da pizza: – T(1) = 2 – T(n) = T(n – 1) + n , para n≥2 • Desdobrando a relação de recorrência: T(n) = T(n-1) + n T(n) = T(n-2) + (n-1) + n T(n) = T(n-3) + (n-2) + (n-1) + n ... T(n) = T(n-i) + (n-i+1) + ... + (n-1) + n 19
Divisão da pizza – T(1) = 2 – T(n) = T(n – 1) + n , para n≥2 T(n) = T(n-i) + (n-i+1) + ... + (n-1) + n • Caso base (T(1)) alcançado quando n-i=1, logo i=n-1 • T(n) = 2 + 2 + 3 + ... + (n – 1) + n • T(n) = 2 + 2 + 3 + ... + (n – 1) + n • T(n) = 1+1 + 2 + 3 + ... + (n – 1) + n • T(n) = 1+1 + 2 + 3 + ... + (n – 1) + n • T(n) = 1+ Somatória (em i de1até n) • T(n) = 1 + n.(n+1)/2 • Logo, T(n) = O(n^2) 20
Resolvendo relação de recorrência • Resolvendo uma relação de recorrência, determina-se o tempo de execução do algoritmo recursivo correspondente. • Como resolver: 1- Método do desdobramento (pizza) 2- Método master 21
Método MASTER: relação de recorrência •Teorema que resolve quase todas as recorrências. • T(n) da forma a.T(n/b) + f(n), a,b > 1 • Casos: 1. Se f(n) ∈ O(n^log ba - ε), para algum ε > 0, temos que: • T(n) ∈ Θ(n^log ba). 2. Se f(n) ∈ O(n^log b a), temos que: • T(n) ∈ Θ(n^log b a. log n). 3. Se f(n) ∈ O(n^log b a + ε), para algum ε > 0 e se a.f(n/b)≤c.f(n) para algum c > 0 e n suficientemente grande, temos que: • T(n) ∈ Θ(f(n)). 22
Exemplo: mergesort MergeSort(A, n) if n ≤ 1 return A return merge(MergeSort(A1, n/2), MergeSort(A2, n/2)) Relação de Recorrência do MergeSort T(1) = c T(n) = 2.T(n/2) + d.n 23
Método MASTER: exemplo mergesort • T(n) da forma a.T(n/b) + f(n), a,b > 1 • MergeSort: – T(n) = 2.T(n/2) + n – a = b = 2 – f(n) = n • log b a = 1. Cai no caso 2. • Logo, T(n) = Θ(n.log n) 24
Método MASTER: exemplo 2 • T(n) da forma a.T(n/b) + f(n), a,b > 1 • Problema com Relação: T(n) = 9.T(n/3) + n – a = 9, b = 3 – f(n) = n • log b a = 2. Se ε = 1, Cai no caso 1. • Logo, T(n) = Θ(n^2). 25
Bibliografia • Cormen, Leiserson e Rivest, ALGORITMOS: teoria e prática. Rio de Janeiro: Campus, 2002. • FIGUEREDO, Jorge. Material didático de Técnicas e análise de algoritmos. UFCG. Disponível em www.dsc.ufcg.edu.br/~abrantes/