Вы находитесь на странице: 1из 413

Complexidade de algoritmos

Outline

1 Complexidade assintótica
Outline

1 Complexidade assintótica
Notações: O, Ω, Θ e o
Outline

1 Complexidade assintótica
Notações: O, Ω, Θ e o
Anáise caso-a-caso
Outline

1 Complexidade assintótica
Notações: O, Ω, Θ e o
Anáise caso-a-caso
Padrões de crescimento de funções
Outline

1 Complexidade assintótica
Notações: O, Ω, Θ e o
Anáise caso-a-caso
Padrões de crescimento de funções
2 Algoritmos recursivos
Outline

1 Complexidade assintótica
Notações: O, Ω, Θ e o
Anáise caso-a-caso
Padrões de crescimento de funções
2 Algoritmos recursivos
Funções de recorrência
Outline

1 Complexidade assintótica
Notações: O, Ω, Θ e o
Anáise caso-a-caso
Padrões de crescimento de funções
2 Algoritmos recursivos
Funções de recorrência
Algoritmos em árvore e dividir-para-conquistar
Complexidade assintótica
Algoritmo 1 Remover (vetor v , tamanho n, inteiro i)
j←0
while j < n do
if v[j] = i then
v[j] ← v[n-1]
n←n-1
return
end if
j←j+1
end while
Complexidade assintótica
300

(3n+2) t
250

6t
200
150
100
50
0

0 20 40 60 80 100

n
Complexidade assintótica
50000

5n2 + 700
6n2
3n2 + 3000
30000
10000
0

0 20 40 60 80 100

n
Complexidade assintótica

n3
8e+05

5n2 + 700
6n2
3n2 + 3000
4e+05
0e+00

0 20 40 60 80 100

n
Complexidade assintótica

2n
?

n3
382 anos

n2
n
logn
20m
0.00012s
0

1 2 5 10 20 50 100

n
Notação O (limite superior)
50000

5n2 + 10
6n2
2n2logn
30000
10000
0

0 20 40 60 80 100

Figure: f ∈ O(g ) ⇔ f (n) ≤ c · g (n), ∀n > n0


Notação Ω (limite inferior)

3n2 + 5
25000

2n2
15000
5000
0

0 20 40 60 80 100

Figure: f ∈ Ω(g ) ⇔ f (n) ≥ c · g (n), ∀n > n0


Notação Θ (crescimento equivalente)

3n2 + 5
25000

2n2
4n2
15000
5000
0

0 20 40 60 80 100

Figure: f ∈ Θ(g ) ⇔ f ∈ O(g ) e f ∈ Ω(g )


Análise caso-a-caso
Algoritmo 1 Remover (vetor v , tamanho n, inteiro i)
j←0
while j < n do
if v[j] = i then
v[j] ← v[n-1]
n←n-1
return
end if
j←j+1
end while
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
c = 1, tmelhor ≤ 1 · n, ∀n > 5 ⇒ tmelhor ∈ O(n) X
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
c = 1, tmelhor ≤ 1 · n, ∀n > 5 ⇒ tmelhor ∈ O(n) X
tmelhor ∈ O(1)?
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
c = 1, tmelhor ≤ 1 · n, ∀n > 5 ⇒ tmelhor ∈ O(n) X
tmelhor ∈ O(1)?
c = 7, tmelhor ≤ 7 · 1, ∀n > 0 ⇒ tmelhor ∈ O(1) X
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
c = 1, tmelhor ≤ 1 · n, ∀n > 5 ⇒ tmelhor ∈ O(n) X
tmelhor ∈ O(1)?
c = 7, tmelhor ≤ 7 · 1, ∀n > 0 ⇒ tmelhor ∈ O(1) X
tmelhor ∈ Ω(1)?
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
c = 1, tmelhor ≤ 1 · n, ∀n > 5 ⇒ tmelhor ∈ O(n) X
tmelhor ∈ O(1)?
c = 7, tmelhor ≤ 7 · 1, ∀n > 0 ⇒ tmelhor ∈ O(1) X
tmelhor ∈ Ω(1)?
c = 1, tmelhor ≥ 1 · 1, ∀n > 0 ⇒ tmelhor ∈ Ω(1) X
Análise caso-a-caso
1 Melhor caso: tmelhor (n) = 6
tmelhor ∈ O(n)?
c = 1, tmelhor ≤ 1 · n, ∀n > 5 ⇒ tmelhor ∈ O(n) X
tmelhor ∈ O(1)?
c = 7, tmelhor ≤ 7 · 1, ∀n > 0 ⇒ tmelhor ∈ O(1) X
tmelhor ∈ Ω(1)?
c = 1, tmelhor ≥ 1 · 1, ∀n > 0 ⇒ tmelhor ∈ Ω(1) X

⇒ tmelhor ∈ Θ(1) → Complexidade constante


Análise caso-a-caso

1 Pior caso: tpior (n) = 3n + 2


Análise caso-a-caso

1 Pior caso: tpior (n) = 3n + 2


tpior ∈ O(n)?
Análise caso-a-caso

1 Pior caso: tpior (n) = 3n + 2


tpior ∈ O(n)?
c = 4, tpior ≤ 4 · n, ∀n > 1 ⇒ tpior ∈ O(n) X
Análise caso-a-caso

1 Pior caso: tpior (n) = 3n + 2


tpior ∈ O(n)?
c = 4, tpior ≤ 4 · n, ∀n > 1 ⇒ tpior ∈ O(n) X
tpior ∈ Ω(n)?
Análise caso-a-caso

1 Pior caso: tpior (n) = 3n + 2


tpior ∈ O(n)?
c = 4, tpior ≤ 4 · n, ∀n > 1 ⇒ tpior ∈ O(n) X
tpior ∈ Ω(n)?
c = 1, tpior ≥ 1 · n, ∀n > 0 ⇒ tpior ∈ Ω(n) X
Análise caso-a-caso

1 Pior caso: tpior (n) = 3n + 2


tpior ∈ O(n)?
c = 4, tpior ≤ 4 · n, ∀n > 1 ⇒ tpior ∈ O(n) X
tpior ∈ Ω(n)?
c = 1, tpior ≥ 1 · n, ∀n > 0 ⇒ tpior ∈ Ω(n) X

⇒ tpior ∈ Θ(n) → Complexidade linear


Insertion sort
Algoritmo 2 insertionSort (vetor v , tamanho n)
i←1
while i < n do
atual ← v[i]
j ← i-1
while (j ≥ 0) e (atual < v[j]) do
v[j+1] = v[j]
j←j-1
end while
v[j+1] ← atual
i←i+1
end while
Insertion sort

Melhor caso:
Laço interno: 0
Insertion sort
Algoritmo 2 insertionSort (vetor v , tamanho n)
i←1
while i < n do
atual ← v[i]
j ← i-1
while (j ≥ 0) e (atual < v[j]) do
v[j+1] = v[j]
j←j-1
end while
v[j+1] ← atual
i←i+1
end while
Insertion sort

Melhor caso:
Laço interno: 0
Laço externo: 7(n − 1) = 7n − 7
Insertion sort
Algoritmo 2 insertionSort (vetor v , tamanho n)
i←1
while i < n do
atual ← v[i]
j ← i-1
while (j ≥ 0) e (atual < v[j]) do
v[j+1] = v[j]
j←j-1
end while
v[j+1] ← atual
i←i+1
end while
Insertion sort
Melhor caso:
Laço interno: 0
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2
Insertion sort
Melhor caso:
Laço interno: 0
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tmelhor (n) = 7n − 5
Insertion sort
Melhor caso:
Laço interno: 0
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tmelhor (n) = 7n − 5
tmelhor ∈ O(n)
Insertion sort
Melhor caso:
Laço interno: 0
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tmelhor (n) = 7n − 5
tmelhor ∈ O(n)
tmelhor ∈ Ω(n)
Insertion sort
Melhor caso:
Laço interno: 0
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tmelhor (n) = 7n − 5
tmelhor ∈ O(n)
tmelhor ∈ Ω(n)
⇒ tmelhor ∈ Θ(n) → Complexidade linear
Insertion sort
Algoritmo 2 insertionSort (vetor v , tamanho n)
i←1
while i < n do
atual ← v[i]
j ← i-1
while (j ≥ 0) e (atual < v[j]) do
v[j+1] = v[j]
j←j-1
end while
v[j+1] ← atual
i←i+1
end while
Insertion sort

Pior caso:
Laço interno: 4( n(n−1)
2 ) = 2(n2 − n) = 2n2 − 2n
Insertion sort
Algoritmo 2 insertionSort (vetor v , tamanho n)
i←1
while i < n do
atual ← v[i]
j ← i-1
while (j ≥ 0) e (atual < v[j]) do
v[j+1] = v[j]
j←j-1
end while
v[j+1] ← atual
i←i+1
end while
Insertion sort

Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 6(n − 1) = 6n − 6
Insertion sort
Algoritmo 2 insertionSort (vetor v , tamanho n)
i←1
while i < n do
atual ← v[i]
j ← i-1
while (j ≥ 0) e (atual < v[j]) do
v[j+1] = v[j]
j←j-1
end while
v[j+1] ← atual
i←i+1
end while
Insertion sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 6n − 6
Demais operações: 2
Insertion sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 6n − 6
Demais operações: 2

tpior (n) = 2n2 + 4n − 4


