Академический Документы
Профессиональный Документы
Культура Документы
21 de março de 2019
1 / 27
Sequência
2 / 27
Recursão
3 / 27
Definição recursiva
4 / 27
Definição recursiva
T (1) = 3 e
T (n) = T (n − 1) + 4 para n ≥ 2.
4 / 27
Definição recursiva
T (1) = 3 e
T (n) = T (n − 1) + 4 para n ≥ 2.
4 / 27
Definição recursiva
T (1) = 3 e
T (n) = T (n − 1) + 4 para n ≥ 2.
T (1) = 5 e
T (n) = 2T (n − 1) para 2 ≤ n ≤ 6.
4 / 27
Definição recursiva
5 / 27
Definição recursiva
5 / 27
Definição recursiva
T (0) = 0, T (1) = 3 e
T (n) = 2T (n − 1) − T (n − 2), para n ≥ 2.
5 / 27
Definição recursiva
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
T (n + 1) = 2T (n + 1 − 1) − T (n + 1 − 2)
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
T (n + 1) = 2T (n + 1 − 1) − T (n + 1 − 2)
T (n + 1) = 2T (n) − T (n − 1)
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
T (n + 1) = 2T (n + 1 − 1) − T (n + 1 − 2)
T (n + 1) = 2T (n) − T (n − 1)
T (n + 1) = 2(3n) − 3(n − 1)
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
T (n + 1) = 2T (n + 1 − 1) − T (n + 1 − 2)
T (n + 1) = 2T (n) − T (n − 1)
T (n + 1) = 2(3n) − 3(n − 1)
T (n + 1) = 3n + 3
6 / 27
Definição recursiva
T (0) = 3 ∗ 0 = 0 OK!
T (1) = 3 ∗ 1 = 3 OK!
T (n + 1) = 2T (n + 1 − 1) − T (n + 1 − 2)
T (n + 1) = 2T (n) − T (n − 1)
T (n + 1) = 2(3n) − 3(n − 1)
T (n + 1) = 3n + 3
T (n + 1) = 3(n + 1) c.q.d
6 / 27
Resolvendo relações de recorrência
7 / 27
Resolvendo relações de recorrência
8 / 27
Resolvendo relações de recorrência
Expandir:
k = 1: T (n) = 2T (n − 1)
8 / 27
Resolvendo relações de recorrência
Expandir:
k = 1: T (n) = 2T (n − 1)
k = 2: T (n) = 2[2T (n − 2)] = 4T (n − 2)
8 / 27
Resolvendo relações de recorrência
Expandir:
k = 1: T (n) = 2T (n − 1)
k = 2: T (n) = 2[2T (n − 2)] = 4T (n − 2)
k = 3: T (n) = 4[2T (n − 3)] = 8T (n − 3)
8 / 27
Resolvendo relações de recorrência
Expandir:
k = 1: T (n) = 2T (n − 1)
k = 2: T (n) = 2[2T (n − 2)] = 4T (n − 2)
k = 3: T (n) = 4[2T (n − 3)] = 8T (n − 3)
Logo, T (n) = 2n .
8 / 27
Resolvendo relações de recorrência
Expandir:
k = 1: T (n) = 2T (n − 1)
k = 2: T (n) = 2[2T (n − 2)] = 4T (n − 2)
k = 3: T (n) = 4[2T (n − 3)] = 8T (n − 3)
Logo, T (n) = 2n .
9 / 27
Resolvendo relações de recorrência
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
T (n + 1) = 2T (n + 1 − 1)
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
T (n + 1) = 2T (n + 1 − 1)
T (n + 1) = 2T (n)
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
T (n + 1) = 2T (n + 1 − 1)
T (n + 1) = 2T (n)
T (n + 1) = 2(2n )
9 / 27
Resolvendo relações de recorrência
T (1) = 21 = 2 OK!
T (n + 1) = 2T (n + 1 − 1)
T (n + 1) = 2T (n)
T (n + 1) = 2(2n )
T (n + 1) = 2n+1 c.q.d
9 / 27
Exemplo
n−1
P n(n+1)
(n − i) = 2 .
i=0
n−1
P n(n−1)
(n − i) = 2 .
i=1
10 / 27
Exemplo
Passo base: T (1) = 0
Expandir:
k = 1: T (n) = T (n − 1) + n − 1
11 / 27
Exemplo
Passo base: T (1) = 0
Expandir:
k = 1: T (n) = T (n − 1) + n − 1
k = 2: T (n) = [T (n − 2) + n − 1 − 1] + n − 1 = T (n − 2) + n − 2 + n − 1
11 / 27
Exemplo
Passo base: T (1) = 0
Expandir:
k = 1: T (n) = T (n − 1) + n − 1
k = 2: T (n) = [T (n − 2) + n − 1 − 1] + n − 1 = T (n − 2) + n − 2 + n − 1
k = 3:
T (n) = [T (n−3)+n−2−1]+n−2+n−1 = T (n−3)+n−3+n−2+n−1
11 / 27
Exemplo
Passo base: T (1) = 0
Expandir:
k = 1: T (n) = T (n − 1) + n − 1
k = 2: T (n) = [T (n − 2) + n − 1 − 1] + n − 1 = T (n − 2) + n − 2 + n − 1
k = 3:
T (n) = [T (n−3)+n−2−1]+n−2+n−1 = T (n−3)+n−3+n−2+n−1
12 / 27
Exemplo
T (0) = 100 e
T (n) = 1, 03 · T (n − 1) para n ≥ 1.
12 / 27
Exemplo
Expandir:
k = 1: T (n) = 1, 03T (n − 1)
13 / 27
Exemplo
Expandir:
k = 1: T (n) = 1, 03T (n − 1)
k = 2: T (n) = 1, 03[1, 03T (n − 2)] = (1, 03)2 T (n − 2)
13 / 27
Exemplo
Expandir:
k = 1: T (n) = 1, 03T (n − 1)
k = 2: T (n) = 1, 03[1, 03T (n − 2)] = (1, 03)2 T (n − 2)
k = 3: T (n) = (1, 03)2 [1, 03T (n − 3)] = (1, 03)3 T (n − 3)
13 / 27
Exemplo
Expandir:
k = 1: T (n) = 1, 03T (n − 1)
k = 2: T (n) = 1, 03[1, 03T (n − 2)] = (1, 03)2 T (n − 2)
k = 3: T (n) = (1, 03)2 [1, 03T (n − 3)] = (1, 03)3 T (n − 3)
13 / 27
Exemplo
Expandir:
k = 1: T (n) = 1, 03T (n − 1)
k = 2: T (n) = 1, 03[1, 03T (n − 2)] = (1, 03)2 T (n − 2)
k = 3: T (n) = (1, 03)2 [1, 03T (n − 3)] = (1, 03)3 T (n − 3)
13 / 27
Exercı́cios
a) 1, 3, 5, 7, 9, ...
b) 1, 4, 9, 16, 25, ...
c) 1, 3, 7, 15, 31, 63.
14 / 27
Respostas
n(n+1)
Exercı́cio 3: A fórmula fechada é T (n) = 1 + 2 .
Exercı́cio 4:
15 / 27
Algoritmos recursivos
16 / 27
Algoritmos recursivos
17 / 27
Algoritmos recursivos
Exemplo 1: O algoritmo abaixo calcula o fatorial de um
número inteiro não-negativo n recursivamente.
Fatorial(n)
1. se (n = 0) retorne (1)
2. sen~
ao
3. temp = Fatorial(n - 1)
4. valor = n * temp
5. retorne (valor)
18 / 27
Algoritmos recursivos
Fatorial(n)
1. se (n = 0) retorne (1)
2. sen~
ao retorne (n * Fatorial(n - 1))
T (0) = Θ(1) e
T (n) = T (n − 1) + Θ(1) para n > 0.
19 / 27
Algoritmos recursivos
T (n) = T (n − 1) + 1
T (n) = [T (n − 2) + 1] + 1 = T (n − 2) + 2
T (n) = [T (n − 3) + 1] + 2 = T (n − 3) + 3
T (n) = T (n − k) + k.
T (n) = T (n − n) + n = T (0) + n = 1 + n.
20 / 27
Algoritmos recursivos
T (0) = 0 e
T (n) = T (n − 1) + 1 para n > 0.
21 / 27
Algoritmos recursivos
Já o algoritmo para calcular o fatorial de forma iterativa (não
recursiva) pode ser facilmente implementado.
Fatorial(n)
1. x = 1
2. para i = 2 até n faça
3. x = x * i
4. retorne (x)
Algoritmo:
Hanoi (n, A, C, B)
1. se (n = 1) ent~
ao
2. mover disco do topo de A para C
3. sen~
ao
4. Hanoi(n-1, A, B, C)
5. mover disco do topo de A para C
6. Hanoi(n-1, B, C, A)
24 / 27
Algoritmos recursivos
25 / 27
Algoritmos recursivos
Expandir:
k = 1: T (n) = 2T (n − 1) + 1
26 / 27
Algoritmos recursivos
Expandir:
k = 1: T (n) = 2T (n − 1) + 1
k = 2: T (n) = 2[2T (n − 2) + 1] + 1 = 4T (n − 2) + 3
26 / 27
Algoritmos recursivos
Expandir:
k = 1: T (n) = 2T (n − 1) + 1
k = 2: T (n) = 2[2T (n − 2) + 1] + 1 = 4T (n − 2) + 3
k = 3: T (n) = 4[2T (n − 3) + 1] + 3 = 8T (n − 3) + 7
26 / 27
Algoritmos recursivos
Expandir:
k = 1: T (n) = 2T (n − 1) + 1
k = 2: T (n) = 2[2T (n − 2) + 1] + 1 = 4T (n − 2) + 3
k = 3: T (n) = 4[2T (n − 3) + 1] + 3 = 8T (n − 3) + 7
T (n) = 2n − 1
26 / 27
Algoritmos recursivos
Expandir:
k = 1: T (n) = 2T (n − 1) + 1
k = 2: T (n) = 2[2T (n − 2) + 1] + 1 = 4T (n − 2) + 3
k = 3: T (n) = 4[2T (n − 3) + 1] + 3 = 8T (n − 3) + 7
T (n) = 2n − 1
27 / 27
Exemplo 3
FIB(n)
1. se (n = 0 ou n = 1)
2. ent~
ao retorne (n)
3. sen~
ao retorne (FIB(n - 2) + FIB(n - 1))
T (0) = 0, T (1) = 1 e
T (n) = T (n − 2) + T (n − 1) para n > 1.
28 / 27
Exemplo 3
T (n) ≥ T (n − 2) + T (n − 2) = 2T (n − 2)
T (n) ≥ 4T (n − 4)
T (n) ≥ 8T (n − 6)
...
T (n) ≥ 2k T (n − 2k)
n−1
A expansão para quando n − 2k = 1, ou seja, k = 2 .
n−1
Logo, T (n) ≥ 2 2 .
29 / 27
Exemplo 3
30 / 27
Exemplo 3
Algoritmo iterativo para calcular a série de Fibonacci:
Fibonacci(n)
1. se (n = 0 ou n = 1)
2. ent~ao retorne (n)
3. sen~ao
4. F1 = 0
5. F2 = 1
6. para i = 1 até n - 1 faça
7. F = F1 + F2
8. F1 = F2
9. F2 = F
10. retorne (F)
BINARY-SEARCH(A,v,menor,maior)
1. se menor > maior ent~
ao retorna NULO
2. se (menor = maior e v = A[menor])
3. ent~
ao retorna menor
4. sen~
ao retorna NULO
5. meio = (menor + maior) / 2
6. se v = A[meio] ent~
ao retorna meio
7. se v > A[meio]
8. ent~
ao retorna BINARY-SEARCH(A,v,meio+1,maior)
9. sen~
ao retorna BINARY-SEARCH(A,v,menor,meio-1)
32 / 27
Exemplo 4
T (1) = Θ(1) e
33 / 27
Exemplo 4
Expandir:
k = 1: T (n) = T ( n2 ) + 1
34 / 27
Exemplo 4
Expandir:
k = 1: T (n) = T ( n2 ) + 1
k = 2: T (n) = [T ( n4 ) + 1] + 1 = T ( n4 ) + 2
34 / 27
Exemplo 4
Expandir:
k = 1: T (n) = T ( n2 ) + 1
k = 2: T (n) = [T ( n4 ) + 1] + 1 = T ( n4 ) + 2
k = 3: T (n) = [T ( n8 ) + 1] + 2 = T ( n8 ) + 3
34 / 27
Exemplo 4
Expandir:
k = 1: T (n) = T ( n2 ) + 1
k = 2: T (n) = [T ( n4 ) + 1] + 1 = T ( n4 ) + 2
k = 3: T (n) = [T ( n8 ) + 1] + 2 = T ( n8 ) + 3
Conjecturar:
Após k expansões, temos T (n) = T ( 2nk ) + k.
34 / 27
Exemplo 4
Expandir:
k = 1: T (n) = T ( n2 ) + 1
k = 2: T (n) = [T ( n4 ) + 1] + 1 = T ( n4 ) + 2
k = 3: T (n) = [T ( n8 ) + 1] + 2 = T ( n8 ) + 3
Conjecturar:
Após k expansões, temos T (n) = T ( 2nk ) + k.
34 / 27
Exemplo 4
35 / 27
Exemplo 4
35 / 27
Exemplo 4
35 / 27
Exemplo 4
35 / 27
Exemplo 4
35 / 27
Exemplo 4
T (n + 1) = T ( n+1
2 )+1
35 / 27
Exemplo 4
T (n + 1) = T ( n+1
2 )+1
T (n + 1) = 1 + log2 ( n+1
2 )+1
35 / 27
Exemplo 4
T (n + 1) = T ( n+1
2 )+1
T (n + 1) = 1 + log2 ( n+1
2 )+1
T (n + 1) = 1 + log2 (n + 1) − log2 (2) + 1
35 / 27
Exemplo 4
T (n + 1) = T ( n+1
2 )+1
T (n + 1) = 1 + log2 ( n+1
2 )+1
T (n + 1) = 1 + log2 (n + 1) − log2 (2) + 1
T (n + 1) = 1 + log2 (n + 1) − 1 + 1
35 / 27
Exemplo 4
T (n + 1) = T ( n+1
2 )+1
T (n + 1) = 1 + log2 ( n+1
2 )+1
T (n + 1) = 1 + log2 (n + 1) − log2 (2) + 1
T (n + 1) = 1 + log2 (n + 1) − 1 + 1
T (n + 1) = 1 + log2 (n + 1) c.q.d
35 / 27
Teorema Mestre
T (n) = aT ( bn ) + f (n),
36 / 27
Método Mestre
37 / 27
Método Mestre
1 T (n) = 4T ( n2 ) + n
2 T (n) = 2T ( n2 ) + n − 1
3 T (n) = T ( 2n
3 )+n
38 / 27
Método Mestre
T (n) = 4T ( n2 ) + n,
T (n) = 2T ( n2 ) + n − 1,
39 / 27
Método Mestre
T (n) = T ( 2n
3 ) + n,
41 / 27
Exercı́cio 5
MERGE-SORT (A, p, r)
1. se ( p < r ) ent~
ao
2. q = (p + r) / 2
3. MERGE-SORT (A, p, q)
4. MERGE-SORT (A, q + 1, r)
5. MERGE (A, p, q, r)
42 / 27
Exercı́cio 6
T (1) = 0 e
43 / 27
Exercı́cio 7
TESTE (n)
1. se (n = 0) ent~
ao retorne (8)
2. sen~
ao retorne (TESTE(n - 1) + 2)
44 / 27
Exercı́cio 8
45 / 27
Exercı́cio 9
Algoritmo 1:
T (1) = 1 e
T (n) = T ( n3 ) + n para n > 1.
Algoritmo 2:
T (1) = 1 e
T (n) = 3T ( n4 ) + n2 para n > 1.
46 / 27
Exercı́cio 10
47 / 27
Exercı́cio 11
48 / 27
Exercı́cio 12
49 / 27