You are on page 1of 24

Projeto de Algoritmos Cap.1 Introduo Seo 1.

1 1

Algoritmos, Estruturas de Dados e


Programas

Os algoritmos fazem parte do dia-a-dia das


pessoas. Exemplos de algoritmos:
instrues para o uso de medicamentos,
indicaes de como montar um aparelho,
Introduo uma receita de culinria.

Seqncia de aes executveis para a


obteno de uma soluo para um
determinado tipo de problema.

Segundo Dijkstra, um algoritmo corresponde


a uma descrio de um padro de
comportamento, expresso em termos de um
conjunto finito de aes.
ltima alterao: 10 de Outubro de 2006
Executando a operao a + b percebemos
um padro de comportamento, mesmo
que a operao seja realizada para
valores diferentes de a e b.

Transparncias elaboradas por Charles Ornelas, Leonardo Rocha, Leonardo

Mata e Nivio Ziviani

Projeto de Algoritmos Cap.1 Introduo Seo 1.1 2 Projeto de Algoritmos Cap.1 Introduo Seo 1.1 3

Estruturas de dados Escolha da Representao dos Dados

Estruturas de dados e algoritmos esto A escolha da representao dos dados


intimamente ligados: determinada, entre outras, pelas operaes a
no se pode estudar estruturas de dados serem realizadas sobre os dados.
sem considerar os algoritmos associados Considere a operao de adio:
a elas,
Para pequenos nmeros, uma boa
assim como a escolha dos algoritmos em representao por meio de barras
geral depende da representao e da verticais (caso em que a operao de
estrutura dos dados. adio bastante simples).
Para resolver um problema necessrio J a representao por dgitos decimais
escolher uma abstrao da realidade, em requer regras relativamente complicadas,
geral mediante a definio de um conjunto de as quais devem ser memorizadas.
dados que representa a situao real. Entretanto, quando consideramos a adio
A seguir, deve ser escolhida a forma de de grandes nmeros mais fcil a
representar esses dados. representao por dgitos decimais
(devido ao princpio baseado no peso
relativo da posio de cada dgito).
Projeto de Algoritmos Cap.1 Introduo Seo 1.1 4 Projeto de Algoritmos Cap.1 Introduo Seo 1.2 5

Programas Tipos de Dados


Programar basicamente estruturar dados e Caracteriza o conjunto de valores a que uma
construir algoritmos. constante pertence, ou que podem ser
Programas so formulaes concretas de assumidos por uma varivel ou expresso, ou
algoritmos abstratos, baseados em que podem ser gerados por uma funo.
representaes e estruturas especficas de
Tipos simples de dados so grupos de
dados.
valores indivisveis (como os tipos bsicos int,
Programas representam uma classe especial boolean, char e float de Java).
de algoritmos capazes de serem seguidos por
Exemplo: uma varivel do tipo boolean
computadores.
pode assumir o valor verdadeiro ou o valor
Um computador s capaz de seguir falso, e nenhum outro valor.
programas em linguagem de mquina
Os tipos estruturados em geral definem uma
(seqncia de instrues obscuras e
desconfortveis). coleo de valores simples, ou um agregado
de valores de tipos diferentes.
necessrio construir linguagens mais
adequadas, que facilitem a tarefa de
programar um computador.
Uma linguagem de programao uma
tcnica de notao para programar, com a
inteno de servir de veculo tanto para a
expresso do raciocnio algortmico quanto
para a execuo automtica de um algoritmo
por um computador.

Projeto de Algoritmos Cap.1 Introduo Seo 1.2 6 Projeto de Algoritmos Cap.1 Introduo Seo 1.2 7

Tipos Abstratos de Dados (TADs) Implementao de TADs


Modelo matemtico, acompanhado das Considere uma aplicao que utilize uma lista
operaes definidas sobre o modelo. de inteiros. Poderamos definir TAD Lista,
com as seguintes operaes:
Exemplo: o conjunto dos inteiros
acompanhado das operaes de adio, 1. faa a lista vazia;
subtrao e multiplicao. 2. obtenha o primeiro elemento da lista; se a lista
estiver vazia, ento retorne nulo;
TADs so utilizados extensivamente como
3. insira um elemento na lista.
base para o projeto de algoritmos.
H vrias opes de estruturas de dados que
A implementao do algoritmo em uma
permitem uma implementao eficiente para
linguagem de programao especfica exige a
listas (por ex., o tipo estruturado arranjo).
representao do TAD em termos dos tipos
de dados e dos operadores suportados. Cada operao do tipo abstrato de dados
implementada como um procedimento na
A representao do modelo matemtico por
linguagem de programao escolhida.
trs do tipo abstrato de dados realizada
mediante uma estrutura de dados. Qualquer alterao na implementao do
TAD fica restrita parte encapsulada, sem
Podemos considerar TADs como
causar impactos em outras partes do cdigo.
generalizaes de tipos primitivos e
procedimentos como generalizaes de Cada conjunto diferente de operaes define
operaes primitivas. um TAD diferente, mesmo atuem sob um
mesmo modelo matemtico.
O TAD encapsula tipos de dados. A definio
do tipo e todas as operaes ficam A escolha adequada de uma implementao
localizadas numa seo do programa. depende fortemente das operaes a serem
realizadas sobre o modelo.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 8 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 9

Medida do Tempo de Execuo de um Tipos de Problemas na Anlise de


Programa Algoritmos

O projeto de algoritmos fortemente Anlise de um algoritmo particular.


influenciado pelo estudo de seus Qual o custo de usar um dado algoritmo
comportamentos. para resolver um problema especfico?
Caractersticas que devem ser
Depois que um problema analisado e
investigadas:
decises de projeto so finalizadas,
anlise do nmero de vezes que cada
necessrio estudar as vrias opes de
parte do algoritmo deve ser executada,
algoritmos a serem utilizados, considerando
estudo da quantidade de memria
os aspectos de tempo de execuo e espao
necessria.
ocupado.
Anlise de uma classe de algoritmos.
Muitos desses algoritmos so encontrados
Qual o algoritmo de menor custo
em reas como pesquisa operacional,
possvel para resolver um problema
otimizao, teoria dos grafos, estatstica,
particular?
probabilidades, entre outras.
Toda uma famlia de algoritmos
investigada.
Procura-se identificar um que seja o
melhor possvel.
Coloca-se limites para a complexidade
computacional dos algoritmos
pertencentes classe.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3 10 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 11

Custo de um Algoritmo Medida do Custo pela Execuo do


