Escolar Documentos
Profissional Documentos
Cultura Documentos
PROJETO E ANÁLISE DE
ALGORITMOS
Introdução ao projeto e análise de
algoritmos
Karina Valdivia Delgado
Roteiro
Fonte: Flickr
Corretude do algoritmo
Fonte: Própria
Ordenação
Problema: Ordenar um vetor A[1, …, n] de maneira
crescente.
Entrada:
23 20 21 28 27 22 25 24 29
Saída:
20 21 22 23 24 25 27 28 29
Ordenação por inserção 1
chave=22
Algoritmo e simulação baseada em https://www.ime.usp.br/~coelho/algoritmos/aulas/material/intro.pdf
1
Ordenação por inserção
i j chave=22
20 21 23 27 28 22 25 24 29
i
20 21 23 27 28 25 24 29
i
20 21 23 27 28 25 24 29
i
20 21 23 27 28 25 24 29
20 21 22 23 27 28 25 24 29
Ordenação por inserção
i j chave=25
20 21 22 23 27 28 25 24 29
i
20 21 22 23 27 28 24 29
i
20 21 22 23 27 28 24 29
20 21 22 23 25 27 28 24 29
Ordenação por inserção
i j chave=24
20 21 22 23 25 27 28 24 29
i
20 21 22 23 25 27 28 29
i
20 21 22 23 25 27 28 29
i
20 21 22 23 25 27 28 29
20 21 22 23 24 25 27 28 29
Ordenação por inserção
chave=29 i j
20 21 22 23 24 25 27 28 29
20 21 22 23 24 25 27 28 29
Ordenação por inserção
ORDENA-POR-INSERÇÃO (A, n)
1 para j ← 2 até n faça
2 chave ← A[j]
3 i←j−1
4 enquanto i ≥ 1 e A[i] > chave faça
5 A[i + 1] ← A[i]
6 i←i−1
7 A[i + 1] ← chave
Pior caso, melhor caso e caso médio
Para um vetor de tamanho n, quantas
comparações realiza o algoritmo?
Ordena por inserção
Número máximo de atribuições
ORDENA-POR-INSERÇÃO (A, n)
1 para j ← 2 até n faça n
2 chave ← A[j] n-1
3 i←j−1 n-1
4 enquanto i ≥ 1 e A[i] > chave faça 0
5 A[i + 1] ← A[i] ≤1+2+...+ n-1
6 i←i−1 ≤1+2+...+ n-1
7 A[i + 1] ← chave n-1
≤ n2+3n-3
Ordena por inserção
Cada linha consome 1 unidade de tempo
ORDENA-POR-INSERÇÃO (A, n)
1 para j ← 2 até n faça n
2 chave ← A[j] n-1
3 i←j−1 n-1
4 enquanto i ≥ 1 e A[i] > chave faça ≤2+3+...+ n
5 A[i + 1] ← A[i] ≤1+2+...+ n-1
6 i←i−1 ≤1+2+...+ n-1
7 A[i + 1] ← chave n-1
≤ (3n2+7n-8)/2
Ordena por inserção
Podemos considerar também que cada linha i de
código consome ti unidades de tempo, obtendo:
≤ c2n2+c1n+ c0
2n+3n √n
2n+3n √n
1
FEOFILOFF, P. Minicurso de Análise de Algoritmos.
Notação O
O(f(n)) intuitivamente são funções que não
crescem mais rápido que f (n)
lê-se:
T(n) é O de f(n)
ou
T(n) é da ordem
de f(n)
ou
T(n) ∈ O(f(n))
ou
abuso da
linguagem
T(n)=O(f(n))
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 1:
n²+800 é O(n²)
c=6
n0 = 14
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 2:
Demonstrar que n²+800 é O(n²)
Prova:
n²+800 ≤ n²+800*n² = 801 n² para todo n ≥ 1 => c=801 e
n0=1
Prova alternativa:
n²+800 ≤ n²+n*n = 2n² para todo n ≥ 800 => c=2 e n0=800
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 3:
Demonstrar que 100n² é O(n3)
Prova:
100n² ≤ n*n² = n3 para todo n ≥ 100 => c=1 e n0=100
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 4:
Demonstrar que 10n3-3n2+27 é O(n3)
Prova:
10n3-3n2+27 ≤ 10 n3 se (3n2-27)>=0 ou seja
10n3-3n2+27 ≤ 10 n3 para todo n ≥ 3 => c=10 e n0=3
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 5:
Demonstrar que n é O(2n)
Será provado por indução que n ≤ 2n para todo n ≥ 1 => c=1 e
n0=1:
Se n = 1 temos 1 ≤ 2 .
Para n ≥ 2 por hipótese de indução temos que (n − 1) ≤ 2 n−1.
Então n ≤ n + (n − 2) = (n − 1) + (n − 1) ≤ 2n−1 + 2n−1 = 2(2n−1)=2n .
Classes O
O(1) constante
O(lg n) logarítmica
O(n) linear
O(n lg n) n log n
O(n2 ) quadrática
O(n3 ) cúbica
O(nk ) com k >= 1 polinomial
O(2n ) exponencial
O(an ) com a > 1 exponencial
Ordena por inserção
ORDENA-POR-INSERÇÃO (A, n)
1 para j ← 2 até n faça O(n)
2 chave ← A[j] O(n)
3 i←j−1 O(n)
4 enquanto i ≥ 1 e A[i] > chave faça
5 A[i + 1] ← A[i]
6 i←i−1
7 A[i + 1] ← chave
nO(n) = O(n2)
O(n)+O(n)+O(n)+O(n) = O(4n)
O(n2)+ O(n2)+O(n2) = O(3n2)
O(3n2)+O(4n)= O(3n2+4n)
O(3n2+4n) = O(n2)
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n)
para todo n ≥ n0.
Exemplo 6:
Demonstrar que O(n2)+ O(n2) = O(2n2)
Isso significa que se T(n) é O(n2) e G(n) é O(n2), então T(n)+G(n)
é O(2n2).
Prova: existem constantes positivas c1 e n01 tais que:
T(n) ≤ c1n2 para todo n ≥ n01 e existem constantes
positivas c2 e n02 tais que: G(n) ≤ c2n2 para todo n ≥ n02
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n)
para todo n ≥ n0.
Exemplo 6:
Demonstrar que O(n2)+ O(n2) = O(2n2)
Isso significa que se T(n) é O(n2) e G(n) é O(n2), então T(n)+G(n)
é O(2n2).
Prova: existem constantes positivas c1 e n01 tais que:
T(n) ≤ c1n2 para todo n ≥ n01 e existem constantes
positivas c2 e n02 tais que: G(n) ≤ c2n2 para todo n ≥ n02
T(n)+G(n) ≤ c1n2 +c2n2=2n2(c1 +c2)/2 => c=(c1 +c2)/2 e n0 =max{n01,n02}
AULA 02
PROJETO E ANÁLISE DE
ALGORITMOS
Análise assintótica: ordens O, Ω e Θ
Parte I
Karina Valdivia Delgado
AULA 02
PROJETO E ANÁLISE DE
ALGORITMOS
Análise assintótica: ordens O, Ω e Θ
Parte I
Karina Valdivia Delgado
Roteiro
Introdução
Comparação assintótica de funções
Notação O
Exercícios
Introdução
Na aula anterior calculamos, de diferentes
formas, o consumo do algoritmo ordena por
inserção:
n2+3n-3
(3n2+7n-8)/2
c2n2+c1n+ c0
Vamos ficar satisfeitos com análises mais
aproximadas.
Note que n2 domina os outros termos.
Introdução
2n+3n √n
2n+3n √n
1
FEOFILOFF, P. Minicurso de Análise de Algoritmos.
Notação O
O(f(n)) intuitivamente são funções que não
crescem mais rápido que f (n)
lê-se:
T(n) é O de f(n)
ou
T(n) é da ordem
de f(n)
ou
T(n) ∈ O(f(n))
ou
abuso da
linguagem
T(n)=O(f(n))
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 1:
n²+800 é O(n²)
c=6
n0 = 14
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 2:
Demonstrar que n²+800 é O(n²)
Prova:
n²+800 ≤ n²+800*n² = 801 n² para todo n ≥ 1 => c=801 e
n0=1
Prova alternativa:
n²+800 ≤ n²+n*n = 2n² para todo n ≥ 800 => c=2 e n0=800
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 3:
Demonstrar que 100n² é O(n3)
Prova:
100n² ≤ n*n² = n3 para todo n ≥ 100 => c=1 e n0=100
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 4:
Demonstrar que 10n3-3n2+27 é O(n3)
Prova:
10n3-3n2+27 ≤ 10 n3 se (3n2-27)>=0 ou seja
10n3-3n2+27 ≤ 10 n3 para todo n ≥ 3 => c=10 e n0=3
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n)
é O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Exemplo 5:
Demonstrar que n é O(2n)
Será provado por indução que n ≤ 2n para todo n ≥ 1 => c=1 e
n0=1:
Se n = 1 temos 1 ≤ 2 .
Para n ≥ 2 por hipótese de indução temos que (n − 1) ≤ 2 n−1.
Então n ≤ n + (n − 2) = (n − 1) + (n − 1) ≤ 2n−1 + 2n−1 = 2(2n−1)=2n .
Classes O
O(1) constante
O(lg n) logarítmica
O(n) linear
O(n lg n) n log n
O(n2 ) quadrática
O(n3 ) cúbica
O(nk ) com k >= 1 polinomial
O(2n ) exponencial
O(an ) com a > 1 exponencial
Ordena por inserção
ORDENA-POR-INSERÇÃO (A, n)
1 para j ← 2 até n faça O(n)
2 chave ← A[j] O(n)
3 i←j−1 O(n)
4 enquanto i ≥ 1 e A[i] > chave faça
5 A[i + 1] ← A[i]
6 i←i−1
7 A[i + 1] ← chave
nO(n) = O(n2)
O(n)+O(n)+O(n)+O(n) = O(4n)
O(n2)+ O(n2)+O(n2) = O(3n2)
O(3n2)+O(4n)= O(3n2+4n)
O(3n2+4n) = O(n2)
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n)
para todo n ≥ n0.
Exemplo 6:
Demonstrar que O(n2)+ O(n2) = O(2n2)
Isso significa que se T(n) é O(n2) e G(n) é O(n2), então T(n)+G(n)
é O(2n2).
Prova: existem constantes positivas c1 e n01 tais que:
T(n) ≤ c1n2 para todo n ≥ n01 e existem constantes
positivas c2 e n02 tais que: G(n) ≤ c2n2 para todo n ≥ n02
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n)
para todo n ≥ n0.
Exemplo 6:
Demonstrar que O(n2)+ O(n2) = O(2n2)
Isso significa que se T(n) é O(n2) e G(n) é O(n2), então T(n)+G(n)
é O(2n2).
Prova: existem constantes positivas c1 e n01 tais que:
T(n) ≤ c1n2 para todo n ≥ n01 e existem constantes
positivas c2 e n02 tais que: G(n) ≤ c2n2 para todo n ≥ n02
T(n)+G(n) ≤ c1n2 +c2n2=2n2(c1 +c2)/2 => c=(c1 +c2)/2 e n0 =max{n01,n02}
AULA 02
PROJETO E ANÁLISE DE
ALGORITMOS
Análise assintótica: ordens O, Ω e Θ
Parte I
Karina Valdivia Delgado
AULA 03
PROJETO E ANÁLISE DE
ALGORITMOS
Análise assintótica: ordens O, Ω e Θ
Parte II
Karina Valdivia Delgado
Roteiro
Notação Ω
Notação Θ
Revisão de matemática
Exercício adicional
Comparação assintótica de funções
Três tipos de comparação assintótica1:
1
FEOFILOFF, P. Minicurso de Análise de Algoritmos.
Notação O
Sejam T(n) e f(n) funções dos inteiros nos reais. Dizemos que T(n) é
O(f(n)) se existem constantes positivas c e n0 tais que:
T (n) ≤ c f(n) para todo n ≥ n0.
Notação Ω
Dizemos que T(n) é Ω(f(n)) se existem constantes positivas c e n0
tais que: T (n) ≥ c f(n) para todo n ≥ n0.
Notação Ω
Dizemos que T(n) é Ω(f(n)) se existem constantes positivas c e n0 tais
que: T (n) ≥ c f(n) para todo n ≥ n0.
Exemplo 1:
Demonstrar que 6n+5 é Ω(n)
Prova:
6n+5 ≥ 6n para todo n ≥ 0 => c=6 e n0=0
Notação Ω
Dizemos que T(n) é Ω(f(n)) se existem constantes positivas c e n0 tais
que: T (n) ≥ c f(n) para todo n ≥ n0.
Exemplo 2:
Demonstrar que n2-2 é Ω(n2)
Prova:
n2-2 ≥ n2/2+(n2/2-2) ≥ n2/2 se (n2/2-2) ≥ 0, isto é, para todo n ≥
2 => c=1/2 e n0=2.
Notação Ω
Dizemos que T(n) é Ω(f(n)) se existem constantes positivas c e n0 tais
que: T (n) ≥ c f(n) para todo n ≥ n0.
Exemplo 3:
Demonstrar que nlgn é Ω(n)
Prova:
lg n ≥ 1 para todo n ≥ 2 e portanto nlg n ≥ n => c=1 e n0=2.
Notação Θ
Dizemos que T(n) é Θ(f(n)) se existem constantes positivas c1
e c2 e n0 tais que: c1 f(n) ≤ T (n) ≤ c2 f(n) para todo n ≥ n0.
Notação Θ
Dizemos que T(n) é Θ(f(n)) se T(n) é O(f(n)) e T(n) é Ω(f(n)).
Notação Θ
Dizemos que T(n) é Θ(f(n)) se existem constantes positivas c1
e c2 e n0 tais que: c1 f(n) ≤ T (n) ≤ c2 f(n) para todo n ≥ n0.
Exemplo 4:
Demonstrar que n2-2 é Θ(n2)
Prova:
n2-2 ≥ n2/2+(n2/2-2) ≥ n2/2 se (n2/2-2) ≥ 0, isto é, para
todo n ≥ 2 => c1=½ e n01=2.
Θ(1) constante
Θ(lg n) logarítmica
Θ(n) linear
Θ(n lg n) n log n
Θ(n2 ) quadrática
Θ(n3 ) cúbica
Θ(nk ) com k >= 1 polinomial
Θ(2n ) exponencial
Θ(an ) com a > 1 exponencial
Classes Θ
Θ(1) constante
Θ(lg n) logarítmica
Transitividade:
T(n) é Θ(f(n)) e f(n) é Θ(g(n)) então T(n) é Θ(g(n))
T(n) é O(f(n)) e f(n) é O(g(n)) então T(n) é O(g(n))
T(n) é Ω(f(n)) e f(n) é Ω(g(n)) então T(n) é Ω(g(n))
Reflexividade
T(n) é Θ(T(n))
T(n) é O(T(n))
T(n) é Ω(T(n))
Propriedades
Simétrica:
T(n) é Θ(f(n)) então f(n) é Θ(T(n))
Antissimétrica
T(n) é O(f(n)) então f(n) é Ω(T(n))
T(n) é Ω(f(n)) então f(n) é O(T(n))
Revisão de matemática
Expoentes:
xn * xm = xn + m
xn / xm = xn - m
(xn) m= xn *m
xn+xn= 2xn
Logaritmos:
loga(b*c) = logab + logac
loga(b/c) = logab – logac
logabm = m * logab
logab = logcb/ logca
Revisão de matemática
Somatórias:
Exercício adicional
Dizemos que T(n) é O(f(n)) se existem constantes positivas c e
n0 tais que: T (n) ≤ c f(n) para todo n ≥ n0.
Divisão e conquista
Algoritmo MergeSort
Equações de recorrência
Divisão e conquista
Muitos algoritmos conhecidos têm uma estrutura
recursiva.
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
O algoritmo está correto?
MergeSort
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
A correção se apoia na correção do algoritmo INTERCALA e pode
ser demonstrada por indução em n=r-p+1
MergeSort
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
Se p=r, isto é, n=1, o algoritmo devolve a resposta correta.
MergeSort
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
Podemos supor, por hipótese de indução, que para n ≥ 2 MERGE-
SORT(A,p,q) e MERGE-SORT(A,q+1,r) produz o resultado
esperado pois os trechos que estão sendo ordenados têm
tamanho menor que n.
MergeSort
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
Agora queremos saber qual o consumo de tempo?
MergeSort
MERGE-SORT (A, p, r)
1 se p < r
2 então q ← ⌊(p + r)/2⌋
3 MERGE-SORT (A, p, q)
4 MERGE-SORT (A, q + 1, r)
5 INTERCALA (A, p, q, r)
Seja T(n) o tempo máximo gasto pelo algoritmo
para ordenar um trecho de tamanho n=r-p+1
MergeSort
MERGE-SORT (A, p, r)
1 se p < r Θ(1)
2 então q ← ⌊(p + r)/2⌋ Θ(1)
3 MERGE-SORT (A, p, q) T(⌈n/2⌉)
4 MERGE-SORT (A, q + 1, r) T(⌊n/2⌋)
5 INTERCALA (A, p, q, r) Θ(n)
MergeSort
MERGE-SORT (A, p, r)
1 se p < r Θ(1)
2 então q ← ⌊(p + r)/2⌋ Θ(1)
3 MERGE-SORT (A, p, q) T(⌈n/2⌉)
4 MERGE-SORT (A, q + 1, r) T(⌊n/2⌋)
5 INTERCALA (A, p, q, r) Θ(n)
T(n) = T(⌈n/2⌉)+ T(⌊n/2⌋)+ Θ(n+2) para n=2,3,...
T(1) = Θ(1)
MergeSort
MERGE-SORT (A, p, r)
1 se p < r Θ(1)
2 T(n)=?q ← ⌊(p + r)/2⌋
então Θ(1)
3 T(n) éMERGE-SORT
Θ(?), é Θ(nlogn)?, é Θ(n²)?,
(A, p, q) é ⌉)
T(⌈n/2
4 Θ(n²logn)?
MERGE-SORT (A, q + 1, r) T(⌊n/2⌋)
5 INTERCALA (A, p, q, r) Θ(n)
T(n) = T(⌈n/2⌉)+ T(⌊n/2⌋)+ Θ(n+2) para n=2,3,...
T(1) = Θ(1)
Recorrências
Para calcular o consumo de tempo utilizamos
equações de recorrência.
Teorema mestre
Divisão e Conquista
Passos em cada nível de recursão:
MERGE-SORT (A, p, r)
1 se p < r Θ(1)
2 então q ← ⌊(p + r)/2⌋ Θ(1)
3 MERGE-SORT (A, p, q) T(⌈n/2⌉)
4 MERGE-SORT (A, q + 1, r) T(⌊n/2⌋)
5 INTERCALA (A, p, q, r) Θ(n)
T(n) = T(⌈n/2⌉)+ T(⌊n/2⌋)+ Θ(n+2) para n=2,3,...
T(1) = Θ(1)
MergeSort
MERGE-SORT (A, p, r)
1 se p < r Θ(1)
2 T(n)=?q ← ⌊(p + r)/2⌋
então Θ(1)
3 T(n) éMERGE-SORT
Θ(?), é Θ(nlogn)?, é Θ(n²)?,
(A, p, q) é ⌉)
T(⌈n/2
4 Θ(n²logn)?
MERGE-SORT (A, q + 1, r) T(⌊n/2⌋)
5 INTERCALA (A, p, q, r) Θ(n)
T(n) = T(⌈n/2⌉)+ T(⌊n/2⌋)+ Θ(n+2) para n=2,3,...
T(1) = Θ(1)
Consumo de tempo de
algoritmos Divisão e Conquista
Para uma entrada de tamanho n, o consumo de
tempo é:
T(n) = Dividir(n) + Conquistar(n) + Combinar(n).
Suponha que o problema é dividido em a
subproblemas, cada um com 1/b do tamanho
original. Qual o consumo do passo de Conquista?
Consumo de tempo de
algoritmos Divisão e Conquista
Para uma entrada de tamanho n, o consumo de
tempo é:
T(n) = Dividir(n) + Conquistar(n) + Combinar(n).
Suponha que o problema é dividido em a
subproblemas, cada um com 1/b do tamanho
original. Qual o consumo do passo de Conquista?
aT(n/b)
Consumo de tempo de
algoritmos Divisão e Conquista
O consumo de tempo é:
T(n) = Dividir(n) + aT(n/b) + Combinar(n).
Em geral temos:
T(n) = aT(n/b) + f (n)
a representa o número de subproblemas obtidos na
Divisão, n/b representa o tamanho de cada
subproblema e f(n) é a função que representa o
consumo das etapas de Divisão e Combinação
Resolver recorrências
Exemplo 1: Resolva
T(n) =1 se n=1
T(n) = 4 T(⌊n/2⌋) + n se n>1
Exemplo 1
(1) se f (n) = O(n log Ba−ε ) então T (n) = Θ(n log a b)
(2) se f (n) = Θ(n log ba ) então T (n) = Θ(n log ablg n)
(3) se f (n) = Ω(n log ba+ε ) então T (n) = Θ(f (n))
Exemplo 1: Resolva
T(n) =1 se n=1
T(n) = 4 T(⌊n/2⌋) + n se n>1
a=4 b=2 f(n) = n
nlog ba=nlog 42= n2 f(n) está “por cima” ou “por baixo” de nlog a ? b
Exemplo 1
(1) se f (n) = O(n log ba−ε ) então T (n) = Θ(n log a b)
(2) se f (n) = Θ(n log ba ) então T (n) = Θ(n log a blg n)
(3) se f (n) = Ω(n log ba+ε ) então T (n) = Θ(f (n))
Exemplo 1: Resolva
T(n) =1 se n=1
T(n) = 4 T(⌊n/2⌋) + n se n>1
a=4 b=2 f(n) = n
b 2
n log ba
=n log 4
= n2 f(n) está “por cima” ou “por baixo” de nlog a ?
f(n)=n=O(n2−ε) para ε =?
Exemplo 1
(1) se f (n) = O(n log ba−ε ) então T (n) = Θ(n log a b)
(2) se f (n) = Θ(n log ba ) então T (n) = Θ(n log ablg n)
(3) se f (n) = Ω(n log ba+ε ) então T (n) = Θ(f (n))
Exemplo 1: Resolva
T(n) =1 se n=1
T(n) = 4 T(⌊n/2⌋) + n se n>1
a=4 b=2 f(n) = n
log ba log 42
n b =n = n2 f(n) está “por cima” ou “por baixo” de nlog a ?
f(n)=n=O(n2−ε) para ε =1 (caso 1)
T(n) = Θ(n2)
Exemplo 2
(1) se f (n) = O(n log ba−ε ) então T (n) = Θ(n log a b)
(2) se f (n) = Θ(n log ba ) então T (n) = Θ(n log ablg n)
(3) se f (n) = Ω(n log ba+ε ) então T (n) = Θ(f (n))
Exemplo 2: Resolva
T(n) = T(⌊2n/3⌋) + 1
Exemplo 2
(1) se f (n) = O(n log ba−ε ) então T (n) = Θ(n log a b)
(2) se f (n) = Θ(n log ba ) então T (n) = Θ(n log a blg n)
(3) se f (n) = Ω(n log ba+ε ) então T (n) = Θ(f (n))
Exemplo 2: Resolva
T(n) = T(⌊2n/3⌋) + 1
Exemplo 2: Resolva
T(n) = T(⌊2n/3⌋) + 1
Exemplo 3: Resolva
T(n) = 3T(n/4) + nlgn, para n=4,8,12,16, ….
Exemplo 3: Resolva
T(n) = 3T(n/4) + nlgn, para n=4,8,12,16, ….
Exemplo 3: Resolva
T(n) = 3T(n/4) + nlgn, para n=4,8,12,16, ….
Exemplo 3: Resolva
T(n) = 3T(n/4) + nlgn, para n=4,8,12,16, ….
T(n)=Θ(nlogn)
Exemplo 4
(1) se f (n) = O(n log ba−ε ) então T (n) = Θ(n log a b)
(2) se f (n) = Θ(n log ba ) então T (n) = Θ(n log ablg n)
(3) se f (n) = Ω(n log ba+ε ) então T (n) = Θ(f (n))
Exemplo 4: Resolva
T(n) = 2T(n/2)+ n
Método Iteração
Árvore de recorrência
Método de substituição
Resolver recorrências
n 1 2 4 8 16 32 64 ...
T(n) 1
Exemplo
Resolver:
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
n 1 2 4 8 16 32 ...
T(n) 1 4
Exemplo
Resolver:
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
n 1 2 4 8 16 32 ...
T(n) 1 4 10 22 46 94
Exemplo
Resolver:
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
n 1 2 4 8 16 32 ...
T(n) 1 4 10 22 46 94
3n-2 1 4 10 22 46 94
Exemplo
Resolver:
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, …
n 1 2 4 8 16 32 ...
T(n) 1 4 10 22 46 94
3n-2 1 4 10 22 46 94
T(n) = 2*T(n/2) + 2 it 1
Exemplo
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
T(n) = 2*T(n/2)+2 it 1
T(n) = 2*T(n/2)+2 it 1
= 2*[ 2*T(n/4)+2]+2 = 2² T(n/2²)+6 it 2
= 2*[ 2*[2*T(n/8)+2]+2]+2 = 2³T(n/2³)+14 it 3
Exemplo
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
T(n) = 2*T(n/2)+2²-2 it 1
= 2*[ 2*T(n/4)+2]+2 = 2² T(n/2²)+2³-2 it 2
= 2*[ 2*[2*T(n/8)+2]+2]+2 = 2³T(n/2³)+2⁴-2 it 3
Exemplo
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
T(n) = 2*T(n/2)+2²-2 it 1
= 2*[ 2*T(n/4)+2]+2 = 2² T(n/2²)+2³-2 it 2
= 2*[ 2*[2*T(n/8)+2]+2]+2 = 2³T(n/2³)+2⁴-2 it 3
e para a i-ésima iteração?
Exemplo
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
T(n) = 2*T(n/2)+2²-2 it 1
= 2*[ 2*T(n/4)+2]+2 = 2² T(n/2²)+2³-2 it 2
= 2*[ 2*[2*T(n/8)+2]+2]+2 = 2³T(n/2³)+2⁴-2 it 3
e para a i-ésima iteração?
= 2iT(n/2i)+2i+1-2 it i
Exemplo
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
T(n) = 2*T(n/2)+2²-2 it 1
= 2*[ 2*T(n/4)+2]+2 = 2² T(n/2²)+2³-2 it 2
= 2*[ 2*[2*T(n/8)+2]+2]+2 = 2³T(n/2³)+2⁴-2 it 3
e para a i-ésima iteração?
= 2iT(n/2i)+2i+1-2 it i
Quando vou chegar no caso base (quando vou parar)?
Exemplo
T(1) = 1
T(n) = 2*T(n/2) + 2, para n=2, 4, 8, ..., 2i, ...
T(n)
0 1
Exemplo T(1) = 1
T(n) = 2*T(n/2) + 2
nível no
folhas
∑
2
0 1 2
T(n/2) T(n/2) 1 2
Exemplo T(1) = 1
T(n) = 2*T(n/2) + 2
nível no
folhas
∑
2
0 1 2
2 2 1 2 22
2
0 1 2
2 2 1 2 22
2 2 2 2 2 22 23
3 23
T(n/23) T(n/23) T(n/23) T(n/23) T(n/23) T(n/23) T(n/23) T(n/23)
Exemplo T(1) = 1
T(n) = 2*T(n/2) + 2
nível no ∑
folhas
2
0 1 2
2 2 1 2 22
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3 3 3 3 3 3
...
i-1 2i-1 2i
T(n/2i) … T(n/2i) i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1)
n/2i=1 → n= 2i → i=lgn
Exemplo T(1) = 1
T(n) = 2*T(n/2) + 2
nível no ∑
folhas
2
0 1 2
2 2 1 2 22
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3 3 3 3 3 3
...
i-1 2i-1 2i
T(1) … T(1) i 2i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1)
n/2i=1 → n= 2i → i=lgn
Exemplo T(1) = 1
T(n) = 2*T(n/2) + 2
nível no ∑
folhas
2
0 1 2
2 2 1 2 22
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3 3 3 3 3 3
...
i-1 2i-1 2i
T(1) … T(1) i 2i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1) i
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3n 3 3 3 3 3
∑ aj = ...
(an+1-1)/ (a-1)
j=0
i-1 2i-1 2i
T(1) … T(1) i 2i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1) i
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3n 3 3 3 3 3
∑ aj = ...
(an+1-1)/ (a-1)
j=0
i-1 2i-1 2i
T(1) … T(1) i 2i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1) i i
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3n 3 3 3 3 3
∑ aj = ...
(an+1-1)/ (a-1)
j=0
i-1 2i-1 2i
T(1) … T(1) i 2i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1)
n/2i=1 → n= 2i → i=lgn T(n)= 2i+ (2i+1-1)/(2-1) - 1 = n+ 2n-1-1= 3n-2
Exemplo T(1) = 1
T(n) = 2*T(n/2) + 2
nível no ∑
folhas
2
0 1 2
2 2 1 2 22
2 2 2 2 2 22 23
3 23
T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 ) T(n/2 )
3 3 3 3 3 3 3 3
T(n)=3n-2 ...
→ T(n)= Θ (n)
Será que o resultado que encontrei está correto?
i-1 2i-1 2i
T(1) … T(1) i 2i 2i
Quando vou chegar no caso base (quando vou parar)?
Quando T(n/2i)=T(1)
n/2i=1 → n= 2i → i=lgn T(n)= 2i+ (2i+1-1)/(2-1) - 1 = n+ 2n-1-1= 3n-2
Método da substituição
Método da iteração
O método começa com um “chute” para o
valor de T(n).