Insertion sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 6n − 6
Demais operações: 2

tpior (n) = 2n2 + 4n − 4


tpior ∈ O(n2 )
Insertion sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 6n − 6
Demais operações: 2

tpior (n) = 2n2 + 4n − 4


tpior ∈ O(n2 )
tpior ∈ Ω(n2 )
Insertion sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 6n − 6
Demais operações: 2

tpior (n) = 2n2 + 4n − 4


tpior ∈ O(n2 )
tpior ∈ Ω(n2 )
⇒ tpior ∈ Θ(n2 ) → Complexidade quadrática
Selection sort
Algoritmo 3 selectionSort (vetor v , tamanho n)
i←0
while i < n - 1 do
min ← 0; j ← 1
while j < n − i do
if v[j] < v[min] then
min ← j
end if
j←j-1
end while
swap(v[min], v[n - i -1])
end while
Selection sort

Melhor caso:
Laço interno: 3( n(n−1)
2 ) = 32 n2 − 32 n
Selection sort
Algoritmo 3 selectionSort (vetor v , tamanho n)
i←0
while i < n - 1 do
min ← 0; j ← 1
while j < n − i do
if v[j] < v[min] then
min ← j
end if
j←j-1
end while
swap(v[min], v[n - i -1])
end while
Selection sort

Melhor caso:
3 2
Laço interno: 2n − 23 n
Laço externo: 7(n − 1) = 7n − 7
Selection sort
Algoritmo 3 selectionSort (vetor v , tamanho n)
i←0
while i < n - 1 do
min ← 0; j ← 1
while j < n − i do
if v[j] < v[min] then
min ← j
end if
j←j-1
end while
swap(v[min], v[n - i -1])
end while
Selection sort
Melhor caso:
3 2
Laço interno: 2n − 23 n
Laço externo: 7n − 7
Demais operações: 2
Selection sort
Melhor caso:
3 2
Laço interno: 2n − 23 n
Laço externo: 7n − 7
Demais operações: 2
3n2 11n
tmelhor (n) = 2 + 2 −5
Selection sort
Melhor caso:
3 2
Laço interno: 2n − 23 n
Laço externo: 7n − 7
Demais operações: 2
3n2 11n
tmelhor (n) = 2 + 2 −5
tmelhor ∈ O(n2 )
Selection sort
Melhor caso:
3 2
Laço interno: 2n − 23 n
Laço externo: 7n − 7
Demais operações: 2
3n2 11n
tmelhor (n) = 2 + 2 −5
tmelhor ∈ O(n2 )
tmelhor ∈ Ω(n2 )
Selection sort
Melhor caso:
3 2
Laço interno: 2n − 23 n
Laço externo: 7n − 7
Demais operações: 2
3n2 11n
tmelhor (n) = 2 + 2 −5
tmelhor ∈ O(n2 )
tmelhor ∈ Ω(n2 )
⇒ tmelhor ∈ Θ(n2 ) → Complexidade quadrática
Selection sort
Algoritmo 3 selectionSort (vetor v , tamanho n)
i←0
while i < n - 1 do
min ← 0; j ← 1
while j < n − i do
if v[j] < v[min] then
min ← j
end if
j←j-1
end while
swap(v[min], v[n - i -1])
end while
Selection sort

Pior caso:
Laço interno: 4( n(n−1)
2 ) = 2n2 − 2n
Selection sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2
Selection sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tpior (n) = 2n2 + 5n − 5


Selection sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tpior (n) = 2n2 + 5n − 5


tpior ∈ O(n2 )
Selection sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tpior (n) = 2n2 + 5n − 5


tpior ∈ O(n2 )
tpior ∈ Ω(n2 )
Selection sort
Pior caso:
Laço interno: 2n2 − 2n
Laço externo: 7(n − 1) = 7n − 7
Demais operações: 2

tpior (n) = 2n2 + 5n − 5


tpior ∈ O(n2 )
tpior ∈ Ω(n2 )
⇒ tpior ∈ Θ(n2 ) → Complexidade quadrática
Padrões de crescimento

Função Ordem

1 Constante

log n Logarı́tmica

n Linear

n log n Logarı́tmica linear

n2 Quadrática

n3 Cúbica

n
2 Exponencial

n! Fatorial
Padrões de crescimento

2n
?

n3
382 anos

n2
n
logn
20m
0.00012s
0

1 2 5 10 20 50 100

n
Recorrências

Algoritmo 4 fatorial (inteiro i)


if i = 0 then
return 1
else
return i · fatorial(i-1)
end if
Recorrências