Programa
Determinando o menor custo possvel para
resolver problemas de uma dada classe, Tais medidas so bastante inadequadas e os
temos a medida da dificuldade inerente para resultados jamais devem ser generalizados:
resolver o problema. os resultados so dependentes do
Quando o custo de um algoritmo igual ao compilador que pode favorecer algumas
menor custo possvel, o algoritmo timo construes em detrimento de outras;
para a medida de custo considerada. os resultados dependem do hardware;
quando grandes quantidades de memria
Podem existir vrios algoritmos para resolver
so utilizadas, as medidas de tempo
o mesmo problema.
podem depender deste aspecto.
Se a mesma medida de custo aplicada a
Apesar disso, h argumentos a favor de se
diferentes algoritmos, ento possvel
obterem medidas reais de tempo.
compar-los e escolher o mais adequado.
Ex.: quando h vrios algoritmos distintos
para resolver um mesmo tipo de problema,
todos com um custo de execuo dentro
de uma mesma ordem de grandeza.
Assim, so considerados tanto os custos
reais das operaes como os custos no
aparentes, tais como alocao de
memria, indexao, carga, dentre outros.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 12 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 13

Medida do Custo por meio de um Funo de Complexidade


Modelo Matemtico
Para medir o custo de execuo de um
Usa um modelo matemtico baseado em um algoritmo comum definir uma funo de
computador idealizado. custo ou funo de complexidade f .

Deve ser especificado o conjunto de f (n) a medida do tempo necessrio para


operaes e seus custos de execues. executar um algoritmo para um problema de
tamanho n.
mais usual ignorar o custo de algumas das
operaes e considerar apenas as operaes Funo de complexidade de tempo: f (n)
mais significativas. mede o tempo necessrio para executar um
algoritmo em um problema de tamanho n.
Ex.: algoritmos de ordenao. Consideramos
o nmero de comparaes entre os Funo de complexidade de espao: f (n)
elementos do conjunto a ser ordenado e mede a memria necessria para executar
ignoramos as operaes aritmticas, de um algoritmo em um problema de tamanho n.
atribuio e manipulaes de ndices, caso
Utilizaremos f para denotar uma funo de
existam.
complexidade de tempo daqui para a frente.

A complexidade de tempo na realidade no


representa tempo diretamente, mas o nmero
de vezes que determinada operao
considerada relevante executada.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3 14 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 15

Exemplo - Maior Elemento Exemplo - Maior Elemento

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.

Logo f (n) = n 1, para n > 0.

Vamos provar que o algoritmo apresentado


no programa acima timo.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 16 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 17

Tamanho da Entrada de Dados Melhor Caso, Pior Caso e Caso Mdio

A medida do custo de execuo de um Melhor caso: menor tempo de execuo


algoritmo depende principalmente do sobre todas as entradas de tamanho n.
tamanho da entrada dos dados. Pior caso: maior tempo de execuo sobre
todas as entradas de tamanho n.
comum considerar o tempo de execuo de
um programa como uma funo do tamanho Se f uma funo de complexidade baseada
da entrada. na anlise de pior caso, o custo de aplicar o
algoritmo nunca maior do que f (n).
Para alguns algoritmos, o custo de execuo
uma funo da entrada particular dos Caso mdio (ou caso esperado): mdia dos
dados, no apenas do tamanho da entrada. tempos de execuo de todas as entradas de
tamanho n.
No caso do mtodo max do programa do
Na anlise do caso esperado, supe-se uma
exemplo, o custo uniforme sobre todos os
distribuio de probabilidades sobre o
problemas de tamanho n.
conjunto de entradas de tamanho n e o custo
J para um algoritmo de ordenao isso no mdio obtido com base nessa distribuio.
ocorre: se os dados de entrada j estiverem A anlise do caso mdio geralmente muito
quase ordenados, ento o algoritmo pode ter mais difcil de obter do que as anlises do
que trabalhar menos. melhor e do pior caso.
comum supor uma distribuio de
probabilidades em que todas as entradas
possveis so igualmente provveis.
Na prtica isso nem sempre verdade.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3 18 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 19

Exemplo - Registros de um Arquivo Exemplo - Registros de um Arquivo

Considere o problema de acessar os No estudo do caso mdio, vamos considerar


registros de um arquivo. que toda pesquisa recupera um registro.
Cada registro contm uma chave nica que Se pi for a probabilidade de que o i-simo
utilizada para recuperar registros do arquivo. registro seja procurado, e considerando que
para recuperar o i-simo registro so
O problema: dada uma chave qualquer,
necessrias i comparaes, ento
localize o registro que contenha esta chave.
f (n) = 1 p1 + 2 p2 + 3 p3 + + n pn .
O algoritmo de pesquisa mais simples o
que faz a pesquisa seqencial. Para calcular f (n) basta conhecer a
distribuio de probabilidades pi .
Seja f uma funo de complexidade tal que
f (n) o nmero de registros consultados no Se cada registro tiver a mesma probabilidade
arquivo (nmero de vezes que a chave de de ser acessado que todos os outros, ento
consulta comparada com a chave de cada pi = 1/n, 0 i < n.
registro). Neste caso  
n(n+1)
melhor caso: f (n) = 1 (registro procurado f (n) = n1 (1+2+3+ +n) = 1
n 2
= n+1
2

o primeiro consultado);
A anlise do caso esperado revela que uma
pior caso: f (n) = n (registro procurado o pesquisa com sucesso examina
ltimo consultado ou no est presente no aproximadamente metade dos registros.
arquivo);
caso mdio: f (n) = (n + 1)/2.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 20 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 21

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)

package cap1; Considerando o nmero de comparaes


public class MaxMin2 { realizadas, existe a possibilidade de obter um
public static int [ ] maxMin2 ( int v [ ] , int n) {
algoritmo mais eficiente:
int max = v [ 0 ] , min = v [ 0 ] ;
for ( int i = 1; i < n ; i ++) { 1. Compare os elementos de v aos pares,
i f ( v [ i ] > max) max = v [ i ] ; separando-os em dois subconjuntos
else i f ( v [ i ] < min) min = v [ i ] ; (maiores em um e menores em outro), a
} um custo de dn/2e comparaes.
int maxMin[ ] = new int [ 2 ] ;
2. O mximo obtido do subconjunto que
maxMin[0] = max; maxMin[1] = min;
contm os maiores elementos, a um custo
return maxMin;
}
de dn/2e 1 comparaes.
} 3. O mnimo obtido do subconjunto que
contm os menores elementos, a um
Para a nova implementao temos: custo de dn/2e 1 comparaes.
melhor caso: f (n) = n 1 (quando os 

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)

package cap1; Os elementos de v so comparados dois a


