Escolar Documentos
Profissional Documentos
Cultura Documentos
de Dados
"People who analyze algorithms have double happiness. First of all they experience the
sheer beauty of elegant mathematical patterns that surround elegant computational
procedures. Then they receive a practical payoff when their theories make it possible to
get other jobs done more quickly and more economically." - Donald Knuth
3/99
Análise de Algoritmos
Estudaremos
Entender o comportamento de umessealgoritmo
aspecto! em função da carga
de dados que deve ser processada;
Avaliar o custo em termos de tempo e de espaço;
Tempo: tempo de processamento;
Espaço: espaço em memória utilizado.
5/99
Análise de Algoritmos
Três situações:
Favorável ➔ melhor caso;
Desfavorável ➔ pior caso;
Ordinária ➔ caso normal ou caso médio.
9/99
Melhor caso, pior caso e caso médio
Exemplos:
𝑇 𝑛 = 𝑛2 + 𝑛 + 10 (é) 𝑂(𝑛2)
𝑇 𝑛 = 3𝑛3 + 𝑛2 (é) 𝑂(𝑛3)
𝑇 𝑛 = 50 lg 𝑛 + 30 (é) 𝑂(lg 𝑛)*
𝑛 lg 𝑛
𝑇 𝑛 = + 4𝑛 (é) 𝑂(𝑛 lg 𝑛)*
3
Exemplo:
Para 𝑂 𝑛2 , 𝑇 𝑛 = 𝑛2
Sendo assim:
se n = 10, 𝑇 10 = 102 = 100
se n = 100, 𝑇 100 = 1002 = 10000
Pois:
𝑇 𝑛 = 𝑛2
𝑇 10𝑛 = (10𝑛)2 = 100𝑛2 = 100𝑇(𝑛)
𝒏 ≥ 𝟐𝟎
24/99
Aspectos Formais e Notação
𝒏 ≥ 𝟐𝟎
𝒏 ≥ 𝟒
28/99
Aspectos Formais e Notação
𝒏 ≥ 𝟒
Para 𝑐 = 11, 𝑇(𝑛) ≤ 11𝑛2 para todo 𝑛 ≥ 4
29/99
Aspectos Formais e Notação
Algoritmo:
c = a + b;
Considerar:
Tempo de acesso à memória (a e b);
Realização da operação (soma);
Armazenamento do resultado em local temporário;
Atribuição do valor obtido em c.
39/99
O Modelo de Computador e os Comandos
Tempo constante?
Com repetições?
Dependente de n?
Ordem polinomial dependente da profundidade/aninhamento de estruturas de
repetição;
Independente de n?
Divisão e conquista?
44/99
Trechos com Repetições
int soma = 0;
return soma;
Tempo da instrução
Quantidade de execuções
46/99
Trechos com Repetições
return soma;
Tempo da instrução
Quantidade de execuções
47/99
Trechos com Repetições
return soma;
Tempo da instrução
Quantidade de execuções
48/99
Trechos com Repetições
return soma;
Tempo da instrução
Quantidade de execuções
49/99
Trechos com Repetições
return soma;
Tempo da instrução
Quantidade de execuções
50/99
Trechos com Repetições
return soma;
Tempo da instrução
Quantidade de execuções
51/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
52/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
53/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
54/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
55/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
56/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
57/99
Trechos com Repetições
Tempo da instrução
Quantidade de execuções
58/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
59/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
60/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
61/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
62/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
63/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
64/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
Tempo da instrução
Quantidade de execuções
65/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 2𝑛 + 1
𝑇 𝑛 = 3 + 3𝑛 + 3 + 3𝑛
𝑇 𝑛 = 6𝑛 + 6
𝑇 𝑛 é 𝑂(𝑛)
66/99
Trechos com Repetições
public static int k( int n ) {
int x = 0;
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
67/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
68/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut
for ( int i = 0; i < n; i++ ) {
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
69/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut
for ( int i = 0; i < n; i++ ) {
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
70/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
71/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
72/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
73/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3;
return x;
Tempo da instrução
Quantidade de execuções
74/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3; 6ut
return x;
Tempo da instrução
Quantidade de execuções
75/99
Trechos com Repetições
public static int k( int n ) {
1ut
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
76/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
77/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
78/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
79/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
n x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
80/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 3ut 1ut
for ( int j = 0; j < n; j++ ) {
n x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
81/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut 1ut
for ( int j = 0; j < n; j++ ) {
n x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
82/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut
for ( int j = 0; j < n; j++ ) {
n x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
83/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
84/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut n
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut
return x;
Tempo da instrução
Quantidade de execuções
85/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut n
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut 1
return x;
Tempo da instrução
Quantidade de execuções
86/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut n
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut 1
return x;
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 𝑛 1 + 3 𝑛 + 1 + 𝑛 + 6𝑛 + 1
Tempo da instrução
Quantidade de execuções
87/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut n
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut 1
return x;
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 𝑛 1 + 3 𝑛 + 1 + 𝑛 + 6𝑛 + 1
Tempo da instrução
Quantidade de execuções
88/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut n
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut 1
return x;
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 𝑛 1 + 3 𝑛 + 1 + 𝑛 + 6𝑛 + 1
Tempo da instrução
Quantidade de execuções
89/99
Trechos com Repetições
public static int k( int n ) {
1ut 1
int x = 0;
1ut 1 3ut n+1 1ut n
for ( int i = 0; i < n; i++ ) {
1ut 1 3ut n+1 1ut n
for ( int j = 0; j < n; j++ ) {
n n x *= ( i * 2 / j ) / 3; 6ut
}
1ut 1
return x;
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 𝑛 1 + 3 𝑛 + 1 + 𝑛 + 6𝑛 + 1
Tempo da instrução
Quantidade de execuções
90/99
Trechos com Repetições
𝑇 𝑛 = 1 + 1 + 3 𝑛 + 1 + 𝑛 + 𝑛 1 + 3 𝑛 + 1 + 𝑛 + 6𝑛 + 1
𝑇 𝑛 = 3 + 3𝑛 + 3 + 𝑛 + 𝑛(1 + 3𝑛 + 3 + 7𝑛)
𝑇 𝑛 = 4𝑛 + 6 + 𝑛 + 3𝑛2 + 3𝑛 + 7𝑛2
𝑇 𝑛 = 10𝑛2 + 8𝑛 + 6
𝑇 𝑛 é 𝑂(𝑛2 )
91/99
Outras Considerações
a)
1 int n = 0;
2 int x = n + 2;
3 System.out.println( x );
b)
1 int n = 4;
2 for ( int i = 0; i <= 10; i++ ) {
3 System.out.printf( "%d x %d = %d", n, i, n*i );
4 }
c)
1 public static int fatorial( int n ) {
2 int fat = 1;
3 for ( int i = 1; i <= n; i++ ) {
4 fat *= i;
5 }
6 return fat;
7 }
95/99
Análise de Algoritmos
Exercícios Escritos
d)
1 public static boolean ehPalindromo( String exp ) {
2 int n = exp.length();
3 for ( int i = 0; i < n/2; i++ ) {
4 // considere que o corpo desse if nunca será executado
5 if ( exp.charAt(i) != exp.charAt(t-1-i) ) {
6 return false;
7 }
8 }
9 return true;
}
e)
1 for ( int i = 0; i < n; i++ ) {
2 for ( int j = 0; j < n; j++ ) {
3 System.out.println( i * j );
4 }
5 }
96/99
Análise de Algoritmos
Exercícios Escritos
f)
1 for ( int i = 0; i < 10; i++ ) {
2 for ( int j = 0; j < n; j++ ) {
3 System.out.println( i * j );
4 }
5 }
g)
1 for ( int i = 0; i < n; i++ ) {
2 for ( int j = 0; j < 20; j++ ) {
3 System.out.println( i * j );
4 }
5 }
h)
1 for ( int i = 1; i < 50; i++ ) {
2 for ( int j = 1; j < 50; j++ ) {
3 System.out.println( i * j );
4 }
5 }
97/99
Análise de Algoritmos
Exercícios Escritos
i)
1 for ( int i = 0; i < n; i++ ) {
2 for ( int j = 0; j < n; j++ ) {
3 for ( int k = 0; k < n; k++ ) {
4 System.out.println( i * j + k );
5 }
6 }
7 }
j)
1 for ( int i = 0; i < n; i++ ) {
2 for ( int j = 5; j < 20; j++ ) {
3 for ( int k = 0; k < n; k++ ) {
4 System.out.println( i * j + k );
5 }
6 }
7 }
98/99
Análise de Algoritmos
Exercícios Escritos
k)
1 for ( int i = 0; i <= n; i++ ) {
2 for ( int j = 0; j < n; j++ ) {
3 System.out.println( i * j + 3 );
4 }
5 for ( int k = 1; k <= n; k++ ) {
6 System.out.println( i * k * k );
7 }
8 }
l)
1 for ( int i = 1; i <= 10; i++ ) {
2 for ( int j = 0; j < n; j++ ) {
3 System.out.println( i * j + 3 );
4 }
5 for ( int k = n; k >= 0; k-- ) {
6 System.out.println( i * k * k );
7 }
8 }
99/99
Bibliografia