(
t1 , n=0
T (n) = (1)
T (n − 1) + t2 , n>0
Método iterativo

T (n) = T (n − 1) + t2
Método iterativo

T (n) = T (n − 1) + t2

T (n) = T (n − 2) + t2 + t2 = T (n − 2) + 2t2
Método iterativo

T (n) = T (n − 1) + t2

T (n) = T (n − 2) + t2 + t2 = T (n − 2) + 2t2

T (n) = T (n − 3) + t2 + 2t2 = T (n − 3) + 3t2


Método iterativo

T (n) = T (n − 1) + t2

T (n) = T (n − 2) + t2 + t2 = T (n − 2) + 2t2

T (n) = T (n − 3) + t2 + 2t2 = T (n − 3) + 3t2

T (n) = T (n − k) + k t2
Método iterativo

T (n) = T (n − 1) + t2

T (n) = T (n − 2) + t2 + t2 = T (n − 2) + 2t2

T (n) = T (n − 3) + t2 + 2t2 = T (n − 3) + 3t2

T (n) = T (n − k) + k t2

Fazendo k = n:
Método iterativo

T (n) = T (n − 1) + t2

T (n) = T (n − 2) + t2 + t2 = T (n − 2) + 2t2

T (n) = T (n − 3) + t2 + 2t2 = T (n − 3) + 3t2

T (n) = T (n − k) + k t2

Fazendo k = n:

T (n) = T (0) + n t2 = t1 + n t2
Merge sort

Algoritmo 5 mergeSort (vetor v , ı́ndices hleft, righti)


n ← right - left
if n < 2 then
return
else
mergeSort(v, 0, bn/2c)
mergeSort(v, bn/2c, n)
merge(v, left, right)
end if
Merge sort

(
3, n<2
T (n) = (2)
2 + 2T ( n2 ) + tmerge , n≥2
Algoritmo 6 merge(vetor v , ı́ndices hleft, righti)
n ← right - left; k ← 0
i ← left; j ← i + bn/2c
while i < left + bn/2c or j < right do
if v[i] < v[k] then
aux[k] ← v[i]; i ← i + 1
else
aux[k] ← v[j]; j ← j + 1
end if
end while
i ← left; j ← 0
while i < right do
v[i] ← aux[j]; i ← i + 1; j ← j + 1
end while
Procedimento merge

Melhor e pior casos:


Laço de cima: 4n
Algoritmo 6 merge(vetor v , ı́ndices hleft, righti)
n ← right - left; k ← 0
i ← left; j ← i + bn/2c
while i < left + bn/2c or j < right do
if v[i] < v[k] then
aux[k] ← v[i]; i ← i + 1
else
aux[k] ← v[j]; j ← j + 1
end if
end while
i ← left; j ← 0
while i < right do
v[i] ← aux[j]; i ← i + 1; j ← j + 1
end while
Procedimento merge

Melhor e pior casos:


Laço de cima: 4n
Laço de baixo: 4n
Algoritmo 6 merge(vetor v , ı́ndices hleft, righti)
n ← right - left; k ← 0
i ← left; j ← i + bn/2c
while i < left + bn/2c or j < right do
if v[i] < v[k] then
aux[k] ← v[i]; i ← i + 1
else
aux[k] ← v[j]; j ← j + 1
end if
end while
i ← left; j ← 0
while i < right do
v[i] ← aux[j]; i ← i + 1; j ← j + 1
end while
Procedimento merge
Melhor e pior casos:
Laço interno: 4n
Laço externo: 4n
Demais operações: 8
Procedimento merge
Melhor e pior casos:
Laço interno: 4n
Laço externo: 4n
Demais operações: 8

tmerge (n) = 8n + 8
Procedimento merge
Melhor e pior casos:
Laço interno: 4n
Laço externo: 4n
Demais operações: 8

tmerge (n) = 8n + 8
tmerge ∈ O(n)
Procedimento merge
Melhor e pior casos:
Laço interno: 4n
Laço externo: 4n
Demais operações: 8

tmerge (n) = 8n + 8
tmerge ∈ O(n)
tmerge ∈ Ω(n)
Procedimento merge
Melhor e pior casos:
Laço interno: 4n
Laço externo: 4n
Demais operações: 8

tmerge (n) = 8n + 8
tmerge ∈ O(n)
tmerge ∈ Ω(n)
⇒ tmerge ∈ Θ(n) → Complexidade linear
Merge sort

Algoritmo 5 mergeSort (vetor v , ı́ndices hleft, righti)


n ← right - left
if n < 2 then
return
else
mergeSort(v, 0, bn/2c)
mergeSort(v, bn/2c, n)
merge(v, left, right)
end if
Merge sort

(
3, n<2
T (n) = (3)
2 + 2T ( n2 ) + tmerge , n≥2
Merge sort

(
3, n<2
T (n) = n
(4)
2 + 2T ( 2 ) + n, n ≥ 2
Merge sort
T (n) = 2T ( n2 ) + n
Merge sort
T (n) = 2T ( n2 ) + n

T (n) = 2(2T ( n4 ) + n2 ) + n = 4T ( n4 ) + 2n
Merge sort
T (n) = 2T ( n2 ) + n

T (n) = 2(2T ( n4 ) + n2 ) + n = 4T ( n4 ) + 2n

T (n) = 4(2T ( n8 ) + n4 ) + 2n = 8T ( n8 ) + 3n
Merge sort
T (n) = 2T ( n2 ) + n

T (n) = 2(2T ( n4 ) + n2 ) + n = 4T ( n4 ) + 2n

T (n) = 4(2T ( n8 ) + n4 ) + 2n = 8T ( n8 ) + 3n

T (n) = 2k T ( 2nk ) + k · n
Merge sort
T (n) = 2T ( n2 ) + n

T (n) = 2(2T ( n4 ) + n2 ) + n = 4T ( n4 ) + 2n

T (n) = 4(2T ( n8 ) + n4 ) + 2n = 8T ( n8 ) + 3n

T (n) = 2k T ( 2nk ) + k · n

Fazendo k = log2 n:
Merge sort
T (n) = 2T ( n2 ) + n

T (n) = 2(2T ( n4 ) + n2 ) + n = 4T ( n4 ) + 2n

T (n) = 4(2T ( n8 ) + n4 ) + 2n = 8T ( n8 ) + 3n

T (n) = 2k T ( 2nk ) + k · n

Fazendo k = log2 n:

T (n) = 2log2 n T ( 2logn2 n ) + n · log2 n


Merge sort
T (n) = 2T ( n2 ) + n

T (n) = 2(2T ( n4 ) + n2 ) + n = 4T ( n4 ) + 2n

T (n) = 4(2T ( n8 ) + n4 ) + 2n = 8T ( n8 ) + 3n

T (n) = 2k T ( 2nk ) + k · n

Fazendo k = log2 n:

T (n) = 2log2 n T ( 2logn2 n ) + n · log2 n

T (n) = nT ( nn ) + n · log2 n = nT (1) + n · log2 n


Merge sort

(
3, n<2
T (n) = n
(5)
2T ( 2 ) + n, n ≥ 2
Merge sort

T (n) = 2k T ( 2nk ) + k · n

Fazendo k = log2 n:

T (n) = 2log2 n T ( 2logn2 n ) + n · log2 n

T (n) = nT ( nn ) + n · log2 n = nT (1) + n · log2 n

T (n) = 3n + n log2 n −→ T (n) ∈ Θ(n log n)


Recorrências

1 Método iterativo (substituição repetida)


Recorrências

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Recorrências

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel
Recorrências

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel

Altura da árvore
Recorrências

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel
1 Passo da divisão

Altura da árvore
Recorrências

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel
1 Passo da divisão
2 Passo da conquista

Altura da árvore
Merge sort

Algoritmo 5 mergeSort (vetor v , ı́ndices hleft, righti)


n ← right - left
if n < 2 then
return
else
mergeSort(v, 0, bn/2c)
mergeSort(v, bn/2c, n)
merge(v, left, right)
end if
Merge sort

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel
1 Passo da divisão — Θ(1)
2 Passo da conquista

Altura da árvore
Merge sort

Algoritmo 5 mergeSort (vetor v , ı́ndices hleft, righti)


n ← right - left
if n < 2 then
return
else
mergeSort(v, 0, bn/2c)
mergeSort(v, bn/2c, n)
merge(v, left, right)
end if
Merge sort

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel
1 Passo da divisão — Θ(1)
2 Passo da conquista — Θ(n)

Altura da árvore
Merge sort

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel
1 Passo da divisão — Θ(1)
2 Passo da conquista — Θ(n)

Altura da árvore — Θ(log n)


Merge sort

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel — Θ(1) + Θ(n) = Θ(n)

Altura da árvore — Θ(log n)


Merge sort

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel — Θ(1) + Θ(n) = Θ(n)
O(f(n)) + O(g(n)) = max(O(f(n)), O(g(n)))

Altura da árvore — Θ(log n)


Merge sort

1 Método iterativo (substituição repetida)


2 Método da árvore (análise visual)
Custo por nı́vel — Θ(1) + Θ(n) = Θ(n)
O(f(n)) + O(g(n)) = max(O(f(n)), O(g(n)))
Demonstrem ;)

Altura da árvore — Θ(log n)


Merge sort
Algoritmo 6 mergeSort (vetor v , ı́ndices hleft, righti)
n ← right - left
if n < 2 then
return
else
mergeSort(v, 0, bn/4c)
mergeSort(v, bn/4c, bn/2c)
mergeSort(v, bn/2c, b3n/4c)
mergeSort(v, b3n/4c, n)
merge(v, left, right)
end if
Merge sort

T (n) = 4T ( n4 ) + n
Merge sort

T (n) = 4T ( n4 ) + n
n
T (n) = 4(4T ( 16 ) + n4 ) + n = 16T ( 16
n
) + 2n
Merge sort

T (n) = 4T ( n4 ) + n
n
T (n) = 4(4T ( 16 ) + n4 ) + n = 16T ( 16
n
) + 2n
n n n
T (n) = 16(4T ( 64 )+ 16 ) + 2n = 64T ( 64 ) + 3n
Merge sort

T (n) = 4T ( n4 ) + n
n
T (n) = 4(4T ( 16 ) + n4 ) + n = 16T ( 16
n
) + 2n
n n n
T (n) = 16(4T ( 64 )+ 16 ) + 2n = 64T ( 64 ) + 3n

T (n) = 4k T ( 4nk ) + k · n
Merge sort

T (n) = 4k T ( 4nk ) + k · n
Merge sort

T (n) = 4k T ( 4nk ) + k · n

Fazendo k = log4 n:
Merge sort

T (n) = 4k T ( 4nk ) + k · n

Fazendo k = log4 n:

T (n) = 4log4 n T ( 4logn4 n ) + n · log4 n


Merge sort

T (n) = 4k T ( 4nk ) + k · n

Fazendo k = log4 n:

T (n) = 4log4 n T ( 4logn4 n ) + n · log4 n

T (n) = nT ( nn ) + n · log4 n = nT (1) + n · log4 n


Merge sort

T (n) = 4k T ( 4nk ) + k · n

Fazendo k = log4 n:

T (n) = 4log4 n T ( 4logn4 n ) + n · log4 n

T (n) = nT ( nn ) + n · log4 n = nT (1) + n · log4 n

T (n) = 3n + n log4 n
Merge sort

T (n) = 2T ( n2 ) + n −→ T (n) = 3n + n log2 n


Merge sort

T (n) = 2T ( n2 ) + n −→ T (n) = 3n + n log2 n

T (n) = 4T ( n4 ) + n −→ T (n) = 3n + n log4 n


Merge sort

T (n) = 2T ( n2 ) + n −→ T (n) = 3n + n log2 n

T (n) = 4T ( n4 ) + n −→ T (n) = 3n + n log4 n

T (n) = 8T ( n8 ) + n −→ T (n) = 3n + n log8 n


Merge sort

T (n) = 2T ( n2 ) + n −→ T (n) = 3n + n log2 n

T (n) = 4T ( n4 ) + n −→ T (n) = 3n + n log4 n

T (n) = 8T ( n8 ) + n −→ T (n) = 3n + n log8 n

T (n) = nT ( nn ) + n −→ T (n) = 3n + n logn n


Merge sort

(
3, n<2
T (n) = n
(6)
2T ( 2 ) + tmerge , n ≥ 2
Merge sort

(
3, n<2
T (n) = n
(7)
2T ( 2 ) + n, n ≥ 2
Merge sort

(
3, n<2
T (n) = (8)
dT ( dn ) + (d − 1) · n, n≥2
Merge sort

T (n) = dT ( dn ) + (d − 1) · n
Merge sort

T (n) = dT ( dn ) + (d − 1) · n

T (n) = d(dT ( dn2 ) + (d − 1) dn ) + (d − 1) · n


Merge sort

T (n) = dT ( dn ) + (d − 1) · n

T (n) = d(dT ( dn2 ) + (d − 1) dn ) + (d − 1) · n

T (n) = d 2 T ( dn2 ) + 2 · (d − 1) · n
Merge sort

T (n) = dT ( dn ) + (d − 1) · n

T (n) = d(dT ( dn2 ) + (d − 1) dn ) + (d − 1) · n

T (n) = d 2 T ( dn2 ) + 2 · (d − 1) · n

T (n) = d 2 (dT ( dn3 ) + (d − 1) · n


d2
) + 2 · (d − 1) · n
Merge sort

T (n) = dT ( dn ) + (d − 1) · n

T (n) = d(dT ( dn2 ) + (d − 1) dn ) + (d − 1) · n

T (n) = d 2 T ( dn2 ) + 2 · (d − 1) · n

T (n) = d 2 (dT ( dn3 ) + (d − 1) · n


d2
) + 2 · (d − 1) · n

T (n) = d 3 T ( dn3 ) + 3 · (d − 1) · n
Merge sort

T (n) = dT ( dn ) + (d − 1) · n

T (n) = d(dT ( dn2 ) + (d − 1) dn ) + (d − 1) · n

T (n) = d 2 T ( dn2 ) + 2 · (d − 1) · n

T (n) = d 2 (dT ( dn3 ) + (d − 1) · n


d2
) + 2 · (d − 1) · n

T (n) = d 3 T ( dn3 ) + 3 · (d − 1) · n

T (n) = d k T ( dnk ) + k · (d − 1) · n
Merge sort

T (n) = d k T ( dnk ) + k · (d − 1) · n
Merge sort

T (n) = d k T ( dnk ) + k · (d − 1) · n

Fazendo k = logd n:
Merge sort

T (n) = d k T ( dnk ) + k · (d − 1) · n

Fazendo k = logd n:

T (n) = d logd n T ( d lognd n ) + logd n · (d − 1) · n


Merge sort

T (n) = d k T ( dnk ) + k · (d − 1) · n

Fazendo k = logd n:

T (n) = d logd n T ( d lognd n ) + logd n · (d − 1) · n

T (n) = nT ( nn ) + logd n · (d − 1) · n
Merge sort

T (n) = d k T ( dnk ) + k · (d − 1) · n

Fazendo k = logd n:

T (n) = d logd n T ( d lognd n ) + logd n · (d − 1) · n

T (n) = nT ( nn ) + logd n · (d − 1) · n

T (n) = nT (1) + logd n · (d − 1) · n


Merge sort

T (n) = d k T ( dnk ) + k · (d − 1) · n

Fazendo k = logd n:

T (n) = d logd n T ( d lognd n ) + logd n · (d − 1) · n

T (n) = nT ( nn ) + logd n · (d − 1) · n

T (n) = nT (1) + logd n · (d − 1) · n

T (n) = 3n + logd n · (d − 1) · n
Merge sort

T (n) = 3n + (d − 1) · n logd n
Merge sort

T (n) = 3n + (d − 1) · n logd n

d = 2 −→ T (n) = 3n + (2 − 1)n log 2 n = 3n + n log 2 n


Merge sort

T (n) = 3n + (d − 1) · n logd n

d = 2 −→ T (n) = 3n + (2 − 1)n log 2 n = 3n + n log 2 n

d = 4 −→ T (n) = 3n + (4 − 1)n log 4 n = 3n + 3n log 4 n


Merge sort

T (n) = 3n + (d − 1) · n logd n

d = 2 −→ T (n) = 3n + (2 − 1)n log 2 n = 3n + n log 2 n

d = 4 −→ T (n) = 3n + (4 − 1)n log 4 n = 3n + 3n log 4 n

d = n −→ T (n) = 3n + (n − 1)n log n n = 3n + (n − 1)n


Merge sort

T (n) = 3n + logd n · (d − 1) · n

d = 2 −→ T (n) = 3n + n log 2 n ∈ Θ(n log n)


Merge sort

T (n) = 3n + logd n · (d − 1) · n

d = 2 −→ T (n) = 3n + n log 2 n ∈ Θ(n log n)

d = 4 −→ T (n) = 3n + 3n log 4 n ∈ Θ(n log n)


Merge sort

T (n) = 3n + logd n · (d − 1) · n

d = 2 −→ T (n) = 3n + n log 2 n ∈ Θ(n log n)

d = 4 −→ T (n) = 3n + 3n log 4 n ∈ Θ(n log n)

d = n −→ T (n) = 3n + (n − 1)n ∈ Θ(n2 )


Quick sort

Algoritmo 7 quickSort (vetor v , ı́ndices hleft, righti)


if right - left < 2 then
return
else
p ← partition(v, left, right)
quickSort(v, left, p)
quickSort(v, p, right)
end if
Quick sort

(
2, n<2
T (n) = (9)
tpartition + T (menor ) + T (maior ), n ≥ 2
Algoritmo 8 partition(vetor v , ı́ndices hleft, righti)
aux ← left; i ← left + 1; j ← right - 1
while i ≤ j do
while v[i] ≤ aux and i < j do
i←i+1
end while
while v[j] > aux and i < j do
j←j-1
end while
if v[i] > v[j] then
swap(v[i], v[j])
end if
end while
swap(v[0], v[right])
return right
Quick sort

(
2, n<2
T (n) = (10)
Θ(n) + T (menor ) + T (maior ), n ≥ 2
Melhor caso

T (n) = 2T ( n2 ) + n
Melhor caso

T (n) = 2T ( n2 ) + n

Igual ao mergesort:
Melhor caso

T (n) = 2T ( n2 ) + n

Igual ao mergesort:

T (n) = nT (1) + n · log2 n


Quick sort

(
2, n<2
T (n) = (11)
n + T (menor ) + T (maior ), n ≥ 2
Melhor caso

T (n) = 2T ( n2 ) + n

Igual ao mergesort:

T (n) = nT (1) + n · log2 n


Melhor caso

T (n) = 2T ( n2 ) + n

Igual ao mergesort:

T (n) = nT (1) + n · log2 n

T (n) = 2n + n · log2 n
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)

T (n) = T (n − 1) + n
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)

T (n) = T (n − 1) + n

T (n = (T (n − 2) + n − 1) + n = T (n − 2) + 2n − 1
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)

T (n) = T (n − 1) + n

T (n = (T (n − 2) + n − 1) + n = T (n − 2) + 2n − 1

T (n) = (T (n − 3) + n − 2) + 2n − 1 = T (n − 3) + 3n − 3
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)

T (n) = T (n − 1) + n

T (n = (T (n − 2) + n − 1) + n = T (n − 2) + 2n − 1

T (n) = (T (n − 3) + n − 2) + 2n − 1 = T (n − 3) + 3n − 3

T (n) = (T (n − 4) + n − 3) + 3n − 3 = T (n − 4) + 4n − 6
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)

T (n) = T (n − 1) + n

T (n = (T (n − 2) + n − 1) + n = T (n − 2) + 2n − 1

T (n) = (T (n − 3) + n − 2) + 2n − 1 = T (n − 3) + 3n − 3

T (n) = (T (n − 4) + n − 3) + 3n − 3 = T (n − 4) + 4n − 6

T (n) = (T (n − 5) + n − 4) + 3n − 6 = T (n − 5) + 5n − 10
Pior caso

T (n) = n + T (n − 1) + T (0) = n + T (n − 1) + 2

Iteração (simplificando)

T (n) = T (n − 1) + n

T (n = (T (n − 2) + n − 1) + n = T (n − 2) + 2n − 1

T (n) = (T (n − 3) + n − 2) + 2n − 1 = T (n − 3) + 3n − 3

T (n) = (T (n − 4) + n − 3) + 3n − 3 = T (n − 4) + 4n − 6

T (n) = (T (n − 5) + n − 4) + 3n − 6 = T (n − 5) + 5n − 10
k−1
X
T (n) = T (n − k) + kn − i
i=1
Pior caso
k−1
X
T (n) = T (n − k) + kn − i
i=1
Pior caso
k−1
X
T (n) = T (n − k) + kn − i
i=1
k(k−1)
T (n) = T (n − k) + kn − 2
Pior caso
k−1
X
T (n) = T (n − k) + kn − i
i=1
k(k−1)
T (n) = T (n − k) + kn − 2

Fazendo k = n:
Pior caso
k−1
X
T (n) = T (n − k) + kn − i
i=1
k(k−1)
T (n) = T (n − k) + kn − 2

Fazendo k = n:
n(n−1)
T (n) = T (n − n) + n · n − 2
Pior caso
k−1
X
T (n) = T (n − k) + kn − i
i=1
k(k−1)
T (n) = T (n − k) + kn − 2

Fazendo k = n:
n(n−1)
T (n) = T (n − n) + n · n − 2
(n2 −n)
T (n) = T (0) + n2 − 2
Pior caso
k−1
X
T (n) = T (n − k) + kn − i
i=1
k(k−1)
T (n) = T (n − k) + kn − 2

Fazendo k = n:
n(n−1)
T (n) = T (n − n) + n · n − 2
(n2 −n)
T (n) = T (0) + n2 − 2
n2 n
T (n) = T (0) + 2 + 2
n2 n
T (n) = 2 + 2 + 2 −→ T (n) ∈ Θ(n2 )
Escolha do pivô

Extremidade do vetor: Θ(1)


Escolha do pivô

Extremidade do vetor: Θ(1)

Mediana de k amostras: Θ(k 2 )


Escolha do pivô

Extremidade do vetor: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana de k amostras: Θ(k 2 )


Escolha do pivô

Extremidade do vetor: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana de k amostras: Θ(k 2 ) −→ Tqsort (n) ∈ Θ(n2 )


Escolha do pivô

Extremidade do vetor: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana de k amostras: Θ(k 2 ) −→ Tqsort (n) ∈ Θ(n2 )

Aleatório: Θ(1)
Escolha do pivô

Extremidade do vetor: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana de k amostras: Θ(k 2 ) −→ Tqsort (n) ∈ Θ(n2 )

Aleatório: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )


Escolha do pivô

Extremidade do vetor: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana de k amostras: Θ(k 2 ) −→ Tqsort (n) ∈ Θ(n2 )

Aleatório: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana: Θ(n)
Escolha do pivô

Extremidade do vetor: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana de k amostras: Θ(k 2 ) −→ Tqsort (n) ∈ Θ(n2 )

Aleatório: Θ(1) −→ Tqsort (n) ∈ Θ(n2 )

Mediana: Θ(n) −→ Tqsort (n) ∈ Θ(n log n)


Busca em árvore binária

Algoritmo 9 busca (nó n, chave e)


if null(n) or n.elem = e then
return n
end if
if e < n.elem then
return busca(n.left, e)
else
return busca(n.right, e)
end if
Busca em árvore binária

(
2, caso base,
T (n) = (12)
T (n/2) + 3, c.c.
Iteração

T (n) = T ( n2 ) + 3
Iteração

T (n) = T ( n2 ) + 3

T (n) = (T ( n4 ) + 3) + 3 = T ( n4 ) + 6
Iteração

T (n) = T ( n2 ) + 3

T (n) = (T ( n4 ) + 3) + 3 = T ( n4 ) + 6

T (n) = (T ( n8 ) + 3) + 6 = T ( n8 ) + 9
Iteração

T (n) = T ( n2 ) + 3

T (n) = (T ( n4 ) + 3) + 3 = T ( n4 ) + 6

T (n) = (T ( n8 ) + 3) + 6 = T ( n8 ) + 9

T (n) = T ( 2nk ) + 3k
Iteração

T (n) = T ( n2 ) + 3

T (n) = (T ( n4 ) + 3) + 3 = T ( n4 ) + 6

T (n) = (T ( n8 ) + 3) + 6 = T ( n8 ) + 9

T (n) = T ( 2nk ) + 3k

Fazendo k = log2 n:
Iteração

T (n) = T ( n2 ) + 3

T (n) = (T ( n4 ) + 3) + 3 = T ( n4 ) + 6

T (n) = (T ( n8 ) + 3) + 6 = T ( n8 ) + 9

T (n) = T ( 2nk ) + 3k

Fazendo k = log2 n:

T (n) = T ( 2logn2 n ) + 3log2 n = T (1) + 3log2 n


Iteração

T (n) = T ( n2 ) + 3

T (n) = (T ( n4 ) + 3) + 3 = T ( n4 ) + 6

T (n) = (T ( n8 ) + 3) + 6 = T ( n8 ) + 9

T (n) = T ( 2nk ) + 3k

Fazendo k = log2 n:

T (n) = T ( 2logn2 n ) + 3log2 n = T (1) + 3log2 n

T (n) = 2 + 3log2 n −→ T (n) ∈ Θ(log n)


Generalizando o método da iteração

Merge sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)


Generalizando o método da iteração

Merge sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

Quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)


Generalizando o método da iteração

Merge sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

Quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)


Busca binária
Algoritmo 10 busca (vetor v, chave e, ı́ndices hleft, righti)
n ← right - left
if n < 2 then
return v[left] = e
else
if busca(v, left, left + bn/2c) then
return true
else
return busca(v, left + bn/2c, right)
end if
end if
Busca binária

(
3, n<2
T (n) = (13)
2T (n/2) + 4, n≥2
Iteração

T (n) = 2T ( n2 ) + 4
Iteração

T (n) = 2T ( n2 ) + 4

T (n) = 2(2T ( n4 ) + 4) + 4 = 4T ( n4 ) + 12
Iteração

T (n) = 2T ( n2 ) + 4

T (n) = 2(2T ( n4 ) + 4) + 4 = 4T ( n4 ) + 12

T (n) = 4(2T ( n8 ) + 4) + 12 = 8T ( n8 ) + 28
Iteração

T (n) = 2T ( n2 ) + 4

T (n) = 2(2T ( n4 ) + 4) + 4 = 4T ( n4 ) + 12

T (n) = 4(2T ( n8 ) + 4) + 12 = 8T ( n8 ) + 28

T (n) = 2k T ( 2nk ) + 4 (2k − 1)


Iteração

T (n) = 2T ( n2 ) + 4

T (n) = 2(2T ( n4 ) + 4) + 4 = 4T ( n4 ) + 12

T (n) = 4(2T ( n8 ) + 4) + 12 = 8T ( n8 ) + 28

T (n) = 2k T ( 2nk ) + 4 (2k − 1)

Fazendo k = log2 n:
Iteração

T (n) = 2T ( n2 ) + 4

T (n) = 2(2T ( n4 ) + 4) + 4 = 4T ( n4 ) + 12

T (n) = 4(2T ( n8 ) + 4) + 12 = 8T ( n8 ) + 28

T (n) = 2k T ( 2nk ) + 4 (2k − 1)

Fazendo k = log2 n:

T (n) = 2log2 n T ( 2logn2 n ) + 4(2log2 n − 1) = nT (1) + 4(n − 1)


Iteração

T (n) = 2T ( n2 ) + 4

T (n) = 2(2T ( n4 ) + 4) + 4 = 4T ( n4 ) + 12

T (n) = 4(2T ( n8 ) + 4) + 12 = 8T ( n8 ) + 28

T (n) = 2k T ( 2nk ) + 4 (2k − 1)

Fazendo k = log2 n:

T (n) = 2log2 n T ( 2logn2 n ) + 4(2log2 n − 1) = nT (1) + 4(n − 1)

T (n) = 2n + 4n − 4 = 6n − 4 −→ T (n) ∈ Θ(n)


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

Busca binária: T (n) = 2T ( n2 ) + 4 −→ T (n) ∈ Θ(n)


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

Busca binária: T (n) = 2T ( n2 ) + 4 −→ T (n) ∈ Θ(n)

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)


Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (14)
b
Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (14)
b

n
T (n) = 2T ( ) + n2 (15)
2
Iteração

T (n) = 2T ( n2 ) + n2
Iteração

T (n) = 2T ( n2 ) + n2
n2
T (n) = 2(2T ( n4 ) + ( n2 )2 ) + n2 = 4T ( n4 ) + n2 + 4
Iteração

T (n) = 2T ( n2 ) + n2
n2
T (n) = 2(2T ( n4 ) + ( n2 )2 ) + n2 = 4T ( n4 ) + n2 + 4
n2 n2 n2
T (n) = 4(2T ( n8 ) + ( n4 )2 ) + n2 + 4 = 8T ( n8 ) + n2 + 4 + 16
Iteração

T (n) = 2T ( n2 ) + n2
n2
T (n) = 2(2T ( n4 ) + ( n2 )2 ) + n2 = 4T ( n4 ) + n2 + 4
n2 n2 n2
T (n) = 4(2T ( n8 ) + ( n4 )2 ) + n2 + 4 = 8T ( n8 ) + n2 + 4 + 16

k
X 2k
T (n) = 2k T ( 2nk ) + n2
4k
i=0
Iteração

T (n) = 2T ( n2 ) + n2
n2
T (n) = 2(2T ( n4 ) + ( n2 )2 ) + n2 = 4T ( n4 ) + n2 + 4
n2 n2 n2
T (n) = 4(2T ( n8 ) + ( n4 )2 ) + n2 + 4 = 8T ( n8 ) + n2 + 4 + 16

k
X 2k
T (n) = 2k T ( 2nk ) + n2
4k
i=0
k
X 1
T (n) = 2k T ( 2nk ) + n2 ( )k
2
i=0
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
a2 an
a1 = an−1 =q
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
a2 an
a1 = an−1 =q
k
X
Sm = ai
i=0
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
a2 an
a1 = an−1 =q
k
X
Sm = ai
i=0
a1 (q k+1 −1)
Sm = q−1
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
a2 an
a1 = an−1 =q
k
X
Sm = ai
i=0
a1 (q k+1 −1)
Sm = q−1

k
X 1 1
T (n) = 2k T ( 2nk ) + n2 ( )k −→ a1 = 1, q =
2 2
i=0
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
a2 an
a1 = an−1 =q
k
X
Sm = ai
i=0
a1 (q k+1 −1)
Sm = q−1

k
X 1 1
T (n) = 2k T ( 2nk ) + n2 ( )k −→ a1 = 1, q =
2 2
i=0
Relembrando P.G.:

A = {a1 , a2 , . . . , an−1 , an }
a2 an
a1 = an−1 =q
k
X
Sm = ai
i=0
a1 (q k+1 −1)
Sm = q−1

k
X 1 1
T (n) = 2k T ( 2nk ) + n2 ( )k −→ a1 = 1, q =
2 2
i=0
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
T (n) = 2k T ( 2nk ) − 2n2 ( 12 − 1)
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
T (n) = 2k T ( 2nk ) − 2n2 ( 12 − 1)
n2
T (n) = 2k T ( 2nk ) − 2k
+ 2n2
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
T (n) = 2k T ( 2nk ) − 2n2 ( 12 − 1)
n2
T (n) = 2k T ( 2nk ) − 2k
+ 2n2

Fazendo k = log2 n:
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
T (n) = 2k T ( 2nk ) − 2n2 ( 12 − 1)
n2
T (n) = 2k T ( 2nk ) − 2k
+ 2n2

Fazendo k = log2 n:
n2
T (n) = 2log2 n T ( 2logn2 n ) − 2log2 n
+ 2n2
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
T (n) = 2k T ( 2nk ) − 2n2 ( 12 − 1)
n2
T (n) = 2k T ( 2nk ) − 2k
+ 2n2

Fazendo k = log2 n:
n2
T (n) = 2log2 n T ( 2logn2 n ) − 2log2 n
+ 2n2
n2
T (n) = nT ( nn ) − n + 2n2
k+1
( 12 −1)
T (n) = 2k T ( 2nk ) + n2 1
−1
2
1 k+1
2 (2 −1)
T (n) = 2k T ( 2nk ) − n 1
2
k+1
T (n) = 2k T ( 2nk ) − 2n2 ( 12 − 1)
n2
T (n) = 2k T ( 2nk ) − 2k
+ 2n2

Fazendo k = log2 n:
n2
T (n) = 2log2 n T ( 2logn2 n ) − 2log2 n
+ 2n2
n2
T (n) = nT ( nn ) − n + 2n2

T (n) = nT (1) − n + 2n2 −→ T (n) ∈ Θ(n2 )


Generalizando o método da iteração

T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

T (n) = 2T ( n2 ) + 2

T (n) = 2T ( n2 ) + n

T (n) = 2T ( n2 ) + n2
Generalizando o método da iteração

T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

T (n) = 2T ( n2 ) + 2 −→ T (n) ∈ Θ(n)

T (n) = 2T ( n2 ) + n

T (n) = 2T ( n2 ) + n2
Generalizando o método da iteração

T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

T (n) = 2T ( n2 ) + 2 −→ T (n) ∈ Θ(n)

T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

T (n) = 2T ( n2 ) + n2
Generalizando o método da iteração

T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

T (n) = 2T ( n2 ) + 2 −→ T (n) ∈ Θ(n)

T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

T (n) = 2T ( n2 ) + n2 −→ T (n) ∈ Θ(n2 )


Generalizando o método da iteração

Algoritmo 11 mmult (matrizes hA, Bi, ordem n)


if n = 1 then
return A · B
else
C11 = mmult(A11 , B11 , n/2) + mmult(A12 , B21 , n/2)
C12 = mmult(A11 , B12 , n/2) + mmult(A12 , B22 , n/2)
C21 = mmult(A21 , B11 , n/2) + mmult(A22 , B21 , n/2)
C22 = mmult(A21 , B12 , n/2) + mmult(A22 , B22 , n/2)
return C
end if
Generalizando o método da iteração

Caso base: 2
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Recursão: 8T ( n2 )
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Recursão: 8T ( n2 )
Adição: 4( n2 )2 = n2
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Recursão: 8T ( n2 )
Adição: 4( n2 )2 = n2
Demais operações: 2
Generalizando o método da iteração

(
2, n=1
T (n) = (16)
8T (n/2) + n2 + 2, n≥2
Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (17)
b
Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (17)
b

n
T (n) = 8T ( ) + n2 (18)
2
Iteração

T (n) = 8T ( n2 ) + n2
Iteração

T (n) = 8T ( n2 ) + n2
8n2
T (n) = 8(8T ( n4 ) + ( n2 )2 ) + n2 = 64T ( n4 ) + n2 + 4
Iteração

T (n) = 8T ( n2 ) + n2
8n2
T (n) = 8(8T ( n4 ) + ( n2 )2 ) + n2 = 64T ( n4 ) + n2 + 4
8n2
T (n) = 64(2T ( n8 ) + ( n4 )2 ) + n2 + 4 =
8n2 64n2
512T ( n8 ) + n2 + 4 + 16
Iteração

T (n) = 8T ( n2 ) + n2
8n2
T (n) = 8(8T ( n4 ) + ( n2 )2 ) + n2 = 64T ( n4 ) + n2 + 4
8n2
T (n) = 64(2T ( n8 ) + ( n4 )2 ) + n2 + 4 =
8n2 64n2
512T ( n8 ) + n2 + 4 + 16

k
X 8k
T (n) = 8k T ( 2nk ) + n2
4k
i=0
Iteração

T (n) = 8T ( n2 ) + n2
8n2
T (n) = 8(8T ( n4 ) + ( n2 )2 ) + n2 = 64T ( n4 ) + n2 + 4
8n2
T (n) = 64(2T ( n8 ) + ( n4 )2 ) + n2 + 4 =
8n2 64n2
512T ( n8 ) + n2 + 4 + 16

k
X 8k
T (n) = 8k T ( 2nk ) + n2
4k
i=0
k
X
T (n) = 8k T ( 2nk ) + n2 2k
i=0
k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k+1
T (n) = 8k T ( 2nk ) + n2 (2 2−1−1)
k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k+1
T (n) = 8k T ( 2nk ) + n2 (2 2−1−1)

T (n) = 8k T ( 2nk ) + n2 (2k · 2 − 1)


k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k+1
T (n) = 8k T ( 2nk ) + n2 (2 2−1−1)

T (n) = 8k T ( 2nk ) + n2 (2k · 2 − 1)

T (n) = 8k T ( 2nk ) + n2 · 2k · 2 − n2
k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k+1
T (n) = 8k T ( 2nk ) + n2 (2 2−1−1)

T (n) = 8k T ( 2nk ) + n2 (2k · 2 − 1)

T (n) = 8k T ( 2nk ) + n2 · 2k · 2 − n2

Fazendo k = log2 n:
k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k+1
T (n) = 8k T ( 2nk ) + n2 (2 2−1−1)

T (n) = 8k T ( 2nk ) + n2 (2k · 2 − 1)

T (n) = 8k T ( 2nk ) + n2 · 2k · 2 − n2

Fazendo k = log2 n:

T (n) = 8log2 n T ( 2logn2 n ) + n2 · 2log2 n · 2 − n2


k
X
T (n) = 8k T ( 2nk ) + n2 2k −→ a1 = 1, q = 2
i=0
k+1
T (n) = 8k T ( 2nk ) + n2 (2 2−1−1)

T (n) = 8k T ( 2nk ) + n2 (2k · 2 − 1)

T (n) = 8k T ( 2nk ) + n2 · 2k · 2 − n2

Fazendo k = log2 n:

T (n) = 8log2 n T ( 2logn2 n ) + n2 · 2log2 n · 2 − n2

T (n) = 8log2 n T ( nn ) + 2n3 − n2


Relembrando logaritmos e exponenciação:

x = y logy x , ,
Relembrando logaritmos e exponenciação:

x = y logy x , (x w )z = x w ·z ,
Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z
Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

T (n) = 8log2 n T (1) + 2n3 − n2


Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

T (n) = 8log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 )log2 n T (1) + 2n3 − n2


Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

T (n) = 8log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 )log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 log2 n )T (1) + 2n3 − n2


Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

T (n) = 8log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 )log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 log2 n )T (1) + 2n3 − n2


log2 8
T (n) = (2log2 n )T (1) + 2n3 − n2
Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

T (n) = 8log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 )log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 log2 n )T (1) + 2n3 − n2


log2 8
T (n) = (2log2 n )T (1) + 2n3 − n2

T (n) = nlog2 8 T (1) + 2n3 − n2


Relembrando logaritmos e exponenciação:
w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

T (n) = 8log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 )log2 n T (1) + 2n3 − n2