public class MaxMin3 { dois e os elementos maiores so comparados
public static int [ ] maxMin3 ( int v [ ] , int n) {
com max e os elementos menores so
int max, min, FimDoAnel;
comparados com min.
i f ( (n % 2) > 0) { v [n] = v [n1]; FimDoAnel = n ; }
else FimDoAnel = n1; Quando n mpar, o elemento que est na
i f ( v[0] > v [ 1 ] ) { max = v [ 0 ] ; min = v [ 1 ] ; } posio v [n 1] duplicado na posio v [n]
else { max = v [ 1 ] ; min = v [ 0 ] ; } para evitar um tratamento de exceo.
int i = 2;
while ( i < FimDoAnel) { Para esta implementao,
i f ( v [ i ] > v [ i +1]) { f (n) = n2 + n2
2
+ n2
2
= 3n
2
2, para n > 0,
i f ( v [ i ] > max) max = v [ i ] ; para o melhor caso, pior caso e caso mdio.
i f ( v [ i +1] < min) min = v [ i +1];
}
else {
i f ( v [ i ] < min) min = v [ i ] ;
i f ( v [ i +1] > max) max = v [ i +1];
}
i = i + 2;
}
int maxMin[ ] = new int [ 2 ] ;
maxMin[0] = max; maxMin[1] = min;
return maxMin;
}
}

Projeto de Algoritmos Cap.1 Introduo Seo 1.3 26 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 27

Comparao entre os Algoritmos Limite Inferior - Uso de um Orculo


MaxMin1, MaxMin2 e MaxMin3
Existe possibilidade de obter um algoritmo
A tabela apresenta uma comparao entre os MaxMin mais eficiente?
algoritmos dos programas MaxMin1, MaxMin2
Para responder temos de conhecer o limite
e MaxMin3, considerando o nmero de
inferior para essa classe de algoritmos.
comparaes como medida de complexidade.
Tcnica muito utilizada: uso de um orculo.
Os algoritmos MaxMin2 e MaxMin3 so
superiores ao algoritmo MaxMin1 de forma Dado um modelo de computao que
geral. expresse o comportamento do algoritmo, o
orculo informa o resultado de cada passo
O algoritmo MaxMin3 superior ao algoritmo
possvel (no caso, o resultado de cada
MaxMin2 com relao ao pior caso e bastante
comparao).
prximo quanto ao caso mdio.
Para derivar o limite inferior, o orculo procura
Os trs f (n)
sempre fazer com que o algoritmo trabalhe o
algoritmos Melhor caso Pior caso Caso mdio mximo, escolhendo como resultado da
MaxMin1 2(n 1) 2(n 1) 2(n 1) prxima comparao aquele que cause o
MaxMin2 n1 2(n 1) 3n/2 3/2 maior trabalho possvel necessrio para
MaxMin3 3n/2 2 3n/2 2 3n/2 2 determinar a resposta final.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 28 Projeto de Algoritmos Cap.1 Introduo Seo 1.3 29

Exemplo de Uso de um Orculo Exemplo de Uso de um Orculo

Teorema: Qualquer algoritmo para encontrar O algoritmo inicia no estado (n, 0, 0, 0) e


o maior e o menor elementos de um conjunto termina com (0, 1, 1, n 2).
com n elementos no ordenados, n 1, faz Aps cada comparao a tupla (a, b, c, d)
pelo menos 3dn/2e 2 comparaes. consegue progredir apenas se ela assume
Prova: A tcnica utilizada define um orculo um dentre os seis estados possveis abaixo:
que descreve o comportamento do algoritmo (a 2, b + 1, c + 1, d) se a 2 (dois
por meio de um conjunto de ntuplas, mais elementos de a so comparados)
um conjunto de regras associadas que (a 1, b + 1, c, d) ou (a 1, b, c + 1, d) ou
mostram as tuplas possveis (estados) que (a 1, b, c, d + 1) se a 1 (um elemento de
um algoritmo pode assumir a partir de uma a comparado com um de b ou um de c)
dada tupla e uma nica comparao. (a, b 1, c, d + 1) se b 2 (dois elementos
Uma 4tupla, representada por (a, b, c, d), de b so comparados)
onde os elementos de: (a, b, c 1, d + 1) se c 2 (dois elementos
a nunca foram comparados; de c so comparados)
O primeiro passo requer necessariamente
b foram vencedores e nunca perderam
a manipulao do componente a.
em comparaes realizadas;
O caminho mais rpido para levar a at
c foram perdedores e nunca venceram
zero requer dn/2e mudanas de estado e
em comparaes realizadas;
termina com a tupla (0, n/2, n/2, 0) (por
d foram vencedores e perdedores em meio de comparao dos elementos de a
comparaes realizadas. dois a dois).

Projeto de Algoritmos Cap.1 Introduo Seo 1.3 30 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 31

Exemplo de Uso de um Orculo Comportamento Assinttico de


Funes
A seguir, para reduzir o componente b at um
so necessrias dn/2e 1 mudanas de O parmetro n fornece uma medida da
estado (mnimo de comparaes necessrias dificuldade para se resolver o problema.
para obter o maior elemento de b).
Para valores suficientemente pequenos de n,
Idem para c, com dn/2e 1 mudanas de qualquer algoritmo custa pouco para ser
estado. executado, mesmo os ineficientes.

Logo, para obter o estado (0, 1, 1, n 2) a A escolha do algoritmo no um problema


partir do estado (n, 0, 0, 0) so necessrias crtico para problemas de tamanho pequeno.

dn/2e + dn/2e 1 + dn/2e 1 = d3n/2e 2 Logo, a anlise de algoritmos realizada para


valores grandes de n.
comparaes. 2
Estuda-se o comportamento assinttico das
O teorema nos diz que se o nmero de funes de custo (comportamento de suas
comparaes entre os elementos de um vetor funes de custo para valores grandes de n)
for utilizado como medida de custo, ento o
algoritmo MaxMin3 timo. O comportamento assinttico de f (n)
representa o limite do comportamento do
custo quando n cresce.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 32 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 33

Dominao assinttica Notao O


A anlise de um algoritmo geralmente conta Escrevemos g(n) = O(f (n)) para expressar
com apenas algumas operaes elementares. que f (n) domina assintoticamente g(n). L-se
A medida de custo ou medida de g(n) da ordem no mximo f (n).
complexidade relata o crescimento assinttico Exemplo: quando dizemos que o tempo de
da operao considerada. execuo T (n) de um programa O(n2 ),
Definio: Uma funo f (n) domina significa que existem constantes c e m tais
assintoticamente outra funo g(n) se que, para valores de n m, T (n) cn2 .
existem duas constantes positivas c e m tais Exemplo grfico de dominao assinttica
que, para n m, temos |g(n)| c |f (n)|. que ilustra a notao O.
f,g f,g
c f (n) c f (n)
g(n) g(n)

n n
m m

Exemplo: O valor da constante m mostrado o menor


