Recorrências Recorrências e Tempo de Execução • Uma equação ou inequação que descreve uma função em termos de seu valor sobre pequenas entradas T(n) = T(n-1) + n • Recorrências aparecem quando um algoritimo contém chamadas recursivas para ele mesmo • Qual é de fato o tempo de exeução de um algoritmo? • É preciso resolver a recorrência – Encontrar um fórmula explícita de uma expressão – Limitar a recorrência por uma expressão que envolve n Exemplos de Recorrências • T(n) = T(n-1) + n Θ(n2) – Algoritmo recursivo que a cada loop examina a entrada e elimina um item • T(n) = T(n/2) + c Θ(lgn) – Algoritmo recursivo que divide a entrada em cada passo • T(n) = T(n/2) + n Θ(n) – Algoritmo recursivo que divide a entrada, mas precisa examinar cada item na entrada • T(n) = 2T(n/2) + 1 Θ(n) – Algoritmo recursivo que divide a entrada em duas metades e executa uma quantidade constante de operações Algoritmos Recursivos BINARY-SEARCH • Para um vetor ordenado A, verifique se x está no vetor A[lo…hi] Alg.: BINARY-SEARCH (A, lo, hi, x) 1 2 3 4 2 3 5 if (lo > hi) return FALSE mid (lo+hi)/2 lo if x = A[mid] return TRUE if ( x < A[mid] ) BINARY-SEARCH (A, lo, mid-1, x) if ( x > A[mid] ) BINARY-SEARCH (A, mid+1, hi, x) 7 5 6 7 8 9 10 11 12 mid hi Exemplo • A[8] = {1, 2, 3, 4, 5, 7, 9, 11} – lo = 1 hi = 8 x = 7 1 2 3 4 5 6 7 8 1 2 3 4 5 7 9 11 1 2 3 4 5 7 9 11 mid = 4, lo = 5, hi = 8 mid = 6, A[mid] = x Encontrado!!! Outro exemplo • A[8] = {1, 2, 3, 4, 5, 7, 9, 11} – lo = 1 hi = 8 x=6 1 2 3 4 5 6 7 8 1 2 3 4 5 7 9 11 mid = 4, lo = 5, hi = 8 1 2 3 4 5 7 9 11 mid = 6, A[6] = 7, lo = 5, hi = 5 1 2 3 4 5 7 9 11 mid = 5, A[5] = 5, lo = 6, hi = 5 NÃO ENCONTRADO! Análise do BINARY-SEARCH Alg.: BINARY-SEARCH (A, lo, hi, x) if (lo > hi) return FALSE mid (lo+hi)/2 if x = A[mid] return TRUE if ( x < A[mid] ) BINARY-SEARCH (A, lo, mid-1, x) if ( x > A[mid] ) BINARY-SEARCH (A, mid+1, hi, x) • T(n) = c + T(n/2) – tempo contante: c1 tempo contante: c2 tempo contante: c3 mesmo problema de tamanho n/2 mesmo problema de tamanho n/2 T(n) – tempo de execução para um vetor de tamanho n Métodos para resolver recorrências • Iteração • Substituição • Árvore de Recursão • Teorema Mestre O Método da Iteração • Converter a recorrência em um somatório e tentar limitá-lo usando uma série conhecida – Iterar a recorrência até a condição inicial ser alcançada. – Usar retro-substituição para expressar a recorrência em termos de n e a condição inicial. O Método da Iteração T(n) = c + T(n/2) T(n) = c + T(n/2) T(n/2) = c + T(n/4) = c + c + T(n/4) T(n/4) = c + T(n/8) = c + c + c + T(n/8) Assume n = 2k T(n) = c + c + … + c + T(1) k times = clgn + T(1) = Θ(lgn) Método da Iteração– Exemplo T(n) = n + 2T(n/2) Assume: n = 2k T(n/2) = n/2 + 2T(n/4) T(n) = n + 2T(n/2) = n + 2(n/2 + 2T(n/4)) = n + n + 4T(n/4) = n + n + 4(n/4 + 2T(n/8)) = n + n + n + 8T(n/8) … = in + 2iT(n/2i) = kn + 2kT(1) = nlgn + nT(1) = Θ(nlgn) O método da substituição 1. Adivinhe uma solução 2. Use indução para provar que a solução está correta Método da substituição • Adivinhe uma solução (um chute) – T(n) = O(g(n)) – Objetivo da indução: aplicar a definição de notação assintótica • – • T(n) ≤ d g(n), para algum d > 0 e n ≥ n0 Hipótese indutiva: T(k) ≤ d g(k) para todo k < n Prove a indução – Use a hipótese indutiva para encontrar alguns valores de constantes d e n0 para os quais a indução seja válida Exemplo: Binary Search T(n) = c + T(n/2) • Chute: T(n) = O(lgn) – Indução: T(n) ≤ d lgn, para algum d e n ≥ n0 – Hipótese indutiva: T(n/2) ≤ d lg(n/2) • Prova da indução: T(n) = T(n/2) + c ≤ d lg(n/2) + c = d lgn – d + c ≤ d lgn se: – d + c ≤ 0, d ≥ c • Caso base? Exemplo 2 T(n) = T(n-1) + n • • Chute: T(n) = O(n2) – Indução: T(n) ≤ c n2, para algum c e n ≥ n0 – Hipótese indutiva: T(n-1) ≤ c(n-1)2 para todo k < n Prova da indução: T(n) = T(n-1) + n ≤ c (n-1)2 + n = cn2 – (2cn – c - n) ≤ cn2 se: 2cn – c – n ≥ 0 c ≥ n/(2n-1) c ≥ 1/(2 – 1/n) – Para n ≥ 1 2 – 1/n ≥ 1 qualquer c ≥ 1 irá satisfazer Exemplo 3 T(n) = 2T(n/2) + n • • Chute: T(n) = O(nlgn) – Indução: T(n) ≤ cn lgn, para algum c e n ≥ n0 – Hipótese indutiva : T(n/2) ≤ cn/2 lg(n/2) Prova da indução: T(n) = 2T(n/2) + n ≤ 2c (n/2)lg(n/2) + n = cn lgn – cn + n ≤ cn lgn se: - cn + n ≤ 0 c ≥ 1 • Caso base? Mudança de variáveis T(n) = 2T( n ) + lgn – Fazendo: m = lgn n = 2m T (2m) = 2T(2m/2) + m – Tomando: S(m) = T(2m) S(m) = 2S(m/2) + m S(m) = O(mlgm) (como visto anteriormente) T(n) = T(2m) = S(m) = O(mlgm)=O(lgnlglgn) Idéia: transformar a recorrência em uma que seja conhecida O método da árvore de recursão Converter a recorrência em uma árvore: – Cada nó representa o custo incorrido ´nos vários níveis de recursão – Some os custos de todos os níveis Usado para “adivinhar” uma solução para a recorrência Exemplo 1 W(n) = 2W(n/2) + n2 • • • • Tamanho do subproblema no nível i é: n/2i Tamanho de subproblema alcança 1 quando 1 = n/2i i = lgn Custo de um problema no nível i = (n/2i)2 Número de nós no nível i = 2i • Custo total: lg n 1 2 lg n 1 n 1 1 1 lg n 2 2 W (n) i 2 W (1) n n n O(n) n 2 O ( n) 2 n 2 1 1 i 0 2 i 0 2 i 0 2 2 W(n) = O(n2) i i Exemplo 2 E.g.: T(n) = 3T(n/4) + cn2 • • • • • Tamanho do subproblema no nível i é: n/4i Tamanho do subproblema alcança 1quando 1 = n/4i i = log4n Custo de um nó no nível i = c(n/4i)2 Número de nós no nível i = 3i último nível tem 3log4n = nlog43 nós Custo total: log n1 i i • 1 3 2 3 2 log 3 log 3 cn 2 n log4 3 O(n 2 ) cn n 4 cn n 4 3 i 0 16 i 0 16 1 16 T(n) = O(n2) T ( n) 4 Exemplo 2 - Substituição T(n) = 3T(n/4) + cn2 • Chute: T(n) = O(n2) – Indução: T(n) ≤ dn2, para algum d e n ≥ n0 – Hipótese indutiva: T(n/4) ≤ d (n/4)2 • Prova da indução: T(n) = 3T(n/4) + cn2 ≤ 3d (n/4)2 + cn2 = (3/16) d n2 + cn2 ≤ d n2 se: d ≥ (16/13)c • Portanto: T(n) = O(n2) Exemplo 3 W(n) = W(n/3) + W(2n/3) + n • O maior caminho da raiz até uma n folha é: (2/3)n (2/3)2 n … 1 • Tamanho de subproblema alcança 1 quando 1 = (2/3)in i=log3/2n • Custo de um problema no nível i = n • Custo total: n log3 / 2 n 1 n i 0 W (n) n n ... (log3 / 2 n ) 1 i 0 log3 / 2 2 n 2(log3 / 2 n )W (1) lg n 1 n log3/ 2 n O(n) n O(n) n lg n O(n) lg 3/ 2 lg 3/ 2 W(n) = O(nlgn) Example 3 - Substitution W(n) = W(n/3) + W(2n/3) + O(n) • Chute: W(n) = O(nlgn) – Indução: W(n) ≤ d nlgn, para algum d e n ≥ n0 – Hipótese indutiva: W(k) ≤ d klgk para qualquer K < n (n/3, 2n/3) • Prova da indução: Fica como exercício! • T(n) = O(nlgn) Teorema Mestre • “Receita de bolo” para resolver recorrências da forma: n T (n) aT f (n) b onde, a ≥ 1, b > 1, e f(n) > 0 Idéia: comparar f(n) com nlogba • f(n) é assintoticamente menor ou maior do que nlogba por um fator polinomial n • f(n) é assintoticamente igual a nlogba Teorema Mestre • “Receita de bolo” para resolver recorrências da forma: n T (n) aT f (n) b onde, a ≥ 1, b > 1, e f(n) > 0 Caso 1: se f(n) = O(nlogba -) para algum > 0, então: T(n) = (nlogba) Caso 2: se f(n) = (nlogba), então: T(n) = (nlogba lgn) Caso 3: se f(n) = (nlogba +) para algum > 0, e se af(n/b) ≤ cf(n) para algum c < 1 e todo n suficientemente grande, então: T(n) = (f(n)) Condição de regularidade Exemplos T(n) = 2T(n/2) + n a = 2, b = 2, log22 = 1 Compare nlog22 com f(n) = n f(n) = (n) Caso 2 T(n) = (nlgn) Exemplos T(n) = 2T(n/2) + n2 a = 2, b = 2, log22 = 1 Compare n com f(n) = n2 f(n) = (n1+) Caso 3 verificando a condição de regularidade a f(n/b) ≤ c f(n) 2 n2/4 ≤ c n2 c = ½ é uma solução (c<1) T(n) = (n2) Exemplos (cont.) T(n) = 2T(n/2) + n a = 2, b = 2, log22 = 1 Compare n com f(n) = n1/2 f(n) = O(n1-) T(n) = (n) Caso 1 Exemplos T(n) = 3T(n/4) + nlgn a = 3, b = 4, log43 = 0.793 Compare n0.793 com f(n) = nlgn f(n) = (nlog43+) Case 3 Verificando a condição de regularidade: 3(n/4)lg(n/4) ≤ (3/4)nlgn = c f(n), c=3/4 T(n) = (nlgn) Árvore de Recursão • Considere T(n)=3T(n/4)+cn2 T(n) cn2 T(n/4) T(n/4) T(n/4) Árvore de Recursão • Considere T(n)=3T(n/4)+cn2 T(n) cn2 c(n/4)2 T(n/16) T(n/16) T(n/16) c(n/4)2 T(n/16) T(n/16) c(n/4)2 T(n/16) T(n/16) T(n/16) T(n/16) Árvore de Recursão • Considere T(n)=3T(n/4)+cn2 T(n) cn2 log4n c(n/4)2 c(n/4)2 cn2 3cn2/16 c(n/4)2 2 32cn2/16 . c(n/16)2 c(n/16)2 c(n/16)2 c(n/16)2 c(n/16)2 c(n/16)2 c(n/16)2 c(n/16)2 . . . . . . . . . . . . . . . . . . . . . . . . c(n/16)2 . log43 log43 (n T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) T(1) n . )