T (n) = (2log2 8 log2 n )T (1) + 2n3 − n2


log2 8
T (n) = (2log2 n )T (1) + 2n3 − n2

T (n) = nlog2 8 T (1) + 2n3 − n2

T (n) = n3 T (1) + 2n3 − n2


Caso geral

T (n) = aT ( bn ) + nd
Caso geral

T (n) = aT ( bn ) + nd
and
T (n) = a(aT ( bn2 ) + ( bn )d ) + nd = a2 T ( bn2 ) + nd + bd
Caso geral

T (n) = aT ( bn ) + nd
and
T (n) = a(aT ( bn2 ) + ( bn )d ) + nd = a2 T ( bn2 ) + nd + bd
and
T (n) = a2 (aT ( bn3 ) + ( bn2 )d ) + nd + bd
=
and a2 n d
a3 T ( bn3 ) + nd + bd
+ b 2d
Caso geral

T (n) = aT ( bn ) + nd
and
T (n) = a(aT ( bn2 ) + ( bn )d ) + nd = a2 T ( bn2 ) + nd + bd
and
T (n) = a2 (aT ( bn3 ) + ( bn2 )d ) + nd + bd
=
and a2 n d
a3 T ( bn3 ) + nd + bd
+ b 2d

k
X ak d
T (n) = ak T ( bnk ) + n
b k·d
i=0
Caso geral