valor possvel, mas qualquer valor maior
Sejam g(n) = (n + 1)2 e f (n) = n2 .
tambm vlido.
As funes g(n) e f (n) dominam
Definio: Uma funo g(n) O(f (n)) se
assintoticamente uma a outra, desde que
existem duas constantes positivas c e m tais
|(n + 1)2 | 4|n2 | para n 1 e |n2 | |(n + 1)2 |
que g(n) cf (n), para todo n m.
para n 0.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 34 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 35

Exemplos de Notao O Exemplos de Notao O

Exemplo: g(n) = (n + 1)2 . Exemplo: g(n) = 3n3 + 2n2 + n O(n3 ).


Logo g(n) O(n2 ), quando m = 1 e c = 4. Basta mostrar que 3n3 + 2n2 + n 6n3 ,
Isso porque (n + 1)2 4n2 para n 1. para n 0.
A funo g(n) = 3n3 + 2n2 + n tambm
Exemplo: g(n) = n e f (n) = n2 .
O(n4 ), entretanto esta afirmao mais
Sabemos que g(n) O(n2 ), pois para fraca do que dizer que g(n) O(n3 ).
n 0, n n2 .
Exemplo: g(n) = log5 n O(log n).
Entretanto f (n) no O(n).
O logb n difere do logc n por uma constante
Suponha que existam constantes c e m
que no caso logb c.
tais que para todo n m, n2 cn.
Como n = clogc n , tomando o logaritmo
Logo c n para qualquer n m, e no
base b em ambos os lados da igualdade,
existe uma constante c que possa ser
temos que
maior ou igual a n para todo n.
logb n = logb clogc n = logc n logb c.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 36 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 37

Operaes com a Notao O Notao

f (n) = O(f (n)) Especifica um limite inferior para g(n).

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 Exemplo de Notao

Definio: Uma funo g(n) (f (n)) se Seja g(n) = n2 /3 2n.


existirem constantes positivas c1 , c2 e m tais
Vamos mostrar que g(n) = (n2 ).
que 0 c1 f (n) g(n) c2 f (n), para todo
n m. Temos de obter constantes c1 , c2 e m tais que
c1 n2 31 n2 2n c2 n2 para todo n m.
Exemplo grfico para a notao
1 2
f,g Dividindo por n2 leva a c1 3
n
c2 .
c2 f ( n )
O lado direito da desigualdade ser sempre
g(n)
vlido para qualquer valor de n 1 quando
c1 f ( n )
escolhemos c2 1/3.
n
m Escolhendo c1 1/21, o lado esquerdo da
Dizemos que g(n) = (f (n)) se existirem desigualdade ser vlido para qualquer valor
constantes c1 , c2 e m tais que, para todo de n 7.
n m, o valor de g(n) est sobre ou acima de Logo, escolhendo c1 = 1/21, c2 = 1/3 e m = 7,
c1 f (n) e sobre ou abaixo de c2 f (n). verifica-se que n2 /3 2n = (n2 ).
Isto , para todo n m, a funo g(n) igual Outras constantes podem existir, mas o
a f (n) a menos de uma constante. importante que existe alguma escolha para
Neste caso, f (n) um limite assinttico as trs constantes.
firme.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 40 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 41

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.

Na notao o, a funo g(n) tem um


crescimento muito menor que f (n) quando n
tende para infinito.
g(n)
Alguns autores usam limn f (n)
= 0 para a
definio da notao o.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 42 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 43

Classes de Comportamento Comparao de Programas


Assinttico
Podemos avaliar programas comparando as
Se f uma funo de complexidade para funes de complexidade, negligenciando as
um algoritmo F , ento O(f ) considerada a constantes de proporcionalidade.
complexidade assinttica ou o
comportamento assinttico do algoritmo F . Um programa com tempo de execuo O(n)
melhor que outro com tempo O(n2 ).
A relao de dominao assinttica permite
comparar funes de complexidade. Porm, as constantes de proporcionalidade
podem alterar esta considerao.
Entretanto, se as funes f e g dominam
assintoticamente uma a outra, ento os Exemplo: um programa leva 100n unidades
algoritmos associados so equivalentes. de tempo para ser executado e outro leva 2n2 .
Qual dos dois programas melhor?
Nestes casos, o comportamento assinttico
no serve para comparar os algoritmos. depende do tamanho do problema.

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

Principais Classes de Problemas Principais Classes de Problemas


f (n) = O(1). f (n) = O(n).
Algoritmos de complexidade O(1) so Um algoritmo de complexidade O(n) dito
ditos de complexidade constante. de complexidade linear.
Uso do algoritmo independe de n.
Em geral, um pequeno trabalho
As instrues do algoritmo so executadas realizado sobre cada elemento de entrada.
um nmero fixo de vezes.
a melhor situao possvel para um
f (n) = O(log n). algoritmo que tem de processar/produzir n
Um algoritmo de complexidade O(log n) elementos de entrada/sada.
dito de complexidade logartmica. Cada vez que n dobra de tamanho, o
Tpico em algoritmos que transformam um tempo de execuo tambm dobra.
problema em outros menores.
f (n) = O(n log n).
Pode-se considerar o tempo de execuo
como menor que uma constante grande. Tpico em algoritmos que quebram um
problema em outros menores, resolvem
Quando n mil, log2 n 10, quando n 1
cada um deles independentemente e
milho, log2 n 20.
juntando as solues depois.
Para dobrar o valor de log n temos de
Quando n 1 milho, nlog2 n cerca de 20
considerar o quadrado de n.
milhes.
A base do logaritmo muda pouco estes
valores: quando n 1 milho, o log2 n 20 Quando n 2 milhes, nlog2 n cerca de
e o log10 n 6. 42 milhes, pouco mais do que o dobro.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 46 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 47

Principais Classes de Problemas Principais Classes de Problemas


f (n) = O(n2 ). f (n) = O(2n ).
Um algoritmo de complexidade O(n2 ) Um algoritmo de complexidade O(2n )
dito de complexidade quadrtica. dito de complexidade exponencial.
Ocorrem quando os itens de dados so Geralmente no so teis sob o ponto de
processados aos pares, muitas vezes em vista prtico.
um anel dentro de outro. Ocorrem na soluo de problemas quando
Quando n mil, o nmero de operaes se usa fora bruta para resolv-los.
da ordem de 1 milho. Quando n 20, o tempo de execuo
Sempre que n dobra, o tempo de cerca de 1 milho. Quando n dobra, o
execuo multiplicado por 4. tempo fica elevado ao quadrado.
teis para resolver problemas de
f (n) = O(n!).
tamanhos relativamente pequenos.
Um algoritmo de complexidade O(n!)
f (n) = O(n3 ). dito de complexidade exponencial, apesar
Um algoritmo de complexidade O(n3 ) de O(n!) ter comportamento muito pior do
dito de complexidade cbica. que O(2n ).
teis apenas para resolver pequenos Geralmente ocorrem quando se usa fora
problemas. bruta para na soluo do problema.
Quando n 100, o nmero de operaes n = 20 20! = 2432902008176640000, um
da ordem de 1 milho. nmero com 19 dgitos.
Sempre que n dobra, o tempo de n = 40 um nmero com 48 dgitos.
execuo fica multiplicado por 8.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 48 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 49

