(ACH2002) Introdução à Análise de Algoritmos - Aula 09
1. Aula 09 – An´alise Assint´otica de
Algoritmos Iterativos e Recursivos
Norton Trevisan Roman
norton@usp.br
18 de setembro de 2018
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 1 / 34
2. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 2 / 34
3. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
n2
+ 2n − 3
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 2 / 34
4. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
n2
+ 2n − 3
Contamos realmente
todas as opera¸c˜oes?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 2 / 34
5. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
n2
+ 2n − 3
Contamos realmente
todas as opera¸c˜oes?
N˜ao. Apenas as que
consideramos
relevantes
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 2 / 34
6. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
O que acontece se
incluirmos as demais
opera¸c˜oes?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 3 / 34
7. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
O que acontece se
incluirmos as demais
opera¸c˜oes?
Adicionamos
3(n − 1) opera¸c˜oes
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 3 / 34
8. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
O que acontece se
incluirmos as demais
opera¸c˜oes?
Adicionamos
3(n − 1) opera¸c˜oes
Mais 2
n(n − 1)
2
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 3 / 34
9. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) { 3(n − 1)
int aux = v[i]; n − 1
int j = i; n − 1
while ((j > 0) &&
(aux < v[j-1])) { 2n(n−1)
2
v[j] = v[j-1]; n(n−1)
2
j--; n(n−1)
2
}
v[j] = aux; n − 1
}
}
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 4 / 34
10. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ou seja:
6(n − 1) + 2n(n − 1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 5 / 34
11. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ou seja:
6(n − 1) + 2n(n − 1)
= 6n − 6 + 2n2
− 2n
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 5 / 34
12. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ou seja:
6(n − 1) + 2n(n − 1)
= 6n − 6 + 2n2
− 2n
= 2n2
+ 4n − 6
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 5 / 34
13. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Comparemos as 2
vers˜oes:
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 6 / 34
14. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Comparemos as 2
vers˜oes:
v1 : n2
+ 2n − 3
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 6 / 34
15. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Comparemos as 2
vers˜oes:
v1 : n2
+ 2n − 3
v2 : 2n2
+ 4n − 6
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 6 / 34
16. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Comparemos as 2
vers˜oes:
v1 : n2
+ 2n − 3
v2 : 2n2
+ 4n − 6
Ou seja v2 = 2v1
Diferem apenas por
uma constante
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 6 / 34
17. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E isso importa?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 7 / 34
18. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E isso importa?
Se o objetivo for fazer
uma estimativa mais
precisa, com certeza!
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 7 / 34
19. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E isso importa?
Se o objetivo for fazer
uma estimativa mais
precisa, com certeza!
Mas se o objetivo for
fazer uma an´alise
assint´otica do
algoritmo, certamente
n˜ao
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 7 / 34
20. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E isso porque as
duas contagens s˜ao
idˆenticas, a menos
de uma constante
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 8 / 34
21. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E isso porque as
duas contagens s˜ao
idˆenticas, a menos
de uma constante
Ent˜ao, qual seria a
complexidade desse
algoritmo?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 8 / 34
22. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Θ(n2
+ 2n − 3), ou
simplesmente
Θ(n2
+ n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 9 / 34
23. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Θ(n2
+ 2n − 3), ou
simplesmente
Θ(n2
+ n)
n2
+n ≤ n2
+2n −3 ≤
2n2
+ 2n, para n ≥ 3
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 9 / 34
24. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Θ(n2
+ 2n − 3), ou
simplesmente
Θ(n2
+ n)
n2
+n ≤ n2
+2n −3 ≤
2n2
+ 2n, para n ≥ 3
n2
+n ≤ 2n2
+4n−6 ≤
4n2
+ 4n, para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 9 / 34
25. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E por que Θ?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 10 / 34
26. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E por que Θ?
J´a temos o c´alculo
“exato” → temos
um limite assint´otico
firme
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 10 / 34
27. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
E por que Θ?
J´a temos o c´alculo
“exato” → temos
um limite assint´otico
firme
E precisamos mesmo
disso?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 10 / 34
28. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Suponha que nos
interessa apenas um
limite superior
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 11 / 34
29. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Suponha que nos
interessa apenas um
limite superior
Como isso nos ajuda
a calcular a
complexidade desse
algoritmo?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 11 / 34
30. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Temos um la¸co
proporcional `a
entrada: O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 12 / 34
31. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Temos um la¸co
proporcional `a
entrada: O(n)
Faz, no m´aximo, n
itera¸c˜oes
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 12 / 34
32. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Temos um la¸co
proporcional `a
entrada: O(n)
Faz, no m´aximo, n
itera¸c˜oes
E outro proporcional
`a entrada (O(n))
dentro deste
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 12 / 34
33. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao o algoritmo ´e
O(n)O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 13 / 34
34. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao o algoritmo ´e
O(n)O(n)
E, lembrando que
O(f (n))O(g(n)) =
O(f (n)g(n)), temos
que
O(n)O(n) = O(n2
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 13 / 34
35. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ou seja, uma
simples inspe¸c˜ao j´a
nos diz que o
algoritmo ´e O(n2
),
no pior caso
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 14 / 34
36. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ou seja, uma
simples inspe¸c˜ao j´a
nos diz que o
algoritmo ´e O(n2
),
no pior caso
Mas ele n˜ao era
Θ(n2
+ n)?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 14 / 34
37. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Sim, mas lembre que
Θ(n2
+ n) ⇒
O(n2
+ n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 15 / 34
38. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Sim, mas lembre que
Θ(n2
+ n) ⇒
O(n2
+ n)
E que
O(f (n) + g(n)) =
O(f (n)) + O(g(n))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 15 / 34
39. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao O(n2
+ n) =
O(n2
) + O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 16 / 34
40. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao O(n2
+ n) =
O(n2
) + O(n)
Mas O(f (n)) +
O(g(n)) =
O(max(f (n), g(n)))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 16 / 34
41. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao O(n2
+ n) =
O(max(n2
, n)) =
O(n2
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 17 / 34
42. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao O(n2
+ n) =
O(max(n2
, n)) =
O(n2
)
E assim
Θ(n2
+ n) ⇒ O(n2
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 17 / 34
43. An´alise de Algoritmos Iterativos
J´a calculamos o n´umero de opera¸c˜oes executadas
pelo algoritmo de ordena¸c˜ao por inser¸c˜ao
static void insercao(int[] v) {
for (int i=1; i<v.length; i++) {
int aux = v[i];
int j = i;
while ((j > 0) &&
(aux < v[j-1])) {
v[j] = v[j-1];
j--;
}
v[j] = aux;
}
}
Ent˜ao O(n2
+ n) =
O(max(n2
, n)) =
O(n2
)
E assim
Θ(n2
+ n) ⇒ O(n2
)
O limite s´o ficou
mais “frouxo”
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 17 / 34
44. An´alise de Algoritmos Iterativos
A n˜ao ser que haja chamadas a m´etodos ou algum
outro artif´ıcio que esconda opera¸c˜oes, calcular a
complexidade de algoritmos iterativos, usando a
nota¸c˜ao assint´otica, n˜ao ´e t˜ao dif´ıcil
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 18 / 34
45. An´alise de Algoritmos Iterativos
A n˜ao ser que haja chamadas a m´etodos ou algum
outro artif´ıcio que esconda opera¸c˜oes, calcular a
complexidade de algoritmos iterativos, usando a
nota¸c˜ao assint´otica, n˜ao ´e t˜ao dif´ıcil
Principalmente para o c´alculo de limite superior,
caso em que basta lembrar das opera¸c˜oes com a
nota¸c˜ao O. Em especial:
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 18 / 34
46. An´alise de Algoritmos Iterativos
A n˜ao ser que haja chamadas a m´etodos ou algum
outro artif´ıcio que esconda opera¸c˜oes, calcular a
complexidade de algoritmos iterativos, usando a
nota¸c˜ao assint´otica, n˜ao ´e t˜ao dif´ıcil
Principalmente para o c´alculo de limite superior,
caso em que basta lembrar das opera¸c˜oes com a
nota¸c˜ao O. Em especial:
O(f (n) + g(n)) = O(f (n)) + O(g(n))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 18 / 34
47. An´alise de Algoritmos Iterativos
A n˜ao ser que haja chamadas a m´etodos ou algum
outro artif´ıcio que esconda opera¸c˜oes, calcular a
complexidade de algoritmos iterativos, usando a
nota¸c˜ao assint´otica, n˜ao ´e t˜ao dif´ıcil
Principalmente para o c´alculo de limite superior,
caso em que basta lembrar das opera¸c˜oes com a
nota¸c˜ao O. Em especial:
O(f (n) + g(n)) = O(f (n)) + O(g(n))
O(f (n)) + O(g(n)) = O(max(f (n), g(n)))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 18 / 34
48. An´alise de Algoritmos Iterativos
A n˜ao ser que haja chamadas a m´etodos ou algum
outro artif´ıcio que esconda opera¸c˜oes, calcular a
complexidade de algoritmos iterativos, usando a
nota¸c˜ao assint´otica, n˜ao ´e t˜ao dif´ıcil
Principalmente para o c´alculo de limite superior,
caso em que basta lembrar das opera¸c˜oes com a
nota¸c˜ao O. Em especial:
O(f (n) + g(n)) = O(f (n)) + O(g(n))
O(f (n)) + O(g(n)) = O(max(f (n), g(n)))
O(f (n))O(g(n)) = O(f (n)g(n))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 18 / 34
49. An´alise de Algoritmos Recursivos
Mas e quando o algoritmo ´e recursivo?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 19 / 34
50. An´alise de Algoritmos Recursivos
Mas e quando o algoritmo ´e recursivo?
Teremos que observar a rela¸c˜ao de recorrˆencia
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 19 / 34
51. An´alise de Algoritmos Recursivos
Mas e quando o algoritmo ´e recursivo?
Teremos que observar a rela¸c˜ao de recorrˆencia
Exemplo: Busca Sequencial
Considere a
busca
sequencial
recursiva:
se n=1:
se A[0] ´e o elemento buscado: achou
sen~ao: n~ao est´a no arranjo
sen~ao:
se A[0] ´e o elemento buscado: achou
sen~ao:
busque nos n-1 elementos
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 19 / 34
52. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
Nesse caso:
T(n) =
O(1), se n = 1.
T(n − 1) + O(1), para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 20 / 34
53. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
Note que
O(1) engloba
qualquer custo
constante para
a opera¸c˜ao
Nesse caso:
T(n) =
O(1), se n = 1.
T(n − 1) + O(1), para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 20 / 34
54. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
Nesse caso:
T(n) =
O(1), se n = 1.
T(n − 1) + O(1), para n ≥ 2
E expandindo...
T(n) = T(n − 1) + O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 20 / 34
55. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
Nesse caso:
T(n) =
O(1), se n = 1.
T(n − 1) + O(1), para n ≥ 2
E expandindo...
T(n) = T(n − 1) + O(1)
= ((T(n − 2) + O(1)) + O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 20 / 34
56. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
= (((T(n − 3) + O(1)) + O(1)) + O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 21 / 34
57. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
= (((T(n − 3) + O(1)) + O(1)) + O(1)
= . . .
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 21 / 34
58. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
= (((T(n − 3) + O(1)) + O(1)) + O(1)
= . . .
= (. . . ((T(n − k) +O(1)) + . . . + O(1)) + O(1)
k vezes
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 21 / 34
59. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
= (((T(n − 3) + O(1)) + O(1)) + O(1)
= . . .
= (. . . ((T(n − k) +O(1)) + . . . + O(1)) + O(1)
k vezes
= T(1) + kO(1), quando T(n − k) = T(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 21 / 34
60. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
= (((T(n − 3) + O(1)) + O(1)) + O(1)
= . . .
= (. . . ((T(n − k) +O(1)) + . . . + O(1)) + O(1)
k vezes
= T(1) + kO(1), quando T(n − k) = T(1)
= T(1) + (n − 1)O(1) (pois n − k = 1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 21 / 34
61. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
= (((T(n − 3) + O(1)) + O(1)) + O(1)
= . . .
= (. . . ((T(n − k) +O(1)) + . . . + O(1)) + O(1)
k vezes
= T(1) + kO(1), quando T(n − k) = T(1)
= T(1) + (n − 1)O(1) (pois n − k = 1)
= O(1) + (n − 1)O(1) (pois T(1) = O(1))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 21 / 34
62. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
T(n) = O(1) + (n − 1)O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
63. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
64. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
= O(1) + nO(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
65. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
= O(1) + nO(1)
= O(1) + O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
66. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
= O(1) + nO(1)
= O(1) + O(n)
= O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
67. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
?
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
= O(1) + nO(1)
= O(1) + O(n)
= O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
68. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
?
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
= O(1) + nO(1)
= O(1) + O(n)
= O(n)
Por que O(1) − O(1) = O(1)?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
69. An´alise de Algoritmos Recursivos
Exemplo: Busca Sequencial
?
T(n) = O(1) + (n − 1)O(1)
= O(1) + nO(1) − O(1)
= O(1) + nO(1)
= O(1) + O(n)
= O(n)
Por que O(1) − O(1) = O(1)?
Porque f (n) ∈ O(1) ⇒ f (n) ≤ c × 1, e n˜ao necessariamente
as constantes c s˜ao iguais
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 22 / 34
70. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Considere agora
o problema das
Torres de Hanoi:
se n=1:
mova o disco do pino de origem para
o de destino
sen~ao:
Mova n-1 discos do pino de origem
para o auxiliar
Mova um disco do pino de origem para
o de destino
Mova n-1 discos do pino auxiliar
para o de destino
T(n) =
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 23 / 34
71. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Considere agora
o problema das
Torres de Hanoi:
se n=1:
mova o disco do pino de origem para
o de destino
sen~ao:
Mova n-1 discos do pino de origem
para o auxiliar
Mova um disco do pino de origem para
o de destino
Mova n-1 discos do pino auxiliar
para o de destino
T(n) =
O(1), se n = 1.
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 23 / 34
72. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Considere agora
o problema das
Torres de Hanoi:
se n=1:
mova o disco do pino de origem para
o de destino
sen~ao:
Mova n-1 discos do pino de origem
para o auxiliar
Mova um disco do pino de origem para
o de destino
Mova n-1 discos do pino auxiliar
para o de destino
T(n) =
O(1), se n = 1.
T(n − 1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 23 / 34
73. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Considere agora
o problema das
Torres de Hanoi:
se n=1:
mova o disco do pino de origem para
o de destino
sen~ao:
Mova n-1 discos do pino de origem
para o auxiliar
Mova um disco do pino de origem para
o de destino
Mova n-1 discos do pino auxiliar
para o de destino
T(n) =
O(1), se n = 1.
T(n − 1) + O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 23 / 34
74. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Considere agora
o problema das
Torres de Hanoi:
se n=1:
mova o disco do pino de origem para
o de destino
sen~ao:
Mova n-1 discos do pino de origem
para o auxiliar
Mova um disco do pino de origem para
o de destino
Mova n-1 discos do pino auxiliar
para o de destino
T(n) =
O(1), se n = 1.
T(n − 1) + O(1) + T(n − 1) para n ≥ 2
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 23 / 34
75. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
76. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
= 2(2T(n − 2) + O(1)) + O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
77. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
= 2(2T(n − 2) + O(1)) + O(1)
4T(n − 2) + 3O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
78. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
= 2(2T(n − 2) + O(1)) + O(1)
4T(n − 2) + 3O(1)
= 4(2T(n − 3) + O(1)) + 3O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
79. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
= 2(2T(n − 2) + O(1)) + O(1)
4T(n − 2) + 3O(1)
= 4(2T(n − 3) + O(1)) + 3O(1)
8T(n − 3) + 7O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
80. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
= 2(2T(n − 2) + O(1)) + O(1)
4T(n − 2) + 3O(1)
= 4(2T(n − 3) + O(1)) + 3O(1)
8T(n − 3) + 7O(1)
= . . .
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
81. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
T(n) = 2T(n − 1) + O(1)
= 2(2T(n − 2) + O(1)) + O(1)
4T(n − 2) + 3O(1)
= 4(2T(n − 3) + O(1)) + 3O(1)
8T(n − 3) + 7O(1)
= . . .
= 2k
T(n − k) + (2k
− 1)O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 24 / 34
82. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
83. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
= 2n−1
T(1) + (2n−1
− 1)O(1)(pois n − k = 1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
84. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
= 2n−1
T(1) + (2n−1
− 1)O(1)(pois n − k = 1)
= 2n−1
O(1) + (2n−1
− 1)O(1)(pois T(1) = O(1))
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
85. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
= 2n−1
T(1) + (2n−1
− 1)O(1)(pois n − k = 1)
= 2n−1
O(1) + (2n−1
− 1)O(1)(pois T(1) = O(1))
= 2 × 2n−1
O(1) − O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
86. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
= 2n−1
T(1) + (2n−1
− 1)O(1)(pois n − k = 1)
= 2n−1
O(1) + (2n−1
− 1)O(1)(pois T(1) = O(1))
= 2 × 2n−1
O(1) − O(1)
= 2n
O(1) − O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
87. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
= 2n−1
T(1) + (2n−1
− 1)O(1)(pois n − k = 1)
= 2n−1
O(1) + (2n−1
− 1)O(1)(pois T(1) = O(1))
= 2 × 2n−1
O(1) − O(1)
= 2n
O(1) − O(1)
= O(2n
) − O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
88. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
= 2k
T(1) + (2k
− 1)O(1)(quando T(n − k) = T(1))
= 2n−1
T(1) + (2n−1
− 1)O(1)(pois n − k = 1)
= 2n−1
O(1) + (2n−1
− 1)O(1)(pois T(1) = O(1))
= 2 × 2n−1
O(1) − O(1)
= 2n
O(1) − O(1)
= O(2n
) − O(1)
= O(2n
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 25 / 34
89. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
).
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
90. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
). E o que ´e n?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
91. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
). E o que ´e n?
n ´e o n´umero de discos → valor de entrada do algoritmo
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
92. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
). E o que ´e n?
n ´e o n´umero de discos → valor de entrada do algoritmo
Mas n˜ao hav´ıamos visto no in´ıcio que n era o
tamanho do problema? Como fica ent˜ao?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
93. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
). E o que ´e n?
n ´e o n´umero de discos → valor de entrada do algoritmo
Mas n˜ao hav´ıamos visto no in´ıcio que n era o
tamanho do problema? Como fica ent˜ao?
Algumas vezes ´e mais ´util relaxar essa defini¸c˜ao e
redefinir n
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
94. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
). E o que ´e n?
n ´e o n´umero de discos → valor de entrada do algoritmo
Mas n˜ao hav´ıamos visto no in´ıcio que n era o
tamanho do problema? Como fica ent˜ao?
Algumas vezes ´e mais ´util relaxar essa defini¸c˜ao e
redefinir n
Nesse caso, dizemos que T(n) ∈ O(2n
), onde n ´e o n´umero
de discos na torre
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
95. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
Ent˜ao T(n) ∈ O(2n
). E o que ´e n?
n ´e o n´umero de discos → valor de entrada do algoritmo
Mas n˜ao hav´ıamos visto no in´ıcio que n era o
tamanho do problema? Como fica ent˜ao?
Algumas vezes ´e mais ´util relaxar essa defini¸c˜ao e
redefinir n
Nesse caso, dizemos que T(n) ∈ O(2n
), onde n ´e o n´umero
de discos na torre
Ou, alternativamente, que T(n) ´e O(2n
) no valor da entrada
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 26 / 34
96. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
E se quis´essemos a complexidade em termos do
tamanho da entrada?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 27 / 34
97. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
E se quis´essemos a complexidade em termos do
tamanho da entrada?
Note que n ´e um n´umero implementado com m bits
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 27 / 34
98. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
E se quis´essemos a complexidade em termos do
tamanho da entrada?
Note que n ´e um n´umero implementado com m bits
Ou seja, o tamanho da entrada ´e m bits
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 27 / 34
99. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
E se quis´essemos a complexidade em termos do
tamanho da entrada?
Note que n ´e um n´umero implementado com m bits
Ou seja, o tamanho da entrada ´e m bits
Podemos escrever n ent˜ao como
n = 2m−1
dm−1 + 2m−2
dm−2 + . . . + 20
d0, onde
di ∈ {0, 1}, 0 ≤ i < m ´e um d´ıgito bin´ario
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 27 / 34
100. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
No pior caso, n usa todos os bits dispon´ıveis (di = 1,
0 ≤ i < m), ent˜ao n = 2m−1
+ 2m−2
+ . . . + 20
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 28 / 34
101. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
No pior caso, n usa todos os bits dispon´ıveis (di = 1,
0 ≤ i < m), ent˜ao n = 2m−1
+ 2m−2
+ . . . + 20
Ou seja
n = O(2m−1
+ 2m−2
+ . . . + 20
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 28 / 34
102. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
No pior caso, n usa todos os bits dispon´ıveis (di = 1,
0 ≤ i < m), ent˜ao n = 2m−1
+ 2m−2
+ . . . + 20
Ou seja
n = O(2m−1
+ 2m−2
+ . . . + 20
)
= O(2m−1
) + O(2m−2
) + . . . + O(20
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 28 / 34
103. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
No pior caso, n usa todos os bits dispon´ıveis (di = 1,
0 ≤ i < m), ent˜ao n = 2m−1
+ 2m−2
+ . . . + 20
Ou seja
n = O(2m−1
+ 2m−2
+ . . . + 20
)
= O(2m−1
) + O(2m−2
) + . . . + O(20
)
= O(2m
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 28 / 34
104. An´alise de Algoritmos Recursivos
Exemplo: Torres de Hanoi
No pior caso, n usa todos os bits dispon´ıveis (di = 1,
0 ≤ i < m), ent˜ao n = 2m−1
+ 2m−2
+ . . . + 20
Ou seja
n = O(2m−1
+ 2m−2
+ . . . + 20
)
= O(2m−1
) + O(2m−2
) + . . . + O(20
)
= O(2m
)
E T(n) = O(2n
) = O(22m
), onde m ´e o tamanho da
entrada em bits
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 28 / 34
105. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Considere agora
o fatorial
recursivo:
Entrada: inteiro n
Se n=0, retorne 1
Sen~ao
retorne n multiplicado pelo
fatorial de n-1
T(n) =
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 29 / 34
106. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Considere agora
o fatorial
recursivo:
Entrada: inteiro n
Se n=0, retorne 1
Sen~ao
retorne n multiplicado pelo
fatorial de n-1
T(n) =
O(1), se n = 0.
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 29 / 34
107. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Considere agora
o fatorial
recursivo:
Entrada: inteiro n
Se n=0, retorne 1
Sen~ao
retorne n multiplicado pelo
fatorial de n-1
T(n) =
O(1), se n = 0.
O(1)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 29 / 34
108. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Considere agora
o fatorial
recursivo:
Entrada: inteiro n
Se n=0, retorne 1
Sen~ao
retorne n multiplicado pelo
fatorial de n-1
T(n) =
O(1), se n = 0.
O(1) + T(n − 1) para n ≥ 1
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 29 / 34
109. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Considere agora
o fatorial
recursivo:
Entrada: inteiro n
Se n=0, retorne 1
Sen~ao
retorne n multiplicado pelo
fatorial de n-1
T(n) =
O(1), se n = 0.
O(1) + T(n − 1) para n ≥ 1
J´a vimos que T(n) ∈ O(n)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 29 / 34
110. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Mais uma vez, n n˜ao ´e o tamanho da entrada, mas
a pr´opria entrada
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 30 / 34
111. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Mais uma vez, n n˜ao ´e o tamanho da entrada, mas
a pr´opria entrada
Ou seja, o n´umero do qual calculamos o fatorial
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 30 / 34
112. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Mais uma vez, n n˜ao ´e o tamanho da entrada, mas
a pr´opria entrada
Ou seja, o n´umero do qual calculamos o fatorial
E mais uma vez, podemos relaxar nossa defini¸c˜ao,
dizendo que o fatorial recursivo ´e O(n) no valor da
entrada
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 30 / 34
113. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Mais uma vez, n n˜ao ´e o tamanho da entrada, mas
a pr´opria entrada
Ou seja, o n´umero do qual calculamos o fatorial
E mais uma vez, podemos relaxar nossa defini¸c˜ao,
dizendo que o fatorial recursivo ´e O(n) no valor da
entrada
E se quis´essemos sua complexidade em rela¸c˜ao ao
tamanho da entrada?
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 30 / 34
114. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Novamente lembramos que n ´e um valor escrito em
bin´ario
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 31 / 34
115. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Novamente lembramos que n ´e um valor escrito em
bin´ario
E que, no pior caso, n ∈ O(2m
), onde m ´e o n´umero
de bits usados para representar n
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 31 / 34
116. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
Novamente lembramos que n ´e um valor escrito em
bin´ario
E que, no pior caso, n ∈ O(2m
), onde m ´e o n´umero
de bits usados para representar n
Ent˜ao T(n) = O(n)
= O(O(2m
))
= O(2m
)
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 31 / 34
117. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
E assim, podemos dizer tanto que o fatorial
recursivo ´e O(n) no valor da entrada
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 32 / 34
118. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
E assim, podemos dizer tanto que o fatorial
recursivo ´e O(n) no valor da entrada
Quanto que ele ´e O(2n
) no tamanho da entrada
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 32 / 34
119. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
E assim, podemos dizer tanto que o fatorial
recursivo ´e O(n) no valor da entrada
Quanto que ele ´e O(2n
) no tamanho da entrada
A utilidade pr´atica dessa informa¸c˜ao ´e que vai
determinar qual das formas usar
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 32 / 34
120. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
E assim, podemos dizer tanto que o fatorial
recursivo ´e O(n) no valor da entrada
Quanto que ele ´e O(2n
) no tamanho da entrada
A utilidade pr´atica dessa informa¸c˜ao ´e que vai
determinar qual das formas usar
Se queremos apenas as opera¸c˜oes, independentemente do
hardware, usamos o valor
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 32 / 34
121. An´alise de Algoritmos Recursivos
Exemplo: Fatorial recursivo
E assim, podemos dizer tanto que o fatorial
recursivo ´e O(n) no valor da entrada
Quanto que ele ´e O(2n
) no tamanho da entrada
A utilidade pr´atica dessa informa¸c˜ao ´e que vai
determinar qual das formas usar
Se queremos apenas as opera¸c˜oes, independentemente do
hardware, usamos o valor
Se queremos saber como cresce a necessidade de hardware
(como o tamanho da palavra, por exemplo), ent˜ao usamos o
tamanho da entrada
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 32 / 34
122. An´alise de Algoritmos Recursivos
Notas finais
Note que, mesmo a nota¸c˜ao assint´otica nos
ajudando com as rela¸c˜oes de recorrˆencia, ainda
assim temos que resolvˆe-las
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 33 / 34
123. An´alise de Algoritmos Recursivos
Notas finais
Note que, mesmo a nota¸c˜ao assint´otica nos
ajudando com as rela¸c˜oes de recorrˆencia, ainda
assim temos que resolvˆe-las
N˜ao h´a como ter uma ideia da complexidade por uma
simples inspe¸c˜ao, como era o caso com algoritmos iterativos
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 33 / 34
124. An´alise de Algoritmos Recursivos
Notas finais
Note que, mesmo a nota¸c˜ao assint´otica nos
ajudando com as rela¸c˜oes de recorrˆencia, ainda
assim temos que resolvˆe-las
N˜ao h´a como ter uma ideia da complexidade por uma
simples inspe¸c˜ao, como era o caso com algoritmos iterativos
E n˜ao h´a realmente como fugir disso...
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 33 / 34
125. An´alise de Algoritmos Recursivos
Notas finais
Note que, mesmo a nota¸c˜ao assint´otica nos
ajudando com as rela¸c˜oes de recorrˆencia, ainda
assim temos que resolvˆe-las
N˜ao h´a como ter uma ideia da complexidade por uma
simples inspe¸c˜ao, como era o caso com algoritmos iterativos
E n˜ao h´a realmente como fugir disso...
Mas em alguns casos, podemos obter uma boa
ajuda
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 33 / 34
126. An´alise de Algoritmos Recursivos
Notas finais
Note que, mesmo a nota¸c˜ao assint´otica nos
ajudando com as rela¸c˜oes de recorrˆencia, ainda
assim temos que resolvˆe-las
N˜ao h´a como ter uma ideia da complexidade por uma
simples inspe¸c˜ao, como era o caso com algoritmos iterativos
E n˜ao h´a realmente como fugir disso...
Mas em alguns casos, podemos obter uma boa
ajuda
Veremos na pr´oxima aula
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 33 / 34
127. Referˆencias
Ziviani, Nivio. Projeto de Algoritmos: com implementa¸c˜oes
em Java e C++. Cengage. 2007.
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
Norton Trevisan Romannorton@usp.br Aula 09 – An´alise Assint´otica de Algoritmos Iterativos e Recursivos18 de setembro de 2018 34 / 34