T (n) = aT ( bn ) + nd
and
T (n) = a(aT ( bn2 ) + ( bn )d ) + nd = a2 T ( bn2 ) + nd + bd
and
T (n) = a2 (aT ( bn3 ) + ( bn2 )d ) + nd + bd
=
and a2 n d
a3 T ( bn3 ) + nd + bd
+ b 2d

k
X ak d
T (n) = ak T ( bnk ) + n
b k·d
i=0
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
Desenvolvendo o lado esquerdo, com k = logb n:
Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)


Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)

Relembrando logaritmos e exponenciação:


Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)

Relembrando logaritmos e exponenciação:

x = y logy x , ,
Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)

Relembrando logaritmos e exponenciação:

x = y logy x , (x w )z = x w ·z ,
Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)

Relembrando logaritmos e exponenciação:


w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z
Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)

Relembrando logaritmos e exponenciação:


w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

alogb n T (1) = (b logb a )logb n T (1) = b logb a logb n T (1)


Desenvolvendo o lado esquerdo, com k = logb n:

ak T ( bnk ) = alogb n T ( blognb n ) = alogb n T (1)

Relembrando logaritmos e exponenciação:


w
x = y logy x , (x w )z = x w ·z , x wlogy z = x logy z

alogb n T (1) = (b logb a )logb n T (1) = b logb a logb n T (1)