Comparao de Funes de Algoritmos Polinomiais


Complexidade
Algoritmo exponencial no tempo de
Funo Tamanho n execuo tem funo de complexidade
de custo 10 20 30 40 50 60
O(cn ), c > 1.
n 0,00001 0,00002 0,00003 0,00004 0,00005 0,00006
s s s s s s Algoritmo polinomial no tempo de execuo
n2 0,0001 0,0004 0,0009 0,0016 0,0.35 0,0036 tem funo de complexidade O(p(n)), onde
s s s s s s
p(n) um polinmio.
n3 0,001 0,008 0,027 0,64 0,125 0.316
s s s s s s A distino entre estes dois tipos de
0,1 3,2 24,3 1,7 5,2 13 algoritmos torna-se significativa quando o
n5
s s s min min min tamanho do problema a ser resolvido cresce.
2n 0,001 1 17,9 12,7 35,7 366
s s min dias anos sc. Por isso, os algoritmos polinomiais so muito
0,059 58 6,5 3855 108 1013
mais teis na prtica do que os exponenciais.
3n
s min anos sc. sc. sc.
Algoritmos exponenciais so geralmente
simples variaes de pesquisa exaustiva.
Funo de Computador Computador Computador
custo atual 100 vezes 1.000 vezes Algoritmos polinomiais so geralmente
de tempo mais rpido mais rpido
obtidos mediante entendimento mais
profundo da estrutura do problema.
n t1 100 t1 1000 t1
n 2
t2 10 t2 31, 6 t2 Um problema considerado:
3
n t3 4, 6 t3 10 t3 intratvel: se no existe um algoritmo
2n t4 t4 + 6, 6 t4 + 10 polinomial para resolv-lo.
bem resolvido: quando existe um
algoritmo polinomial para resolv-lo.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 50 Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 51

Algoritmos Polinomiais Algoritmos Exemplo de Algoritmo Exponencial


Exponenciais
Um caixeiro viajante deseja visitar n cidades
A distino entre algoritmos polinomiais de tal forma que sua viagem inicie e termine
eficientes e algoritmos exponenciais em uma mesma cidade, e cada cidade deve
ineficientes possui vrias excees. ser visitada uma nica vez.

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

Exemplo de Algoritmo Exponencial Tcnicas de Anlise de Algoritmos

Um algoritmo simples seria verificar todas as Determinar o tempo de execuo de um


rotas e escolher a menor delas. programa pode ser um problema matemtico
complexo;
H (n 1)! rotas possveis e a distncia total
percorrida em cada rota envolve n adies, Determinar a ordem do tempo de execuo,
logo o nmero total de adies n!. sem preocupao com o valor da constante
envolvida, pode ser uma tarefa mais simples.
No exemplo anterior teramos 24 adies.
A anlise utiliza tcnicas de matemtica
Suponha agora 50 cidades: o nmero de
discreta, envolvendo contagem ou
adies seria 50! 1064 .
enumerao dos elementos de um conjunto:
Em um computador que executa 109 adies manipulao de somas,
por segundo, o tempo total para resolver o
produtos,
problema com 50 cidades seria maior do que
1045 sculos s para executar as adies. permutaes,
fatoriais,
O problema do caixeiro viajante aparece com
freqncia em problemas relacionados com coeficientes binomiais,
transporte, mas tambm aplicaes soluo de equaes de recorrncia.
importantes relacionadas com otimizao de
caminho percorrido.

Projeto de Algoritmos Cap.1 Introduo Seo 1.4 54 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 55

Anlise do Tempo de Execuo Procedimento no Recursivo


Comando de atribuio, de leitura ou de Algoritmo para ordenar os n elementos de um
escrita: O(1). conjunto A em ordem ascendente.

Seqncia de comandos: determinado pelo package cap1;


maior tempo de execuo de qualquer public class Ordenacao {
comando da seqncia. public static void ordena ( int v [ ] , int n) {
(1) for ( int i = 0; i < n 1; i ++) {
Comando de deciso: tempo dos comandos
(2) int min = i ;
dentro do comando condicional, mais tempo (3) for ( int j = i + 1; j < n ; j ++)
para avaliar a condio, que O(1). (4) i f ( v [ j ] < v [min] )
Anel: soma do tempo de execuo do corpo (5) min = j ;

do anel mais o tempo de avaliar a condio / Troca v[min] e v[i] /


(6) int x = v [min ] ;
para terminao (geralmente O(1)),
(7) v [min] = v [ i ] ;
multiplicado pelo nmero de iteraes.
(8) v[ i ] = x;
Procedimentos no recursivos: cada um }
deve ser computado separadamente um a }
um, iniciando com os que no chamam outros }
procedimentos. Avalia-se ento os que so
chamam os j avaliados (utilizando os tempos Seleciona o menor elemento do conjunto.
desses). O processo repetido at chegar no Troca este com o primeiro elemento v [0].
programa principal.
Repita as duas operaes acima com os
Procedimentos recursivos: associada uma n 1 elementos restantes, depois com os
funo de complexidade f (n) desconhecida, n 2, at que reste apenas um.
onde n mede o tamanho dos argumentos.
Projeto de Algoritmos Cap.1 Introduo Seo 1.4 56 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 57

Anlise do Procedimento no Anlise do Procedimento no


Recursivo Recursivo

Anel Interno Anel Externo

Contm um comando de deciso, com um Contm, alm do anel interno, quatro


comando apenas de atribuio. Ambos levam comandos de atribuio.
tempo constante para serem executados. O(max(1, (n i), 1, 1, 1)) = O(n i).

Quanto ao corpo do comando de deciso, A linha (1) executada n 1 vezes, e o


devemos considerar o pior caso, assumindo tempo total para executar o programa est
que serSS sempre executado. limitado ao produto de uma constante pelo
somatrio de (n i):
O tempo para incrementar o ndice do anel e 2
(n i) = n(n1)
Pn1
1 2
= n2 n2 = O(n2 )
avaliar sua condio de terminao O(1).
Considerarmos o nmero de comparaes
O tempo combinado para executar uma vez o
como a medida de custo relevante, o
anel O(max(1, 1, 1)) = O(1), conforme regra
programa faz (n2 )/2 n/2 comparaes para
da soma para a notao O.
ordenar n elementos.
Como o nmero de iteraes n i, o tempo
Considerarmos o nmero de trocas, o
gasto no anel O((n i) 1) = O(n i),
programa realiza exatamente n 1 trocas.
conforme regra do produto para a notao O.

