Professional Documents
Culture Documents
1 1
Projeto de Algoritmos Cap.1 Introduo Seo 1.1 2 Projeto de Algoritmos Cap.1 Introduo Seo 1.1 3
Projeto de Algoritmos Cap.1 Introduo Seo 1.2 6 Projeto de Algoritmos Cap.1 Introduo Seo 1.2 7
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 10 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 11
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 14 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 15
Considere o algoritmo para encontrar o maior Teorema: Qualquer algoritmo para encontrar
elemento de um vetor de o maior elemento de um conjunto com n
inteirosv [0..n 1], n 1. elementos, n 1, faz pelo menos n 1
comparaes.
package cap1;
public class Max { Prova: Deve ser mostrado, por meio de
public static int max ( int v [ ] , int n) { comparaes, que cada um dos n 1
int max = v [ 0 ] ; elementos menor do que algum outro
for ( int i = 1; i < n ; i ++) elemento.
i f (max < v [ i ] ) max = v [ i ] ;
return max; Logo n 1 comparaes so necessrias. 2
}
O teorema acima nos diz que, se o nmero
}
de comparaes for utilizado como medida de
custo, ento o mtodo max da classe Max
Seja f uma funo de complexidade tal que
timo.
f (n) o nmero de comparaes entre os
elementos de v, se v contiver n elementos.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 18 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 19
Exemplo - Maior e Menor Elemento (1) Exemplo - Maior e Menor Elemento (1)
Considere o problema de encontrar o maior e Seja f (n) o nmero de comparaes entre os
o menor elemento de um vetor de inteiros elementos de v, se v contiver n elementos.
v [0..n 1], n 1.
Logo f (n) = 2(n 1), para n > 0, para o
Um algoritmo simples pode ser derivado do
melhor caso, pior caso e caso mdio.
algoritmo apresentado no programa para
achar o maior elemento. MaxMin1 pode ser facilmente melhorado: a
comparao v [i] < min s necessria
O vetor maxMin definido localmente no
quando a comparao v [i] > max falsa.
mtodo maxMin1 utilizado para retornar nas
posies 0 e 1 o maior e o menor elemento A seguir, apresentamos essa verso
do vetor v , respectivamente. melhorada.
package cap1;
public class MaxMin1 {
public static int [ ] maxMin1 ( int v [ ] , int n) {
int max = v [ 0 ] , min = v [ 0 ] ;
for ( int i = 1; i < n ; i ++) {
i f ( v [ i ] > max) max = v [ i ] ;
i f ( v [ i ] < min) min = v [ i ] ;
}
int maxMin[ ] = new int [ 2 ] ;
maxMin[0] = max; maxMin[1] = min;
return maxMin;
}
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 22 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 23
Exemplo - Maior e Menor Elemento (2) Exemplo - Maior e Menor Elemento (3)
d d d d
Contm o mximo
elementos esto em ordem crescente);
d d d d
Contm o mnimo
pior caso: f (n) = 2(n 1) (quando os
elementos esto em ordem decrescente);
caso mdio: f (n) = 3n/2 3/2.
No caso mdio, v [i] maior do que max a
metade das vezes.
3n
Logo f (n) = n 1 + n1
2
= 2
32 , para n > 0.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 24 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 25
Exemplo - Maior e Menor Elemento (3) Exemplo - Maior e Menor Elemento (3)
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 26 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 27
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 30 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 31
n n
m m
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 34 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 35
c O(f (n)) = O(f (n)) c = constante Definio: Uma funo g(n) (f (n)) se
O(f (n)) + O(f (n)) = O(f (n)) existirem duas constantes c e m tais que
g(n) cf (n), para todo n m.
O(O(f (n)) = O(f (n))
O(f (n)) + O(g(n)) = O(max(f (n), g(n))) Exemplo: Para mostrar que g(n) = 3n3 + 2n2
(n3 ) basta fazer c = 1, e ento
O(f (n))O(g(n)) = O(f (n)g(n))
3n3 + 2n2 n3 para n 0.
f (n)O(g(n)) = O(f (n)g(n))
Exemplo: Seja g(n) = n para n mpar (n 1)
e g(n) = n2 /10 para n par (n 0).
Exemplo: regra da soma O(f (n)) + O(g(n)).
Neste caso g(n) (n2 ), bastando
Suponha trs trechos cujos tempos de considerar c = 1/10 e n = 0, 2, 4, 6, . . .
execuo so O(n), O(n2 ) e O(n log n).
Exemplo grfico para a notao
O tempo de execuo dos dois primeiros f,g
g(n)
trechos O(max(n, n2 )), que O(n2 ).
c f (n)
O tempo de execuo de todos os trs
trechos ento O(max(n2 , n log n)), que
O(n2 ). m
n
Exemplo: O produto de [log n + k + O(1/n)] por Para todos os valores direita de m, o valor
[n + O( n)] n log n + kn + O( n log n). de g(n) est sobre ou acima do valor de cf (n).
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 38 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 39
Notao o Notao
Usada para definir um limite superior que no Por analogia, a notao est relacionada
assintoticamente firme. com a notao da mesma forma que a
notao o est relacionada com a notao O.
Definio: Uma funo g(n) o(f (n)) se,
para qualquer constante c > 0, ento Definio: Uma funo g(n) (f (n)) se,
0 g(n) < cf (n) para todo n m. para qualquer constante c > 0, ento
0 cf (n) < g(n) para todo n m.
Exemplo: 2n = o(n2 ), mas 2n2 6= o(n2 ).
n2 n2
Exemplo: 2
= (n), mas 2
6= (n2 ).
Em g(n) = O(f (n)), a expresso
0 g(n) cf (n) vlida para alguma A relao g(n) = (f (n)) implica
constante c > 0, mas em g(n) = o(f (n)), a limn fg(n)
(n)
= , se o limite existir.
expresso 0 g(n) < cf (n) vlida para
todas as constantes c > 0.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 42 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 43
Por exemplo, considere dois algoritmos F e G Para n < 50, o programa com tempo 2n2
aplicados mesma classe de problemas, melhor do que o que possi tempo 100n.
sendo que F leva trs vezes o tempo de G ao Para problemas com entrada de dados
serem executados, isto , f (n) = 3g(n), sendo pequena prefervel usar o programa cujo
que O(f (n)) = O(g(n)). tempo de execuo O(n2 ).
Logo, o comportamento assinttico no serve Entretanto, quando n cresce, o programa
para comparar os algoritmos F e G, porque com tempo de execuo O(n2 ) leva muito
eles diferem apenas por uma constante. mais tempo que o programa O(n).
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 44 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 45
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 46 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 47
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 50 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 51
Exemplo: um algoritmo com funo de Supondo que sempre h uma estrada entre
complexidade f (n) = 2n mais rpido que duas cidades quaisquer, o problema
um algoritmo g(n) = n5 para valores de n encontrar a menor rota para a viagem.
menores ou iguais a 20.
A figura ilustra o exemplo para quatro cidades
Tambm existem algoritmos exponenciais que c1 , c2 , c3 , c4 , em que os nmeros nos arcos
so muito teis na prtica. indicam a distncia entre duas cidades.
c1
Exemplo: o algoritmo Simplex para
programao linear possui complexidade de 4
9 8
tempo exponencial para o pior caso mas
5 c3 3
executa muito rpido na prtica.
c2 c4
8
Tais exemplos no ocorrem com freqncia
na prtica, e muitos algoritmos exponenciais O percurso < c1 , c3 , c4 , c2 , c1 > uma soluo
conhecidos no so muito teis. para o problema, cujo percurso total tem
distncia 24.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 52 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 53
Projeto de Algoritmos Cap.1 Introduo Seo 1.4 54 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 55
Projeto de Algoritmos Cap.1 Introduo Seo 1.4 58 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 59
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 62 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 63
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 66 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 67
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 70 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 71
O objeto item tem de ser uma instncia de um Note que o mtodo salarioMensal do
tipo genrico T que ser fornecido quando programa acima possui uma assinatura
um objeto da classe Lista for instanciado. diferente da assinatura apresentada no
programa anterior.
Para instanciar uma lista de inteiros basta
declarar o comando Lista<Integer> lista =
new Lista<Integer>();.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 72 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 73
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 74 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 75
Os mtodos de uma classe que foram No exemplo acima, o campo de dados total
declarados static operam somente sobre os pertence somente classe A, enquanto o
campos da classe que tambm foram campo de dados media pertence a todas as
declarados static. instncias da classe A.
Se alm de static o mtodo for declarado Ao final da execuo do mtodo main, os
public ser possvel acess-lo com o nome valores de a.total e b.total so iguais a 7,
da classe e o operador (.). enquanto os valores de a.media e b.media so
iguais a 5 e 7, respectivamente.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 78 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 79
Interfaces Interfaces
Uma interface em Java uma classe Para permitir a generalizao do tipo de
abstrata que no pode ser instanciada, cujos dados da chave necessrio criar a interface
os mtodos devem ser public e somente suas Item que apresenta a assinatura do mtodo
assinaturas so definidas abstrato compara.
Uma interface sempre implementada por package cap1;
outras classes. public interface Item {
public int compara ( Item i t ) ;
Utilizada para prover a especificao de um
}
comportamento que seja comum a um
conjunto de objetos.
A classe MeuItem, o tipo de dados da chave
package cap1; definido e o mtodo compara implementado.
import java . io . ;
package cap1;
public class Max {
import java . io . ;
public static Item max ( Item v [ ] , int n) {
public class MeuItem implements Item {
Item max = v [ 0 ] ;
public int chave;
for ( int i = 1; i < n ; i ++)
/ / outros componentes do registro
i f (max.compara ( v [ i ] ) < 0 ) max = v [ i ] ;
return max;
public MeuItem ( int chave ) { this .chave = chave ; }
}
public int compara ( Item i t ) {
}
MeuItem item = (MeuItem) i t ;
i f ( this .chave < item .chave) return 1;
O programa acima apresenta uma verso
else i f ( this .chave > item .chave) return 1;
generalizada do programa para obter o
return 0;
mximo de um conjunto de inteiros. }
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 80 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 81
Interfaces Pacotes
O programa acima ilustra a utilizao do Deve ser realizada sempre na primeira linha
mtodo compara apresentado. do arquivo fonte, da seguinte forma por
exemplo:
Note que para atribuir a um objeto da classe
package cap1;
MeuItem o valor mximo retornado pelo
mtodo max necessrio fazer uma possvel definir subpacotes separados por
converso do tipo Item para o tipo MeuItem, ".", por exemplo, para definir o subpacote
conforme ilustra a penltima linha do mtodo arranjo do pacote cap3 fazemos:
main. package cap3.arranjo;
A utilizao de uma classe definida em outro
pacote realizada atravs da palavra chave
import. O comando abaixo possibilita a
utilizao de todas as classes de um pacote:
import cap3.arranjo.*;
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 82 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 83
Toda instncia de uma classe possui uma As excees so erros ou anomalias que
varivel especial chamada this, que contm podem ocorrer durante a execuo de um
uma referncia para a prpria instncia. programa.
Deve ser obrigatoriamente representada por
Em algumas situaes resolve questes de
um objeto de uma subclasse da classe
ambigidade.
Throwable, que possui duas subclasses
package cap1; diretas: (i) Exception e (ii) Error
public class Conta {
Uma abordagem simples para tratar uma
private double saldo ;
exceo exibir uma mensagem relatando o
public void alteraSaldo (double saldo ) {
erro ocorrido e retornar para quem chamou
this . saldo = saldo ;
ou finalizar o programa, como no exemplo
}
}
abaixo:
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 86 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 87
Excees Excees
O comando try trata uma exceo que tenha No exemplo abaixo a exceo no tratada
sido disparada em seu interior por um no local onde ela ocorreu, e esse fato
comando throw explicitamente indicado pelo comando throws
O comando throw instancia o objeto que int divisao ( int a, int b) throws {
representa a exceo e o envia para ser i f (b == 0) throw new Exception ( "Divisao por zero" ) ;
capturado pelo trecho de cdigo que vai tratar return (a/b) ;
a exceo. }
Os tipos primitivos e objetos do tipo String Todo programa em Java que tenha leitura de
podem ser impressos com os comandos dados tem de incluir o comando no incio do
programa
System.out.print (var);
import java.io.*;
System.out.println (var);
Mtodo para ler do teclado uma cadeia de
O mtodo print deixa o cursor na mesma
caracteres terminada com a tecla Enter:
linha e o mtodo println move o cursor para a
public static String getString () throws
prxima linha de sada.
IOException {
InputStreamReader inputString = new
InputStreamReader (System.in);
BufferedReader buffer = new BufferedReader
(inputString);
String s = buffer.readLine (); return s;
}
Mtodo para realizar a entrada de um
caractere a partir do teclado:
public static char getChar () throws IOException {
String s = getString ();
return s.charAt (0);
}
Se o que est sendo lido de outro tipo,
ento necessrio realizar uma converso.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 90 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 91