= (b logb n )logb a T (1) = nlogb a T (1)


Caso geral
Caso geral
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
Caso geral
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
k
X a k
T (n) = nlogb a T (1) + nd ( )
bd
i=0
Caso geral
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
k
X a k
T (n) = nlogb a T (1) + nd ( )
bd
i=0
Análise depende de a
bd
(ou logdb a )
Caso geral
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
k
X a k
T (n) = nlogb a T (1) + nd ( )
bd
i=0
Análise depende de a
bd
(ou logdb a )
a = b d : série constante → crescimento regular
Caso geral
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
k
X a k
T (n) = nlogb a T (1) + nd ( )
bd
i=0
Análise depende de a
bd
(ou logdb a )
a = b d : série constante → crescimento regular
a > b d : série crescente → folhas dominam o custo
computacional
Caso geral
k
X a
T (n) = ak T ( bnk ) + nd ( d )k
b
i=0
k
X a k
T (n) = nlogb a T (1) + nd ( )
bd
i=0
Análise depende de a
bd
(ou logdb a )
a = b d : série constante → crescimento regular
a > b d : série crescente → folhas dominam o custo
computacional
a < b d : série decrescente → raiz domina o custo
computacional
Desenvolvendo o lado direito para a = b d
Desenvolvendo o lado direito para a = b d
k k
X a X
nd ( d )k = n d 1k = nd · (k + 1) = knd + nd
b
i=0 i=0
Desenvolvendo o lado direito para a = b d
k k
X a X
nd ( d )k = n d 1k = nd · (k + 1) = knd + nd
b
i=0 i=0
Fazendo k = logb n, temos nd logb n + nd
Desenvolvendo o lado direito para a = b d
k k
X a X
nd ( d )k = n d 1k = nd · (k + 1) = knd + nd
b
i=0 i=0
Fazendo k = logb n, temos nd logb n + nd
k
X a
T (n) = n logb a T (1) + n d ( d )k
b
i=0
Desenvolvendo o lado direito para a = b d
k k
X a X
nd ( d )k = n d 1k = nd · (k + 1) = knd + nd
b
i=0 i=0
Fazendo k = logb n, temos nd logb n + nd
k
X a
T (n) = n logb a T (1) + n d ( d )k
b
i=0
T (n) = nlogb a T (1) + d
n logb n + nd
Desenvolvendo o lado direito para a = b d
k k
X a X
nd ( d )k = n d 1k = nd · (k + 1) = knd + nd
b
i=0 i=0
Fazendo k = logb n, temos nd logb n + nd
k
X a
T (n) = n logb a T (1) + n d ( d )k
b
i=0
T (n) = nlogb a T (1) + d
n logb n + nd −→ T (n) ∈ nd logb n
Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (19)
b
Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (19)
b