Projeto de Algoritmos Cap.1 Introduo Seo 1.4 58 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 59

Procedimento Recursivo Anlise do Procedimento Recursivo

void pesquisa(n) { Seja T (n) uma funo de complexidade que


(1) i f (n <= 1) represente o nmero de inspees nos n
(2) inspecione elemento e termine elementos do conjunto.
else {
(3) para cada um dos n elementos inspecione elemento ; O custo de execuo das linhas (1) e (2)
(4) pesquisa(n/ 3 ) ; O(1) e o da linha (3) exatamente n.
}
Usa-se uma equao de recorrncia para
}
determinar o no de chamadas recursivas.

Para cada procedimento recursivo O termo T (n) especificado em funo dos


associada uma funo de complexidade f (n) termos anteriores T (1), T (2), . . ., T (n 1).
desconhecida, onde n mede o tamanho dos
T (n) = n + T (n/3), T (1) = 1 (para n = 1
argumentos para o procedimento.
fazemos uma inspeo)
Obtemos uma equao de recorrncia para
Por exemplo, T (3) = T (3/3) + 3 = 4,
f (n).
T (9) = T (9/3) + 9 = 13, e assim por diante.
Equao de recorrncia: maneira de definir
Para calcular o valor da funo seguindo a
uma funo por uma expresso envolvendo a
definio so necessrios k 1 passos para
mesma funo.
computar o valor de T (3k ).
Projeto de Algoritmos Cap.1 Introduo Seo 1.4 60 Projeto de Algoritmos Cap.1 Introduo Seo 1.4 61

Exemplo de Resoluo de Equao de Exemplo de Resoluo de Equao de


Recorrncia Recorrncia

Sustitui-se os termos T (k), k < n, at que T (n) = n + n (1/3) + n (1/32 ) + n (1/33 ) + +


todos os termos T (k), k > 1, tenham sido + (n/3/3 /3)
substitudos por frmulas contendo apenas
Se desprezarmos o termo T (n/3/3 /3),
T (1).
quando n tende para infinito,
 ento

i 1 3n
T (n) = n i=0 (1/3) =n =
P
T (n) = n + T (n/3) 1 31 2

T (n/3) = n/3 + T (n/3/3) Se considerarmos o termo T (n/3/3/3 /3) e


T (n/3/3) = n/3/3 + T (n/3/3/3) denominarmos x o nmero de subdivises
.. .. por 3 do tamanho do problema, ento
. .
n/3x = 1, e n = 3x . Logo x = log3 n.
T (n/3/3 /3) = n/3/3 /3 + T (n/3 /3)
Lembrando que T (1) = 1 temos
Adicionando lado a lado, temos T (n) = x1 n n Px1 i
i=0 3i + T ( 3x ) = n i=0 (1/3) + 1 =
P

T (n) = n + n (1/3) + n (1/32 ) + n (1/33 ) + n(1( 13 )x ) 3n


(1 13 )
+1= 2
21
+ (n/3/3 /3) que representa a soma de
uma srie geomtrica de razo 1/3, Logo, o programa do exemplo O(n).
multiplicada por n, e adicionada de
T (n/3/3 /3), que menor ou igual a 1.

Projeto de Algoritmos Cap.1 Introduo Seo 1.5 62 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 63

A Linguagem de Programao Java A Linguagem de Programao Java

Programao orientada a objetos: nasceu Programao orientada a objetos: permite


porque algumas linguagens procedimentais que objetos do mundo real que compartilham
se mostraram inadequadas para a construo propriedades e comportamentos comuns
de programas de grande porte. sejam agrupados em classes.
Estilo de programao diretamente suportado
Existem dois tipos de problemas:
pelo conceito de classe em Java.
1. Falta de correspondncia entre o
Pode-se tambm impor restries de
programa e o mundo real: Os
visibilidade aos dados de um programa.
procedimentos implementam tarefas e
estruturas de dados armazenam Classes e objetos so os conceitos
informao, mas a maioria dos objetos do fundamentais nas linguagens orientadas a
mundo real contm as duas coisas. objeto.
2. Organizao interna dos programas: A linguagem Java possui um grau de
No existe uma maneira flexvel para dizer orientao a objetos maior do que a
que determinados procedimentos linguagem C++.
poderiam acessar uma varivel enquanto Java no totalmente orientada a objetos
outros no. como a linguagem Smalltalk.
Java no totalmente orientada a objetos
porque, por questes de eficincia, foram
mantidos alguns tipos primitivos e suas
operaes.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 64 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 65

Principais Componentes de um Principais Componentes de um


Programa Java Programa Java

Em Java, as funes e os procedimentos so O conceito de classe nasceu da necessidade


chamados de mtodos. de se criar diversos objetos de um mesmo
tipo.
Um objeto contm mtodos e variveis que
Dizemos que um objeto pertence a uma
representam seus campos de dados
classe ou, mais comumente, que uma
(atributos).
instncia
Ex: um objeto painelDeControle deveria
conter no somente os mtodos ligaForno package cap1;
class PainelDeControle {
e desligaForno, mas tambm as variveis
private float temperaturaCorrente ;
temperaturaCorrente e
private float temperaturaDesejada;
temperaturaDese-jada.

O conceito de objeto resolve bem os public void ligaForno ( ) {

problemas apontados anteriormente. / / cdigo do mtodo


}
Os mtodos ligaForno e desligaForno public void desligaForno ( ) {
podem acessar as variveis / / cdigo do mtodo
temperaturaCorrente e }
temperaturaDesejada, mas elas ficam }
escondidas de outros mtodos que no
fazem parte do objeto painelDeControle. A palavra chave class introduz a classe
PainelDeControle.
A palavra chave void utilizada para indicar
que os mtodos no retornam nenhum valor.

Projeto de Algoritmos Cap.1 Introduo Seo 1.5 66 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 67

Principais Componentes de um Herana e Polimorfismo


Programa Java
Herana: criao de uma classe a partir de
Um objeto em Java criado usando a palavra uma outra classe.
chave new
A classe estendida a partir da classe base
necessrio armazenar uma referncia para usando a palavra chave extends.
ele em uma varivel do mesmo tipo da classe,
A classe estendida (subclasse) tem todas as
como abaixo:
caractersticas da classe base (superclasse)
PainelDeControle painel1, painel2; mais alguma caracterstica adicional.
Posteriormente, cria-se os objetos, como a Polimorfismo: tratamento de objetos de
seguir: classes diferentes de uma mesma forma.
painel1 = new PainelDeControle ();
As classes diferentes devem ser derivadas da
painel2 = new PainelDeControle ();
mesma classe base.
Outras partes do programa interagem com os
mtodos dos objetos por meio do operador
(.), o qual associa um objeto com um de seus
mtodos, como a seguir:
painel1.ligaForno ();
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 68 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 69