d se a = b d
Θ(n log n),
 (ou logb a = d)
T (n) = (20)


Desenvolvendo o lado direito para a 6= b d :
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Relembrando logaritmos e exponenciação:
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Relembrando logaritmos e exponenciação:

x = y logy x ,
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Relembrando logaritmos e exponenciação:
xy
x = y logy x , xz = x y −z
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Relembrando logaritmos e exponenciação:
xy
x = y logy x , xz = x y −z
k k k
X a k d
X b logb a k d
X
nd ( d) =n ( d ) =n (b logb a−d )k
b b
i=0 i=0 i=0
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Relembrando logaritmos e exponenciação:
xy
x = y logy x , xz = x y −z
k k k
X a k d
X b logb a k d
X
nd ( d) =n ( d ) =n (b logb a−d )k
b b
i=0 i=0 i=0
Fazendo x = logb a − d:
Desenvolvendo o lado direito para a 6= b d :
k
X a
nd ( d )k
b
i=0
Relembrando logaritmos e exponenciação:
xy
x = y logy x , xz = x y −z
k k k
X a k d
X b logb a k d
X
nd ( d) =n ( d ) =n (b logb a−d )k
b b
i=0 i=0 i=0
Fazendo x = logb a − d:
k
X
n d (b x )k
i=0
Fazendo x = logb a − d:
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1
= nd (b b)x −1−1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1
b x −1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 x·k·b x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 x·k·b x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x
nd
= nd (b b x −1 − b x −1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 ·b x·k x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x logb n )x ·b x
nd nd
= nd (b b x −1 − b x −1 = nd (b b x −1 − b x −1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 ·b x·k x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x logb n )x ·b x
nd nd
= nd (b b x −1 − b x −1 = nd (b b x −1 − b x −1
x x nd
= nd nbx ·b
−1 − b x −1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 ·b x·k x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x logb n )x ·b x
nd nd
= nd (b b x −1 − b x −1 = nd (b b x −1 − b x −1
x x nd nd+x ·b x nd
= nd nbx ·b
−1 − b x −1 = b x −1 − b x −1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 ·b x·k x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x logb n )x ·b x
nd nd
= nd (b b x −1 − b x −1 = nd (b b x −1 − b x −1
x x nd nd+x ·b x nd
= nd nbx ·b
−1 − b x −1 = b x −1 − b x −1

Como x = logb a − d:
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 ·b x·k x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x logb n )x ·b x
nd nd
= nd (b b x −1 − b x −1 = nd (b b x −1 − b x −1
x x nd nd+x ·b x nd
= nd nbx ·b
−1 − b x −1 = b x −1 − b x −1

Como x = logb a − d:
nd+logb a−d ·b x nd
= b x −1 − b x −1
Fazendo x = logb a − d:
Xk
nd (b x )k −→ a1 = 1, q = b x
i=0
x k+1 x k+1
= nd (b b)x −1−1 = nd (bbx )−1 − 1 ·b x·k x nd
b x −1 = nd bbx −1 − b x −1

Fazendo k = logb n:
x·logb n )·b x logb n )x ·b x
nd nd
= nd (b b x −1 − b x −1 = nd (b b x −1 − b x −1
x x nd nd+x ·b x nd
= nd nbx ·b
−1 − b x −1 = b x −1 − b x −1

Como x = logb a − d:
nd+logb a−d ·b x nd nlogb a ·b x nd
= b x −1 − b x −1 = b x −1 − b x −1
k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1
k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1

−→ b x constante positiva
k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1

−→ b x constante positiva

Caso a > b d (b x > 1):


k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1

−→ b x constante positiva

Caso a > b d (b x > 1):

T (n) ∈ Θ(nlogb a ):
k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1

−→ b x constante positiva

Caso a > b d (b x > 1):

T (n) ∈ Θ(nlogb a ):

Caso a < b d (0 < b x < 1):


k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1

−→ b x constante positiva

Caso a > b d (b x > 1):

T (n) ∈ Θ(nlogb a ):

Caso a < b d (0 < b x < 1):


b ·blog a x d
T (n) = nlogb a T (1)− n 1−b n
x + 1−b x
k
X a
T (n) = nlogb a T (1) + nd ( d )k
b
i=0
nlogb a ·b x nd
T (n) = nlogb a T (1) + b x −1 − b x −1

−→ b x constante positiva

Caso a > b d (b x > 1):

T (n) ∈ Θ(nlogb a ):

Caso a < b d (0 < b x < 1):


b ·blog a x d
T (n) = nlogb a T (1)− n 1−b n
x + 1−b x

T (n) ∈ Θ(nd )
Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (21)
b

d se a = b d
Θ(n log n),
 (ou logb a = d)
T (n) = (22)


Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (21)
b

d se a = b d
Θ(n log n),
 (ou logb a = d)
T (n) = Θ(nd ), se a < b d (ou logb a < d) (22)


Generalizando o método da iteração

n
T (n) = aT ( ) + cnd (21)
b

d se a = b d
Θ(n log n),
 (ou logb a = d)
T (n) = Θ(nd ), se a < b d (ou logb a < d) (22)

Θ(n logb a ), se a > b d (ou logb a > d)

Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3

a=1, b=2, d=0


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3

a=1, b=2, d=0 a = bd


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)

Busca binária: T (n) = 2T ( n2 ) + 2


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)

Busca binária: T (n) = 2T ( n2 ) + 2

a=2, b=2, d=0


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)

Busca binária: T (n) = 2T ( n2 ) + 2

a=2, b=2, d=0 a > bd


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)

Busca binária: T (n) = 2T ( n2 ) + 2

a=2, b=2, d=0 a > bd T (n) ∈ Θ(nlogb a )


Generalizando o método da iteração

Árvore binária: T (n) = T ( n2 ) + 3 −→ T (n) ∈ Θ(log n)

a=1, b=2, d=0 a = bd T (n) ∈ Θ(nd logn)

Busca binária: T (n) = 2T ( n2 ) + 2 −→ T (n) ∈ Θ(n)

a=2, b=2, d=0 a > bd T (n) ∈ Θ(nlogb a )


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n

a=2, b=2, d=1


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n

a=2, b=2, d=1 a = bd


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)

MMulti: T (n) = 8T ( n2 ) + n2
Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)

MMulti: T (n) = 8T ( n2 ) + n2

a=8, b=2, d=2


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)

MMulti: T (n) = 8T ( n2 ) + n2

a=8, b=2, d=2 a > bd


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)

MMulti: T (n) = 8T ( n2 ) + n2

a=8, b=2, d=2 a > bd T (n) ∈ Θ(nlogb a )


Generalizando o método da iteração

Merge/quick sort: T (n) = 2T ( n2 ) + n −→ T (n) ∈ Θ(n log n)

a=2, b=2, d=1 a = bd T (n) ∈ Θ(nd logn)