Herana e Polimorfismo Objetos e Tipos Genricos

package cap1; Uma estrutura de dados genrica quando o


class Empregado { tipo dos dados armazenados na estrutura
protected float salario ; definido na aplicao que a utiliza (objetos
public float salarioMensal ( ) { return salario ; } genricos).
public void imprime ( ) { System. out . println ( "Empregado" ) ; }
} Um objeto genrico pode armazenar uma
class Secretaria extends Empregado { referncia para um objeto de qualquer classe
private int velocidadeDeDigitacao ; (classe Object em Java).
public void imprime ( ) { System. out . println ( "Secretaria" ) ; }
}
Os mecanismos de herana e polimorfismo
class Gerente extends Empregado { que permitem a implementao de estruturas
private float bonus; de dados genricas.
public float salarioMensal ( ) { return salario + bonus; }
package cap1. objetogenerico ;
public void imprime ( ) { System. out . println ( "Gerente" ) ; }
public class Lista {
}
private static class Celula {
public class Polimorfismo {
Object item ; Celula prox ;
public static void main ( String [ ] args ) {
}
Empregado empregado = new Empregado ( ) ;
private Celula primeiro , ultimo ;
Empregado secretaria = new Secretaria ( ) ;
}
Empregado gerente = new Gerente ( ) ;
empregado.imprime ( ) ; secretaria .imprime ( ) ;
gerente .imprime ( ) ; O objeto item definido como um objeto
} genrico, assim Lista pode ter objetos de
} classes distintas em cada item

Projeto de Algoritmos Cap.1 Introduo Seo 1.5 70 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 71

Objetos e Tipos Genricos Sobrecarga


Para evitar que se declare o tipo de cada A sobrecarga acontece quando determinado
objeto a ser inserido ou retirado da lista, a objeto se comporta de diferentes formas.
Verso 5 da linguagem Java introduziu um
mecanismo de definio de um tipo genrico. um tipo de polimorfismo ad hoc, no qual um
identificador representa vrios mtodos com
Tipo genrico: definio de um parmetro
computaes distintas.
de tipo que deve ser especificado na
aplicao que utiliza a estrutura de dados: public float salarioMensal ( float desconto ) {
return salario + bonus desconto;
package cap1. tipogenerico ;
}
public class Lista<T> {
private static class Celula<T> {
T item ;
O programa acima apresenta um exemplo de
Celula<T> prox ; sobrecarga do mtodo salarioMensal da
} classe Gerente mostrada em um programa
private Celula<T> primeiro , ultimo ; anterior, em que um desconto subtrado de
} salario + bonus.

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

Sobrescrita Programa Principal

A ocultao de um mtodo de uma classe package cap1;


mais genrica em uma classe mais especfica class ContaBancaria {
private double saldo ;
chamada de sobrescrita
public ContaBancaria (double saldoInicial ) {
Por exemplo, o mtodo imprime da classe saldo = saldoInicial ;
Empregado apresentada nas parte de }
Herana e Polimorfismo, foi sobrescrito nas public void deposito (double valor ) {

classes Gerente e Secretaria. saldo = saldo + valor ;


}
Para sobrescrever um mtodo em uma public void saque (double valor ) {
subclasse preciso que ele tenha a mesma saldo = saldo valor ;
assinatura na superclasse. }
public void imprime ( ) {
System. out . println ( "saldo=" + saldo ) ;
}
}
public class AplicacaoBancaria {
public static void main ( String [ ] args ) {
ContaBancaria conta1 = new ContaBancaria (200.00);
System. out . print ( "Antes da movimentacao, " ) ;
conta1.imprime ( ) ;
conta1. deposito (50.00); conta1.saque (70.00);
System. out . print ( "Depois da movimentacao, " ) ;
conta1.imprime ( ) ;
}
}

Projeto de Algoritmos Cap.1 Introduo Seo 1.5 74 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 75

Programa Principal Modificadores de Acesso

Programa anterior modela uma conta Modificadores de acesso: determinam


bancria tpica com as operaes: cria uma quais outros mtodos podem acessar um
conta com um saldo inicial; imprime o saldo; campo de dados ou um mtodo.
realiza um depsito; realiza um saque e Um campo de dados ou um mtodo que seja
imprime o novo saldo; precedido pelo modificador private pode ser
acessado somente por mtodos que fazem
A classe Contabancaria tem um campo de
parte da mesma classe.
dados chamado saldo e trs mtodos
chamados deposito, saque e imprime. Um campo de dados ou um mtodo que seja
precedido pelo modificador public pode ser
Para compilar o Programa acima a partir de acessado por mtodos de outras classes.
uma linha de comando em MS-DOS ou Linux,
Classe modificada com o modificador
fazemos:
public indica que a classe visvel
javac -d ./ AplicacaoBancaria.java externamente ao pacote em que ela foi
e para execut-lo, fazemos: definida (classe AplicacaoBancaria,
package cap1).
java cap1 .AplicacaoBancaria
Em cada arquivo de um programa Java s
A classe ContaBancaria tem um mtodo pode existir uma classe modificada por
especial denominado construtor, que public, e o nome do arquivo deve ser o
chamado automaticamente sempre que um mesmo dado classe.
novo objeto criado com o comando new e
Os campos de dados de uma classe so
tem sempre o mesmo nome da classe.
geralmente feitos private e os mtodos so
tornados public.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 76 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 77

Modificadores de Acesso Modificadores de Acesso

Modificador protected: utilizado para permitir package cap1;


que somente subclasses de uma classe mais class A {
genrica possam acessar os campos de public static int total ;
dados precedidos com protected. public int media;
}
Um campo de dados ou um mtodo de uma public class B {
classe declarado como static pertence public static void main ( String [ ] args ) {
classe e no s suas instncias, ou seja, A a = new A( ) ; a. total = 5; a.media = 5;
somente um campo de dados ou um mtodo A b = new A( ) ; b. total = 7; b.media = 7;
ser criado pelo compilador para todas as }
instncias. }

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

package cap1; A linguagem Java permite agrupar as classes


public class EncontraMax { e as interfaces em pacotes(do ingls,
public static void main ( String [ ] args ) { package.
MeuItem v [ ] = new MeuItem[ 2 ] ; Convenientes para organizar e separar as
v[0] = new MeuItem ( 3 ) ; v[1] = new MeuItem (10);
classes de um conjunto de programas de
MeuItem max = (MeuItem) Max.max ( v , 2 ) ;
outras bibliotecas de classes, evitando
System. out . println ( "Maior chave : " + max.chave) ;
colises entre nomes de classes
}
desenvolvidas por uma equipe composta por
}
muitos programadores.

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

Pacotes Classes Internas

possvel utilizar determinada classe de um Java permite realizar aninhamento de classes


pacote sem import-la, para isso basta como abaixo:
prefixar o nome da classe com o nome do package cap1;
pacote durante a declarao de uma varivel. public class Lista {
Exemplo: / / Cdigo da classe Lista
cap3.arranjo.Lista lista; private class Celula {
/ / Cdigo da classe Celula
Para que uma classe possa ser importada em }
um pacote diferente do que ela foi definida }
preciso declar-la como pblica por meio do
modificador public. Classes internas so muito teis para evitar
conflitos de nomes.
Se o comando package no colocado no
cdigo fonte, ento Java adiciona as classes Os campos e mtodos declarados na classe
daquele cdigo fonte no que chamado de externa podem ser diretamente acessados
pacote default dentro da classe interna, mesmo os
declarados como protected ou private, mas
Quando o modificador de um campo ou o contrrio no verdadeiro.
mtodo no estabelecido, diz-se que o
As classes externas s podem ser declaradas
campo ou mtodo possui visibilidade default,
como pblicas ou com visibilidade default.
ou seja, qualquer objeto de uma classe do
pacote pode acessar diretamente aquele As classes internas podem tambm ser
campo (ou mtodo). qualificadas com os modificadores private,
protected e static e o efeito mesmo obtido
sobre qualquer atributo da classe externa.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 84 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 85

O Objeto this Excees

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:

int divisao ( int a, int b) {


No exemplo acima, o parmetro saldo do try {
mtodo alteraSaldo possui o mesmo nome do i f (b == 0) throw new Exception ( "Divisao por zero" ) ;
campo de instncia saldo da classe Conta. return (a/b) ;
}
Para diferenci-los necessrio qualificar o catch ( Exception objeto ) {
campo da instncia com o objeto this. System. out . println ( "Erro : " + objeto .getMessage( ) ) ;
return ( 0 ) ;
}
}

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. }

O comando catch captura a exceo e Considerando que o mtodo divisao est


fornece o tratamento adequado. inserido em uma classe chamada Divisao, o
Uma abordagem mais elaborada para tratar trecho de cdigo abaixo ilustra como capturar
uma exceo separar o local onde a o objeto exceo que pode ser criado no
exceo tratada do local onde ela ocorreu. mtodo:
Divisao d = new Divisao ();
Importante pelo fato de que um trecho de
try {
cdigo em um nvel mais alto pode possuir
d.divisao (3, 0);
mais informao para decidir como melhor
}
tratar a exceo.
catch(Exception objeto) {
System.out.println("Erro:"+objeto.getMessage());
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 88 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 89

Sada de Dados Entrada de Dados

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

Diferenas entre Java e C++ Diferenas entre Java e C++

A maior diferena entre Java e C++ a Em Java e em C++ os objetos so criados


ausncia de apontadores em Java(no utiliza utilizando o operador new, entretanto, em
apontadores explicitamente). Java o valor retornado uma referncia ao
objeto criado, enquanto em C++ o valor
Java trata tipos de dados primitivos, tais como
retornado um apontador para o objeto
int, double e float, de forma diferente do
criado.
tramento dado a objetos.
A eliminao de apontadores em Java tem
Em Java, uma referncia pode ser vista como
por objetivo tornar o software mais seguro,
um apontador com a sintaxe de uma varivel.
uma vez que no possvel manipular o
A linguagem C++ tem variveis referncia, endereo de conta1 , evitando que algum
mas elas tm de ser especificadas de forma possa acidentalmente corromper o endereo.
explcita com o smbolo &.
Em C++, a memria alocada pelo operador
Outra diferena significativa est relacionada new tem de ser liberada pelo programador
com o operador de atribuio (=): quando no mais necessria, utilizando o
C++: aps a execuo de um comando operador delete.
com operador (=), passam a existir dois Em Java, a liberao de memria realizada
objetos com os mesmos dados estticos. pelo sistema de forma transparente para o
Java: aps a execuo de um comando programador (coleta de lixo, do ingls
com operador (=), passam a existir duas garbage collection).
variveis que se referem ao mesmo objeto.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 92 Projeto de Algoritmos Cap.1 Introduo Seo 1.5 93

Diferenas entre Java e C++ Diferenas entre Java e C++


Em Java, os objetos so passados para Em C++ possvel redefinir operadores
mtodos como referncias aos objetos como +, , , =, de tal forma que eles se
criados, entretanto, os tipos primitivos de comportem de maneira diferente para os
dados em Java so sempre passados por objetos de uma classe particular, mas em
valor Java, no existe sobrecarga de operadores.
Em C++ uma passagem por referncia deve
Por questes de eficincia foram mantidos
ser especificada utilizando-se o &, caso
diversos tipos primitivos de dados, assim
contrrio, temos uma passagem por valor.
variveis declaradas como um tipo primitivo
No caso de tipos primitivos de dados, tanto em Java permitem acesso direto ao seu valor,
em Java quanto em C++ o operador de exatamente como ocorre em C++.
igualdade (==) diz se duas variveis so
iguais. Em Java, o tipo boolean pode assumir os
valores false ou true enquanto em C++ os
No caso de objetos, em C++ o operador diz
valores inteiros 0 e 1
se dois objetos contm o mesmo valor e em
Java o operador de igualdade diz se duas O tipo byteno existe em C++.
referncias so iguais, isto , se apontam
O tipo char em Java sem sinal e usa dois
para o mesmo objeto.
bytes para acomodar a representao
Em Java, para verificar se dois objetos
diferentes contm o mesmo valor O tipo Unicode de caracteres acomoda
necessrio utilizar o mtodo equals da classe caracteres internacionais de linguas tais
Object (O programador deve realizar a como chins e japons.
sobrescrita desse mtodo para estabelecer a
relao de igualdade).

Projeto de Algoritmos Cap.1 Introduo Seo 1.5 94

Diferenas entre Java e C++

O tipo short tem tratamento parecido em


Java e C++.

Em Java, o tipo int tem sempre 32 bits,


enquanto em C++ de tamanho, dependendo
de cada arquitetura do computador onde vai
ser executado.

Em Java, o tipo float usa o sufixo F (por


exemplo, 2.357F) enquanto o tipo double no
necessita de sufixo.

Em Java, o tipo long usa o sufixo L (por


exemplo, 33L); quaisquer outros tipos inteiros
no necessitam de sufixo.

You might also like