MMulti: T (n) = 8T ( n2 ) + n2 −→ T (n) ∈ Θ(n3 )

a=8, b=2, d=2 a > bd T (n) ∈ Θ(nlogb a )


Generalizando o método da iteração

Algoritmo 12 msum (matrizes hA, Bi, ordem n)


if n = 1 then
return A + B
else
C11 = msum(A11 , B11 , n/2)
C12 = msum(A12 , B12 , n/2)
C21 = msum(A21 , B21 , n/2)
C22 = msum(A22 , B22 , n/2)
return C
end if
Generalizando o método da iteração

Caso base: 2
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Recursão: 4T ( n2 )
Generalizando o método da iteração

Caso base: 2
Caso recursivo
Recursão: 4T ( n2 )
Demais operações: 2
Generalizando o método da iteração

(
2, n=1
T (n) = (23)
4T (n/2) + 2, n≥2
Generalizando o método da iteração

MSum: T (n) = 4T ( n2 ) + 2
Generalizando o método da iteração

MSum: T (n) = 4T ( n2 ) + 2

a=4, b=2, d=0


Generalizando o método da iteração

MSum: T (n) = 4T ( n2 ) + 2

a=4, b=2, d=0 a > bd


Generalizando o método da iteração

MSum: T (n) = 4T ( n2 ) + 2

a=4, b=2, d=0 a > bd T (n) ∈ Θ(nlogb a )


Generalizando o método da iteração

MSum: T (n) = 4T ( n2 ) + 2 −→ T (n) ∈ Θ(n2 )

a=4, b=2, d=0 a > bd T (n) ∈ Θ(nlogb a )


Teorema central

n
T (n) = aT ( ) + f (n) (24)
b



T (n) =


(25)
Teorema central

n
T (n) = aT ( ) + f (n) (24)
b

logb a log k+1 n), se ∃k ∈ N, f (n) ∈ Θ(nlogb a log k n)
Θ(n

T (n) =


(25)
Teorema central

n
T (n) = aT ( ) + f (n) (24)
b

logb a log k+1 n), se ∃k ∈ N, f (n) ∈ Θ(nlogb a log k n)
Θ(n

T (n) = Θ(n logb a ), se f (n) ∈ O(nlogb a− )


(25)
Teorema central

n
T (n) = aT ( ) + f (n) (24)
b

logb a log k+1 n), se ∃k ∈ N, f (n) ∈ Θ(nlogb a log k n)
Θ(n

T (n) = Θ(n logb a ), se f (n) ∈ O(nlogb a− )

Θ(f (n)), se f (n) ∈ Ω(nlogb a+ )

(25)
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2,
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2, nlogb a = n0 ,
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2, nlogb a = n0 , f (n) = 3
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2, nlogb a = n0 , f (n) = 3
nlogb a ∈ Θ(1),
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2, nlogb a = n0 , f (n) = 3
nlogb a ∈ Θ(1), f (n) ∈ Θ(1)
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2, nlogb a = n0 , f (n) = 3
nlogb a ∈ Θ(1), f (n) ∈ Θ(1)
Crescimento equivalente: f (n) ∈ Θ(nlogb a log k n), k=0
Teorema central

Árvore binária: T (n) = T ( n2 ) + 3


a = 1, b = 2, nlogb a = n0 , f (n) = 3
nlogb a ∈ Θ(1), f (n) ∈ Θ(1)
Crescimento equivalente: f (n) ∈ Θ(nlogb a log k n), k=0
T (n) ∈ Θ(nlogb a log k+1 n) −→ T (n) ∈ Θ(log n)
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2,
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2, nlogb a = n1 ,
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2, nlogb a = n1 , f (n) = 2
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2, nlogb a = n1 , f (n) = 2
nlogb a ∈ Θ(n),
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2, nlogb a = n1 , f (n) = 2
nlogb a ∈ Θ(n), f (n) ∈ Θ(1)
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2, nlogb a = n1 , f (n) = 2
nlogb a ∈ Θ(n), f (n) ∈ Θ(1)
f(n) é dominado: f (n) ∈ O(nlogb (a−) )
Teorema central

Busca binária: T (n) = 2T ( n2 ) + 2


a = 2, b = 2, nlogb a = n1 , f (n) = 2
nlogb a ∈ Θ(n), f (n) ∈ Θ(1)
f(n) é dominado: f (n) ∈ O(nlogb (a−) )
T (n) ∈ Θ(nlogb a ) −→ T (n) ∈ Θ(n)
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2,
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2, nlogb a = n1 ,
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2, nlogb a = n1 , f (n) = n
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2, nlogb a = n1 , f (n) = n
nlogb a ∈ Θ(n),
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2, nlogb a = n1 , f (n) = n
nlogb a ∈ Θ(n), f (n) ∈ Θ(n)
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2, nlogb a = n1 , f (n) = n
nlogb a ∈ Θ(n), f (n) ∈ Θ(n)
Crescimento equivalente: f (n) ∈ Θ(nlogb a log k n), k=0
Teorema central

Merge/quick sort: T (n) = 2T ( n2 ) + n


a = 2, b = 2, nlogb a = n1 , f (n) = n
nlogb a ∈ Θ(n), f (n) ∈ Θ(n)
Crescimento equivalente: f (n) ∈ Θ(nlogb a log k n), k=0
T (n) ∈ Θ(nlogb a log k+1 n) −→ T (n) ∈ Θ(n log n)
Teorema central

MSum: T (n) = 4T ( n2 )
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2,
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2, nlogb a = n2 ,
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2, nlogb a = n2 , f (n) = 0
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2, nlogb a = n2 , f (n) = 0
nlogb a ∈ Θ(n2 ),
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2, nlogb a = n2 , f (n) = 0
nlogb a ∈ Θ(n2 ), f (n) ∈ Θ(1)
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2, nlogb a = n2 , f (n) = 0
nlogb a ∈ Θ(n2 ), f (n) ∈ Θ(1)
f(n) é dominado: f (n) ∈ O(nlogb (a−) )
Teorema central

MSum: T (n) = 4T ( n2 )
a = 4, b = 2, nlogb a = n2 , f (n) = 0
nlogb a ∈ Θ(n2 ), f (n) ∈ Θ(1)
f(n) é dominado: f (n) ∈ O(nlogb (a−) )
T (n) ∈ Θ(nlogb a ) −→ T (n) ∈ Θ(n2 )
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2,
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2, nlogb a = n3 ,
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2, nlogb a = n3 , f (n) = n2
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2, nlogb a = n3 , f (n) = n2
nlogb a ∈ Θ(n3 ),
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2, nlogb a = n3 , f (n) = n2
nlogb a ∈ Θ(n3 ), f (n) ∈ Θ(n2 )
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2, nlogb a = n3 , f (n) = n2
nlogb a ∈ Θ(n3 ), f (n) ∈ Θ(n2 )
f(n) é dominado: f (n) ∈ O(nlogb (a−) )
Teorema central

MMulti: T (n) = 8T ( n2 ) + n2
a = 8, b = 2, nlogb a = n3 , f (n) = n2
nlogb a ∈ Θ(n3 ), f (n) ∈ Θ(n2 )
f(n) é dominado: f (n) ∈ O(nlogb (a−) )
T (n) ∈ Θ(nlogb a ) −→ T (n) ∈ Θ(n3 )
T (n) = 2T ( n2 ) + n log n

k = 1:
T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n)


T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)


T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) )


T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)


T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


2f ( n2 ) ≤ (1 − δ) f (n)
T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


2f ( n2 ) ≤ (1 − δ) f (n)
2( n2 log ( n2 )) ≤ (1 − δ) n log n
T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


2f ( n2 ) ≤ (1 − δ) f (n)
2( n2 log ( n2 )) ≤ (1 − δ) n log n
n (log n − log 2) ≤ (1 − δ) n log n
T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


2f ( n2 ) ≤ (1 − δ) f (n)
2( n2 log ( n2 )) ≤ (1 − δ) n log n
n (log n − log 2) ≤ (1 − δ) n log n
log n − 1 ≤ log n − δ log n
T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


2f ( n2 ) ≤ (1 − δ) f (n)
2( n2 log ( n2 )) ≤ (1 − δ) n log n
n (log n − log 2) ≤ (1 − δ) n log n
log n − 1 ≤ log n − δ log n

−1 ≤ −δ log n
T (n) = 2T ( n2 ) + n log n

k = 1: n log n ∈ Θ(nlog2 2 log n) −→ T (n) ∈ Θ(n log 2 n)

n log n ∈ Ω(nlog2 (2+) ) −→ T (n) ∈ Θ(n log n)

Condição de regularidade (caso 3): af ( bn ) ≤ (1 − δ) f (n)


2f ( n2 ) ≤ (1 − δ) f (n)
2( n2 log ( n2 )) ≤ (1 − δ) n log n
n (log n − log 2) ≤ (1 − δ) n log n
log n − 1 ≤ log n − δ log n

−1 ≤ −δ log n −→ δ log n ≤ 1
Condição de regularidade
12
10
8

δ = 0.1
6

δ = 0.9
4
2
0

0 2000 4000 6000 8000 10000

n
Recorrências

Algoritmo 13 fibonacci (inteiro i)


Require: inteiro i
if (i = 0) ou (i = 1) then
return 1
else
return fibonacci(i − 1) + fibonacci(i − 2)
end if

Вам также может понравиться