Você está na página 1de 21

Projeto de Algoritmos Cap.

1 Introduo

Contedo do Captulo
1.1 Algoritmos, Estruturas de Dados e Programas
1.2 Tipos de Dados e Tipos Abstratos de Dados

Projeto de Algoritmos

1.3 Medida do tempo de Execuo de um Programa

Introduo

1.3.1 Comportamento Assinttico de Funes


1.3.2 Classes de Comportamento Assinttico
1.4 Tcnicas de Anlise de Algoritmos
1.5 Pascal

ltima alterao: 30 de Agosto de 2010

Transparncias

elaboradas por Charles Ornelas Almeida, Israel Guerra e Nivio Ziviani

Projeto de Algoritmos Cap.1 Introduo Seo 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,
uma receita de culinria.
Sequncia 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.
Executando a operao a + b percebemos um padro de
comportamento, mesmo que a operao seja realizada para
valores diferentes de a e b.

Projeto de Algoritmos Cap.1 Introduo Seo 1.1

Estruturas de dados
Estruturas de dados e algoritmos esto intimamente ligados:
no se pode estudar estruturas de dados sem considerar os
algoritmos associados a elas,
assim como a escolha dos algoritmos em geral depende da
representao e da estrutura dos dados.
Para resolver um problema necessrio escolher uma abstrao da
realidade, em geral mediante a definio de um conjunto de dados que
representa a situao real.
A seguir, deve ser escolhida a forma de representar esses dados.

Projeto de Algoritmos Cap.1 Introduo Seo 1.1

Projeto de Algoritmos Cap.1 Introduo Seo 1.1

Programas

Escolha da Representao dos Dados

Programar basicamente estruturar dados e construir algoritmos.

A escolha da representao dos dados determinada, entre outras,


pelas operaes a serem realizadas sobre os dados.

Programas so formulaes concretas de algoritmos abstratos,


baseados em representaes e estruturas especficas de dados.

Considere a operao de adio:


Para pequenos nmeros, uma boa representao por meio de
barras verticais (caso em que a operao de adio

Programas representam uma classe especial de algoritmos capazes


de serem seguidos por computadores.

J a representao por dgitos decimais requer regras


relativamente complicadas, as quais devem ser memorizadas.

Um computador s capaz de seguir programas em linguagem de


mquina (sequncia de instrues obscuras e desconfortveis).

Entretanto, quando consideramos a adio de grandes nmeros


mais fcil a representao por dgitos decimais (devido ao princpio
baseado no peso relativo da posio de cada dgito).

necessrio construir linguagens mais adequadas, que facilitem a


tarefa de programar um computador.

Projeto de Algoritmos Cap.1 Introduo Seo 1.2

Tipos de Dados
Caracteriza o conjunto de valores a que uma constante pertence, ou
que podem ser assumidos por uma varivel ou expresso, ou que
podem ser gerados por uma funo.
Tipos simples de dados so grupos de valores indivisveis (como os
tipos bsicos integer, boolean, char e real do Pascal).
Exemplo: uma varivel do tipo boolean pode assumir o valor
verdadeiro ou o valor falso, e nenhum outro valor.
Os tipos estruturados em geral definem uma coleo de valores
simples, ou um agregado de valores de tipos diferentes.

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

Tipos Abstratos de Dados (TAD)


Modelo matemtico, acompanhado das operaes definidas sobre o
modelo.
Exemplo: o conjunto dos inteiros acompanhado das operaes de
adio, subtrao e multiplicao.
TADs so utilizados como base para o projeto de algoritmos.
A implementao do algoritmo em uma linguagem de programao
exige a representao do TAD em termos dos tipos de dados e dos
operadores suportados.
A representao do modelo matemtico por trs do tipo abstrato de
dados realizada mediante uma estrutura de dados.
Podemos considerar TADs como generalizaes de tipos primitivos e
procedimentos como generalizaes de operaes primitivas.
O TAD encapsula tipos de dados. A definio do tipo e todas as
operaes ficam localizadas numa seo do programa.

Projeto de Algoritmos Cap.1 Introduo Seo 1.2

Implementao de TADs (1)

Cada operao do tipo abstrato de dados implementada como um


procedimento na linguagem de programao escolhida.

1. faa a lista vazia;

Qualquer alterao na implementao do TAD fica restrita parte


encapsulada, sem causar impactos em outras partes do cdigo.

2. obtenha o primeiro elemento da lista; se a lista estiver vazia, ento retorne


nulo;

Cada conjunto diferente de operaes define um TAD diferente,


mesmo que atuem sob um mesmo modelo matemtico.

3. insira um elemento na lista.

H vrias opes de estruturas de dados que permitem uma


implementao eficiente para listas (por ex., o tipo estruturado arranjo).

Medida do Tempo de Execuo de um Programa


O projeto de algoritmos fortemente influenciado pelo estudo de seus
comportamentos.
Depois que um problema analisado e decises de projeto so
finalizadas, necessrio estudar as vrias opes de algoritmos a
serem utilizados, considerando os aspectos de tempo de execuo e
espao ocupado.
Muitos desses algoritmos so encontrados em reas como pesquisa
operacional, otimizao, teoria dos grafos, estatstica, probabilidades,
entre outras.

Implementao de TADs (2)

Considere uma uma lista de inteiros. Poderamos definir TAD Lista,


com as seguintes operaes:

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Projeto de Algoritmos Cap.1 Introduo Seo 1.2

A escolha adequada de uma implementao depende fortemente das


operaes a serem realizadas sobre o modelo.

10

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Tipos de Problemas na Anlise de Algoritmos


Anlise de um algoritmo particular.

Qual o custo de usar um dado algoritmo para resolver um


problema especfico?
Caractersticas que devem ser investigadas:
anlise do nmero de vezes que cada parte do algoritmo deve
ser executada,
estudo da quantidade de memria necessria.

Anlise de uma classe de algoritmos.

Qual o algoritmo de menor custo possvel para resolver um


problema particular?
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.

11

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

12

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

13

Medida do Custo pela Execuo do Programa

Custo de um Algoritmo

Tais medidas so inadequadas e os resultados jamais devem ser


generalizados:

Determinando o menor custo possvel para resolver problemas de uma


classe, temos a medida da dificuldade inerente para resolver o
problema.

os resultados so dependentes do compilador que pode favorecer


algumas construes em detrimento de outras;

Quando o custo de um algoritmo igual ao menor custo possvel, o


algoritmo timo para a medida de custo considerada.

os resultados dependem do hardware;


quando grandes quantidades de memria so utilizadas, as
medidas de tempo podem depender desse aspecto.

Podem existir vrios algoritmos para resolver o mesmo problema.


Se a mesma medida de custo aplicada a diferentes algoritmos, ento
possvel compar-los e escolher o mais adequado.

Apesar disso, h argumentos a favor de medidas reais de tempo.

Ex.: quando h vrios algoritmos para resolver um mesmo tipo de


problema, todos com um custo de execuo dentro da 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

Medida do Custo por meio de um Modelo Matemtico


Usa um modelo matemtico baseado em um computador idealizado.
Deve ser especificado o conjunto de operaes e seus custos de
execues.
mais usual ignorar o custo de algumas das operaes e considerar
apenas as operaes mais significativas.
Ex.: algoritmos de ordenao. Consideramos o nmero de
comparaes entre os elementos do conjunto e ignoramos operaes
aritmticas, de atribuio e manipulaes de ndices, entre outras.

14

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Funo de Complexidade
Para medir o custo de execuo de um algoritmo comum definir uma
funo de custo ou funo de complexidade f .
f (n) a medida do tempo necessrio para executar um algoritmo para
um problema de tamanho n.
Funo de complexidade de tempo: f (n) mede o tempo necessrio
para executar um algoritmo em um problema de tamanho n.
Funo de complexidade de espao: f (n) mede a memria
necessria para executar um algoritmo em um problema de tamanho
n.
Utilizaremos f para denotar uma funo de 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.

15

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

16

Exemplo - Maior Elemento (1)

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

17

Exemplo - Maior Elemento (2)

Considere o algoritmo para encontrar o maior elemento de um vetor de


inteiros A[1..n], n 1.

Teorema: Qualquer algoritmo para encontrar o maior elemento de um


conjunto com n elementos, n 1, faz pelo menos n 1 comparaes.

function Max ( var A: TipoVetor ) : integer ;

Prova: Cada um dos n 1 elementos tem de ser mostrado, por meio


de comparaes, que menor do que algum outro elemento.

var i , Temp: integer ;


begin

Logo n 1 comparaes so necessrias. 2

Temp : = A[ 1 ] ;
for i := 2 to N do i f Temp < A[ i ] then Temp : = A[ i ] ;

O teorema diz que, se o nmero de comparaes for utilizado como


medida de custo, ento a funo Max tima.

Max : = Temp;
end;

Seja f uma funo de complexidade tal que f (n) o nmero de


comparaes entre os elementos de A, se A contiver n elementos.
Logo f (n) = n 1, para n > 0.
Vamos provar que o algoritmo apresentado timo.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Tamanho da Entrada de Dados

18

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Melhor Caso, Pior Caso e Caso Mdio (1)

A medida do custo de execuo de um algoritmo depende


principalmente do tamanho da entrada dos dados.

Melhor caso: menor tempo de execuo sobre todas as entradas de


tamanho n.

comum considerar o tempo de execuo de um programa como uma


funo do tamanho da entrada.

Pior caso: maior tempo de execuo sobre todas as entradas de


tamanho n.

Para alguns algoritmos, o custo de execuo uma funo da entrada


particular dos dados, no apenas do tamanho da entrada.

Se f uma funo de complexidade baseada na anlise de pior caso,


o custo de aplicar o algoritmo nunca maior do que f (n).

No caso da funo Max do programa do exemplo, o custo uniforme


sobre todos os problemas de tamanho n.

Caso mdio (ou caso esperado): mdia dos tempos de execuo de


todas as entradas de tamanho n.

J para um algoritmo de ordenao isso no ocorre: se os dados de


entrada j estiverem quase ordenados, ento o algoritmo pode ter que
trabalhar menos.

19

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

20

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

21

Exemplo - Registros de um Arquivo

Melhor Caso, Pior Caso e Caso Mdio (2)

Considere o problema de acessar os registros de um arquivo.

Na anlise do caso esperado, uma distribuio de probabilidades


sobre o conjunto de entradas de tamanho n suposta e o custo mdio
obtido com base nessa distribuio.

Cada registro contm uma chave nica que utilizada para recuperar
registros do arquivo.

A anlise do caso mdio geralmente muito mais difcil de obter do


que as anlises do melhor e do pior caso.

O problema: dada uma chave qualquer, localize o registro que


contenha esta chave.

comum supor uma distribuio de probabilidades em que todas as


entradas possveis so igualmente provveis.

O algoritmo mais simples o que faz a pesquisa sequencial.


Seja f uma funo de complexidade tal que f (n) o nmero de
registros consultados no arquivo (nmero de vezes que a chave de
consulta comparada com a chave de cada registro).

Na prtica isso nem sempre verdade.

melhor caso: f (n) = 1 (registro procurado o primeiro consultado);


pior caso: f (n) = n (registro procurado o ltimo consultado ou
no est presente no arquivo);
caso mdio: f (n) = (n + 1)/2.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

22

Exemplo - Registros de um Arquivo

Exemplo - Maior e Menor Elemento (1)

No estudo do caso mdio, vamos considerar que toda pesquisa


recupera um registro.
Se pi for a probabilidade de que o i-simo registro seja procurado, e
para recuperar o i-simo registro so necessrias i comparaes,
ento
f (n) = 1 p1 + 2 p2 + 3 p3 + + n pn .
Para calcular f (n) basta conhecer a distribuio de probabilidades pi .
Se cada registro tiver a mesma probabilidade de ser acessado que
todos os outros, ento pi = 1/n, 1 i n.
Nesse caso f (n) = n1 (1 + 2 + 3 + + n) =

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

1
n

n(n+1)
2

n+1

A anlise do caso esperado revela que uma pesquisa com sucesso


examina aproximadamente metade dos registros.

Encontrar o maior e o menor elemento de A[1..n], n 1.


Um algoritmo simples pode ser derivado do algoritmo para achar o
maior elemento.
function Max ( var A: TipoVetor ) : integer ;
var i , Temp: integer ;
begin
Temp : = A[ 1 ] ;
for i := 2 to N do i f Temp < A[ i ] then Temp : = A[ i ] ;
Max : = Temp;
end;

Seja f (n) o nmero de comparaes entre os n elementos de As.


f (n) = 2(n 1), para n > 0, no melhor caso, pior caso e caso mdio.

23

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

24

Exemplo - Maior e Menor Elemento (2)

Considerando o nmero de comparaes realizadas, existe a


possibilidade de obter um algoritmo mais eficiente:

var i : integer ;
begin

1) Compare os elementos de A aos pares, separando-os em dois


subconjuntos (maiores em um e menores em outro), a um custo de
n/2 comparaes.

Max : = A[ 1 ] ; Min : = A[ 1 ] ;
for i := 2 to N do
i f A[ i ] > Max then Max : = A[ i ] else i f A[ i ] < Min then Min : = A[ i ] ;
end;

2) O mximo obtido do subconjunto que contm os maiores


elementos, a um custo de n/2 1 comparaes.

MaxMin1 pode ser facilmente melhorado: a comparao A[i] < Min s


necessria quando a comparao A[i] > Max d falso.

3) O mnimo obtido do subconjunto que contm os menores


elementos, a um custo de n/2 1 comparaes.

Para a nova implementao temos:

melhor caso: f (n) = n 1 (elementos esto em ordem crescente);

pior caso: f (n) = 2(n 1) (elementos esto em ordem decrescente);

caso mdio: f (n) = 3n/2 3/2.

No caso mdio, A[i] maior do que Max a metade das vezes.


n1
2

3n
2

Exemplo - Maior e Menor Elemento (3)


procedure MaxMin3 ( var A: TipoVetor ; var Max, Min : integer ) ;
var i , FimDoAnel: integer ;
begin
i f (N mod 2) > 0
then begin A[N+1] := A[N] ; FimDoAnel : = N; end else FimDoAnel : = N1;
i f A[1] > A[2]
then begin Max : = A[ 1 ] ; Min : = A[ 2 ] ; end
else begin Max : = A[ 2 ] ; Min : = A[ 1 ] ; end;
i := 3;
while i <= FimDoAnel do
begin i f A[ i ] > A[ i +1]
then begin i f A[ i ] > Max then Max : = A[ i ] ;
i f A[ i +1] < Min then Min : = A[ i +1]; end
else begin i f A[ i ] < Min then Min : = A[ i ] ;
i f A[ i +1] > Max then Max : = A[ i +1]; end;
end;
end;



Contm o mximo


Contm o mnimo

23 , para n > 0.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

i := i + 2;

25

Exemplo - Maior e Menor Elemento (3)

procedure MaxMin2 ( var A: TipoVetor ; var Max, Min : integer ) ;

Logo f (n) = n 1 +

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

26

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

27

Exemplo - Maior e Menor Elemento (3)


Os elementos de A so comparados dois a dois e os maiores so
comparados com Max e os menores com Min.
Quando n mpar, o elemento que est na posio A[n] duplicado
na posio A[n + 1] para evitar um tratamento de exceo.
+ n2
=
Para esta implementao, f (n) = n2 + n2
2
2
para o melhor caso, pior caso e caso mdio.

3n
2

2, para n > 0,

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

28

Comparao entre MaxMin1, MaxMin2 e MaxMin3

Existe possibilidade de obter um algoritmo MaxMin mais eficiente?


Para responder temos de conhecer o limite inferior para essa classe
de algoritmos.

Os algoritmos MaxMin2 e MaxMin3 so superiores ao algoritmo


MaxMin1 de forma geral.

Tcnica muito utilizada: uso de um orculo.

O algoritmo MaxMin3 superior ao algoritmo MaxMin2 com relao ao


pior caso e bastante prximo quanto ao caso mdio.

Dado um modelo de computao que expresse o comportamento do


algoritmo, o orculo informa o resultado de cada passo possvel (no
caso, o resultado de cada comparao).

f (n)

algoritmos

Melhor caso

Pior caso

Caso mdio

MaxMin1

2(n 1)

2(n 1)

2(n 1)

MaxMin2

n1

2(n 1)

3n/2 3/2

MaxMin3

3n/2 2

3n/2 2

3n/2 2

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Exemplo de Uso de um Orculo


Teorema: Qualquer algoritmo para encontrar o maior e o menor
elemento de um conjunto com n elementos no ordenados, n 1, faz
pelo menos 3n/2 2 comparaes.
Prova: Define um orculo que descreve o comportamento do
algoritmo por meio de um conjunto de ntuplas, mais um conjunto de
regras que mostram as tuplas possveis (estados) que um algoritmo
pode assumir a partir de uma dada tupla e uma nica comparao.
Uma 4tupla, representada por (a, b, c, d), onde os elementos de:
a nunca foram comparados;

b foram vencedores e nunca perderam em comparaes


realizadas;
c foram perdedores e nunca venceram em comparaes
realizadas;
d foram vencedores e perdedores em comparaes realizadas.

29

Limite Inferior - Uso de um Orculo

A tabela apresenta o nmero de comparaes dos programas


MaxMin1, MaxMin2 e MaxMin3.

Os trs

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Para derivar o limite inferior, o orculo procura sempre fazer com que o
algoritmo trabalhe o mximo, escolhendo como resultado da prxima
comparao aquele que cause o maior trabalho possvel necessrio
para determinar a resposta final.

30

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

Exemplo de Uso de um Orculo


O algoritmo inicia no estado (n, 0, 0, 0) e termina com (0, 1, 1, n 2).
Aps cada comparao a tupla (a, b, c, d) consegue progredir apenas
se ela assume um dentre os seis estados possveis abaixo:
(a 2, b + 1, c + 1, d) se a 2 (dois elementos de a so comparados)

(a 1, b + 1, c, d) ou (a 1, b, c + 1, d) ou (a 1, b, c, d + 1) se a 1
(um elemento de a comparado com um de b ou um de c)
(a, b 1, c, d + 1) se b 2 (dois elementos de b so comparados)

(a, b, c 1, d + 1) se c 2 (dois elementos de c so comparados)

O primeiro passo requer necessariamente a manipulao do


componente a.

O caminho mais rpido para levar a at zero requer n/2


mudanas de estado e termina com a tupla (0, n/2, n/2, 0) (por
meio de comparao dos elementos de a dois a dois).

31

Projeto de Algoritmos Cap.1 Introduo Seo 1.3

32

Exemplo de Uso de um Orculo

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

33

Comportamento Assinttico de Funes

A seguir, para reduzir o componente b at 1 so necessrias n/2 1


mudanas de estado (mnimo de comparaes necessrias para obter
o maior elemento de b).

O parmetro n fornece uma medida da dificuldade para se resolver o


problema.
Para valores suficientemente pequenos de n, qualquer algoritmo custa
pouco para ser executado, mesmo os ineficientes.

Idem para c, com n/2 1 mudanas de estado.


Logo, para obter o estado (0, 1, 1, n 2) a partir do estado (n, 0, 0, 0)
so necessrias

A escolha do algoritmo no um problema crtico para problemas de


tamanho pequeno.
Logo, a anlise de algoritmos realizada para valores grandes de n.

n/2 + n/2 1 + n/2 1 = 3n/2 2

Estuda-se o comportamento assinttico das funes de custo


(comportamento de suas funes de custo para valores grandes de n)

comparaes. 2
O teorema nos diz que se o nmero de comparaes entre os
elementos de um vetor for utilizado como medida de custo, ento o
algoritmo MaxMin3 timo.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

O comportamento assinttico de f (n) representa o limite do


comportamento do custo quando n cresce.

34

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

35

Notao O

Dominao assinttica
A anlise de um algoritmo geralmente conta com apenas algumas
operaes elementares.

Escrevemos g(n) = O(f (n)) para expressar que f (n) domina


assintoticamente g(n). L-se g(n) da ordem no mximo f (n).

A medida de custo ou medida de complexidade relata o crescimento


assinttico da operao considerada.

Exemplo: quando dizemos que o tempo de execuo T (n) de um


programa O(n2 ), significa que existem constantes c e m tais que,
para valores de n m, T (n) cn2 .

Definio: Uma funo f (n) domina assintoticamente outra funo


g(n) se existem duas constantes positivas c e m tais que, para n m,
temos |g(n)| c |f (n)|.
f,g
c f (n)
g(n)

Exemplo grfico de dominao assinttica que ilustra a notao O.


f,g
c f (n)

As funes g(n) e f (n) dominam assintoticamente uma a outra, desde que


|(n + 1)2 | 4|n2 | para n 1
e |n2 | |(n + 1)2 | para n 0.

O valor da constante m o menor


possvel, mas qualquer valor maior
vlido.

g(n)

Sejam g(n) = (n + 1)2 e f (n) = n2 .

Definio: Uma funo g(n) O(f (n)) se existem duas constantes


positivas c e m tais que g(n) cf (n), para todo n m.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

36

Exemplos de Notao O

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

37

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 , para n 0.

Isto porque (n + 1)2 4n2 para n 1.

A funo g(n) = 3n3 + 2n2 + n tambm O(n4 ), entretanto esta


afirmao mais fraca do que dizer que g(n) O(n3 ).

Exemplo: g(n) = n e f (n) = n2 .

Exemplo: g(n) = log5 n O(log n).

Sabemos que g(n) O(n2 ), pois para n 0, n n2 .

Entretanto f (n) no O(n).

O logb n difere do logc n por uma constante que no caso logb c.

Suponha que existam constantes c e m tais que para todo n m,


n2 cn.

Como n = clogc n , tomando o logaritmo base b em ambos os lados


da igualdade, temos que logb n = logb clogc n = logc n logb c.

Logo c n para qualquer n m, e no existe uma constante c que


possa ser maior ou igual a n para todo n.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

38

Operaes com a Notao O

39

Notao

f (n) = O(f (n))


c O(f (n)) = O(f (n))

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

c = constante

O(f (n)) + O(f (n)) = O(f (n))


O(O(f (n)) = O(f (n))
O(f (n)) + O(g(n)) = O(max(f (n), g(n)))
O(f (n))O(g(n)) = O(f (n)g(n))
f (n)O(g(n)) = O(f (n)g(n))
Exemplo: regra da soma O(f (n)) + O(g(n)).

Especifica um limite inferior para g(n).


Definio: Uma funo g(n) (f (n)) se existirem duas constantes c
e m tais que g(n) cf (n), para todo n m.
Exemplo: Para mostrar que g(n) = 3n3 + 2n2 (n3 ) basta fazer c = 1,
e ento 3n3 + 2n2 n3 para n 0.
Exemplo: Seja g(n) = n para n mpar (n 1) e g(n) = n2 /10 para n
par (n 0). Nesse caso g(n) (n2 ), para c = 1/10 e n = 0, 2, 4, 6, . . .
f,g

Suponha trs trechos cujos tempos so O(n), O(n2 ) e O(n log n).

g(n)

O tempo de execuo dos dois primeiros O(max(n, n2 )), que O(n2 ).

c f (n)

O tempo dos trs trechos ento O(max(n2 , n log n)), que O(n2 ).

Exemplo: O produto de [log n + k + O(1/n)] por [n + O( n)]

n log n + kn + O( n log n).

Para todos os valores direita de m,


o valor de g(n) est sobre ou acima
do valor de cf (n).

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

40

Notao

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

41

Exemplo de Notao

Definio: Uma funo g(n) (f (n)) se existirem constantes c1 , c2 e


m tais que 0 c1 f (n) g(n) c2 f (n), para todo n m.

Seja g(n) = n2 /3 2n. Vamos mostrar que g(n) = (n2 ).


Temos de obter c1 , c2 e m tais que c1 n2 31 n2 2n c2 n2 para todo n m.

Exemplo grfico para a notao

Dividindo por n2 leva a c1

f,g

c2 f ( n )

2
n

c2 .

O lado direito da desigualdade ser sempre vlido para qualquer valor de


n 1 quando escolhemos c2 1/3.

g(n)
c1 f ( n )

Escolhendo c1 1/21, o lado esquerdo da desigualdade ser vlido para


qualquer valor de n 7.

1
3

Logo, escolhendo c1 = 1/21, c2 = 1/3 e m = 7, verifica-se que


n2 /3 2n = (n2 ).

Dizemos que g(n) = (f (n)) se existirem constantes c1 , c2 e m tais


que, para todo n m, o valor de g(n) est sobre ou acima de c1 f (n) e
sobre ou abaixo de c2 f (n).

Outras constantes podem existir, mas o importante que existe alguma


escolha para as trs constantes.

Para todo n m, g(n) igual a f (n) a menos de uma constante.


Nesse caso, f (n) um limite assinttico firme.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

42

Notao o

43

Notao

Usada para definir um limite superior que no assintoticamente firme.


Definio: Uma funo g(n) o(f (n)) se, para qualquer constante
c > 0, ento 0 g(n) < cf (n) para todo n m.
Exemplo: 2n = o(n2 ), mas 2n2 6= o(n2 ).
Em g(n) = O(f (n)), a expresso 0 g(n) cf (n) vlida para
alguma constante c > 0, mas em g(n) = o(f (n)), a 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.
Alguns autores usam limn

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1

g(n)
f (n)

= 0 para a definio da notao o.

Por analogia, a notao est relacionada com a notao da


mesma forma que a notao o est relacionada com a notao O.
Definio: Uma funo g(n) (f (n)) se, para qualquer constante
c > 0, ento 0 cf (n) < g(n) para todo n m.
Exemplo:

n2
2

= (n), mas

n2
2

6= (n2 ).

A relao g(n) = (f (n)) implica limn

g(n)
f (n)

= , se o limite existir.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

44

Classes de Comportamento Assinttico

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

Comparao de Programas

Se f uma funo de complexidade para um algoritmo F , ento


O(f ) considerada a complexidade assinttica do algoritmo F .

Podemos avaliar programas comparando as funes de complexidade,


negligenciando as constantes de proporcionalidade.

A relao de dominao assinttica permite comparar funes de


complexidade.

Um programa com tempo O(n) melhor que outro com tempo O(n2 ).
Porm, as constantes de proporcionalidade podem alterar esta considerao.

Entretanto, se as funes f e g dominam assintoticamente uma a


outra, ento os algoritmos associados so equivalentes.

Exemplo: um programa leva 100n unidades de tempo para ser executado e


outro leva 2n2 . Qual dos dois programas melhor?

Nesses casos, o comportamento assinttico no serve para comparar


os algoritmos.

Para n < 50, o programa com tempo 2n2 melhor do que o que possi
tempo 100n.

Por exemplo, considere dois algoritmos F e G aplicados mesma


classe de problemas, sendo que F leva trs vezes o tempo de G ao
serem executados, isto , f (n) = 3g(n), sendo que O(f (n)) = O(g(n)).

Para problemas com entrada de dados pequena prefervel usar o


programa cujo tempo de execuo O(n2 ).
Entretanto, quando n cresce, o programa com tempo de execuo O(n2 )
leva muito mais tempo que o programa O(n).

Logo, o comportamento assinttico no serve para comparar os


algoritmos F e G, porque eles diferem apenas por uma constante.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

Principais Classes de Problemas


f (n) = O(1).

46

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

Principais Classes de Problemas


f (n) = O(n).

Algoritmos de complexidade O(1) so ditos de complexidade constante.

Um algoritmo de complexidade O(n) dito ter complexidade linear.

Uso do algoritmo independe de n.

Em geral, um pequeno trabalho realizado sobre cada elemento de


entrada.

As instrues do algoritmo so executadas um nmero fixo de vezes.


f (n) = O(log n).
Um algoritmo de complexidade O(log n) dito ter complexidade
logartmica.
Tpico em algoritmos que transformam um problema em outros menores.

a melhor situao possvel para um algoritmo que tem de


processar/produzir n elementos de entrada/sada.
Cada vez que n dobra de tamanho, o tempo de execuo dobra.
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 cada um deles independentemente e ajuntando as solues
depois.

Quando n mil, log2 n 10, quando n 1 milho, log2 n 20.

Quando n 1 milho, nlog2 n cerca de 20 milhes.

Para dobrar o valor de log n temos de considerar o quadrado de n.


A base do logaritmo muda pouco estes valores: quando n 1 milho, o
log2 n 20 e o log10 n 6.

45

Quando n 2 milhes, nlog2 n cerca de 42 milhes, pouco mais do que


o dobro.

47

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

48

49

Principais Classes de Problemas

Principais Classes de Problemas

f (n) = O(2n ).

f (n) = O(n2 ).

Um algoritmo de complexidade O(2n ) dito ter complexidade


exponencial.

Um algoritmo de complexidade O(n2 ) dito ter complexidade


quadrtica.

Geralmente no so teis sob o ponto de vista prtico.

Ocorrem quando os itens de dados so processados aos pares, muitas


vezes em um anel dentro de outro.

Ocorrem na soluo de problemas quando se usa fora bruta para


resolv-los.

Quando n mil, o nmero de operaes da ordem de 1 milho.

Quando n 20, o tempo de execuo cerca de 1 milho. Quando n


dobra, o tempo fica elevado ao quadrado.

Sempre que n dobra, o tempo de execuo multiplicado por 4.


teis para resolver problemas de tamanhos relativamente pequenos.

f (n) = O(n!).

f (n) = O(n3 ).

Um algoritmo de complexidade O(n!) dito ter complexidade exponencial,


apesar de O(n!) ter comportamento muito pior do que O(2n ).

Um algoritmo de complexidade O(n3 ) dito ter complexidade cbica.


teis apenas para resolver pequenos problemas.

Geralmente ocorrem quando se usa fora bruta na soluo do problema.

Quando n 100, o nmero de operaes da ordem de 1 milho.

n = 20 20! = 2432902008176640000, um nmero com 19 dgitos.

Sempre que n dobra, o tempo de execuo fica multiplicado por 8.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

n = 40 um nmero com 48 dgitos.

50

Comparao de Funes de Complexidade (1)

Funo

Tamanho n

de custo

10

20

30

40

50

60

0,00001
s

0,00002
s

0,00003
s

0,00004
s

0,00005
s

0,00006
s

n2

0,0001
s

0,0004
s

0,0009
s

0,0016
s

0,0.35
s

0,0036
s

0,001
s

0,008
s

0,027
s

0,64
s

0,125
s

0.316
s

n5

0,1
s

3,2
s

24,3
s

1,7
min

5,2
min

13
min

2n

0,001
s

1
s

17,9
min

12,7
dias

35,7
anos

366
sc.

3n

0,059
s

58
min

6,5
anos

3855
sc.

108
sc.

1013
sc.

n3

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

51

Comparao de Funes de Complexidade (2)

Funo de

Computador

Computador

Computador

custo

atual

100 vezes

1.000 vezes

mais rpido

mais rpido

de tempo
n

t1

100 t1

1000 t1

n2

t2

10 t2

31, 6 t2

t3

4, 6 t3

10 t3

2n

t4

t4 + 6, 6

t4 + 10

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

52

Algoritmos Polinomiais Algoritmos Exponenciais

A distino entre algoritmos polinomiais eficientes e algoritmos


exponenciais ineficientes possui vrias excees.

Algoritmo polinomial no tempo de execuo tem funo de complexidade


O(p(n)), onde p(n) um polinmio.

Exemplo: um algoritmo com funo de complexidade f (n) = 2n mais


rpido que um algoritmo g(n) = n5 para valores de n menores ou
iguais a 20.

A distino entre estes dois tipos de algoritmos torna-se significativa quando


o tamanho do problema a ser resolvido cresce.

Tambm existem algoritmos exponenciais que so muito teis na


prtica.

Os algoritmos polinomiais so mais teis na prtica que os exponenciais.


Algoritmos exponenciais so geralmente variaes de pesquisa exaustiva.

Exemplo: o algoritmo Simplex para programao linear possui


complexidade de tempo exponencial para o pior caso mas executa
muito rpido na prtica.

Algoritmos polinomiais so geralmente obtidos mediante melhor


entendimento da estrutura do problema.
Um problema considerado:

Tais exemplos no ocorrem com frequncia na prtica, e muitos


algoritmos exponenciais conhecidos no so muito teis.

intratvel: se no existe um algoritmo polinomial para resolv-lo.


bem resolvido: quando existe um algoritmo polinomial para resolv-lo.

54

Exemplo de Algoritmo Exponencial

Supondo que sempre h uma estrada entre duas cidades quaisquer, o


problema encontrar a menor rota para a viagem.
A figura ilustra o exemplo para quatro cidades c1 , c2 , c3 , c4 , em que os
nmeros nos arcos indicam a distncia entre duas cidades.

5 c3 3

c2

Um algoritmo simples seria verificar todas as rotas e escolher a menor


delas.
H (n 1)! rotas possveis e a distncia total percorrida em cada rota
envolve n adies, logo o nmero total de adies n!.
No exemplo anterior teramos 24 adies.
Suponha agora 50 cidades: o nmero de adies seria 50! 1064 .
Em um computador que executa 109 adies por segundo, o tempo
total para resolver o problema com 50 cidades seria maior do que 1045
sculos s para executar as adies.

c1
9

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

Exemplo de Algoritmo Exponencial

Um caixeiro viajante deseja visitar n cidades de tal forma que sua


viagem inicie e termine em uma mesma cidade, e cada cidade deve
ser visitada uma nica vez.

c4

O percurso < c1 , c3 , c4 , c2 , c1 > uma soluo para o problema, cujo


percurso total tem distncia 24.

53

Algoritmos Polinomiais Algoritmos Exponenciais

Algoritmo exponencial no tempo de execuo tem funo de complexidade


O(cn ), c > 1.

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2

O problema do caixeiro viajante aparece com frequncia em


problemas relacionados com transporte, mas tambm aplicaes
importantes relacionadas com otimizao de caminho percorrido.

55

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

56

Comando de atribuio, de leitura ou de escrita: O(1).

Determinar o tempo de execuo de um programa pode ser um


problema matemtico complexo;

Sequncia de comandos: determinado pelo maior tempo de execuo de


qualquer comando da sequncia.

Determinar a ordem do tempo de execuo, sem preocupao com o


valor da constante envolvida, pode ser uma tarefa mais simples.

Comando de deciso: tempo dos comandos dentro do comando condicional,


mais tempo para avaliar a condio, que O(1).

A anlise utiliza tcnicas de matemtica discreta, envolvendo


contagem ou enumerao dos elementos de um conjunto:

Anel: soma do tempo do corpo do anel mais o tempo de avaliar a condio


para terminao (geralmente O(1)), multiplicado pelo nmero de iteraes.

manipulao de somas,

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 chamam os j avaliados (utilizando os
tempos desses). O processo repetido at chegar no programa principal.

produtos,
permutaes,
fatoriais,
coeficientes binomiais,

Procedimentos recursivos: associada uma funo de complexidade f (n)


desconhecida, onde n mede o tamanho dos argumentos.

soluo de equaes de recorrncia.

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

58

Procedimento no Recursivo

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

Anlise do Procedimento no Recursivo

Algoritmo para ordenar os n elementos de um conjunto A em ordem ascendente.


procedure Ordena ( var A: TipoVetor ) ;

Anel Interno
Contm um comando de deciso, com um comando apenas de
atribuio. Ambos levam tempo constante para serem executados.

{ ordena o vetor A em ordem ascendente }


i , j , min, x : integer ;

begin
(1)

for i := 1 to n1 do
begin

(2)

min : = i ;

(3)

for j := i +1 to n do

(4)

i f A[ j ] < A[min]

(5)

then min : = j ;
{ troca A[min ] e A[ i ] }

(6)

x : = A[min ] ;

(7)

A[min] : = A[ i ] ;

(8)

A[ i ] : = x ;
end;
end;

57

Anlise do Tempo de Execuo

Tcnicas de Anlise de Algoritmos

var

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

Seleciona o menor elemento do


conjunto.

Quanto ao corpo do comando de deciso, devemos considerar o pior


caso, assumindo que serSS sempre executado.

Troca este com o primeiro elemento A[1].

O tempo para incrementar o ndice do anel e avaliar sua condio de


terminao O(1).

Repita as duas operaes acima


com os n1 elementos restantes,
depois com os n2, at que reste
apenas um.

O tempo combinado para executar uma vez o anel


O(max(1, 1, 1)) = O(1), conforme regra da soma para a notao O.
Como o nmero de iteraes n i, o tempo gasto no anel
O((n i) 1) = O(n i), conforme regra do produto para a notao O.

59

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

60

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

Procedimento Recursivo

Anlise do Procedimento no Recursivo


Anel Externo

Pesquisa(n) ;
(1) i f n 1

Contm, alm do anel interno, quatro comandos de atribuio.


O(max(1, (n i), 1, 1, 1)) = O(n i).

(2) then inspecione elemento e termine


else begin

A linha (1) executada n 1 vezes, e o tempo total para executar o


programa est limitado ao produto de uma constante pelo somatrio
P
2
= n2 n2 = O(n2 )
de (n i): 1n1 (n i) = n(n1)
2

Seja T (n) uma funo de complexidade que represente o nmero de


inspees nos n elementos do conjunto.
O custo de execuo das linhas (1) e (2) O(1) e o da linha (3)
exatamente n.
Usa-se uma equao de recorrncia para determinar o no de
chamadas recursivas.
O termo T (n) especificado em funo dos termos anteriores T (1),
T (2), . . ., T (n 1).
T (n) = n + T (n/3), T (1) = 1 (para n = 1 fazemos uma inspeo)
Por exemplo, T (3) = T (3/3) + 3 = 4, T (9) = T (9/3) + 9 = 13, e assim
por diante.
Para calcular o valor da funo seguindo a definio so necessrios
k 1 passos para computar o valor de T (3k ).

para cada um dos n elementos inspecione elemento ;

(4)

Pesquisa(n/ 3 ) ;

Para cada procedimento recursivo associada uma funo de


complexidade f (n) desconhecida, onde n mede o tamanho dos
argumentos para o procedimento.
Obtemos uma equao de recorrncia para f (n).

Considerarmos o nmero de trocas, o programa realiza exatamente


n 1 trocas.

Anlise do Procedimento Recursivo

(3)

end;

Considerarmos o nmero de comparaes como a medida de custo


relevante, o programa faz (n2 )/2 n/2 comparaes para ordenar n
elementos.

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

61

Equao de recorrncia: maneira de definir uma funo por uma


expresso envolvendo a mesma funo.

62

Projeto de Algoritmos Cap.1 Introduo Seo 1.4

63

Exemplo de Resoluo de Equao de Recorrncia


Sustitui-se os termos T (k), k < n, at que todos os termos T (k), k > 1,
tenham sido substitudos por frmulas contendo apenas T (1).
T (n) = n + T (n/3)
T (n/3) = n/3 + T (n/3/3)
T (n/3/3) = n/3/3 + T (n/3/3/3)
..
..
.
.
T (n/3/3 /3) = n/3/3 /3 + T (n/3 /3)
Adicionando lado a lado, temos
T (n) = n + n (1/3) + n (1/32 ) + n (1/33 ) + + (n/3/3 /3) que
representa a soma de uma srie geomtrica de razo 1/3, 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.4

64

Exemplo de Resoluo de Equao de Recorrncia

Os programas apresentados no livro usam apenas as caractersticas bsicas


do Pascal.
So evitadas as facilidades mais avanadas disponveis em algumas
implementaes.

Se desprezarmos o termo T (n/3/3 


/3), quando
n tende para

infinito, ento T (n) = n

i=0 (1/3)

=n

1
1 31

3n

No apresentaremos a linguagem na sua totalidade, apenas examinamos


algumas caractersticas.

Se considerarmos o termo T (n/3/3/3 /3) e denominarmos x o


nmero de subdivises por 3 do tamanho do problema, ento
n/3x = 1, e n = 3x . Logo x = log3 n.
Lembrando que T (1) = 1 temos
T (n) =

Px1

n
i=0 3i

+ T ( 3nx ) = n

Px1

i=0 (1/3)

+1=

65

A Linguagem de Programao Pascal (1)

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


+ (n/3/3 /3)
P

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

n(1( 31 )x )
(1 31 )

+1=

3n
2

21

Logo, o programa do exemplo O(n).

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

66

A Linguagem de Programao Pascal (2)


As vrias partes componentes de um programa Pascal so:
program

cabealho do programa

label

declarao de rtulo para goto

const

definio de constantes

type

definio de tipos de dados

var

declarao de variveis

procedure
ou function

declarao de subprogramas

begin
..
.
end

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Tipos em Pascal
Regra geral: tornar explcito o tipo associado quando se declara uma
constante, varivel ou funo.
Isso permite testes de consistncia durante o tempo de compilao.
A definio de tipos permite ao programador alterar o nome de tipos
existentes e criar um nmero ilimitado de outros tipos.
No caso do Pascal, os tipos podem ser:
simples,
estruturados e

comandos do programa

apontadores.

67

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

68

Tipos Simples (1)

indicao de subintervalos. Exemplo:


type ano = 1900..1999;
type letra = A..Z;
..
.

Tipos simples adicionais podem ser enumerados por meio de:


listagem de novos grupos de valores; Exemplo:
type cor = (vermelho, azul, rosa);
..
.
var c : cor;
..
.

var a : ano;
var b : letra;

as atribuies a:=1986 e b:=B so possveis, mas a:=2001 e b:=7 no


o so.

c := rosa;

Tipos Estruturados
Definem uma coleo de valores simples, ou um agregado de valores
de tipos diferentes.
Existem quatro tipos estruturados primitivos:

Arranjos: tabela n-dimensional de valores homogneos de


qualquer tipo. Indexada por um ou mais tipos simples, exceto o tipo
real.

Registros: unio de valores de tipos quaisquer, cujos campos


podem ser acessados pelos seus nomes.
Conjuntos: coleo de todos os subconjuntos de algum tipo
simples, com operadores especiais (interseo), + (unio),
(diferena) e in (pertence a) definidos para todos os tipos
conjuntos.
Arquivos: sequncia de valores homogneos de qualquer tipo.
Geralmente associado com alguma unidade externa.

69

Tipos Simples (2)

So grupos de valores indivisveis (integer, boolean, char e real).

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

70

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Tipo Estruturado Arranjo - Exemplo


type carto
type matriz
type coluna
type linha
type alfa
type vetor

= array [1..80] of char;


= array [1..5, 1..5] of real;
= array [1..3] of real;
= array [ano] of char;
= packed array [1..n] of char;
= array [1..n] of integer;

A constante n deve ser previamente declarada


const n = 20;
Dada a varivel
var x: coluna;
as atribuies x[1]:=0.75, x[2]:=0.85 e x[3]:=1.5 so possveis.

71

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

72

Tipo Estruturado Registro - Exemplo (1)


= record
dia : 1..31;
ms : 1..12;
end;
type pessoa = record
sobrenome
primeironome
aniversrio
sexo
end;

Declarada a varivel
var p: pessoa;
valores particulares podem ser atribudos:

:
:
:
:

Tipo Estruturado Conjunto - Exemplo


type conjint
= set of 1..9;
type conjcor = set of cor;
type conjchar = set of char;
O tipo cor deve ser previamente definido

var ci : conjint;
var cc : array [1..5] of conjcor;
var ch: conjchar;

p.sobrenome
:= Ziviani;
p.primeironome := Patricia;
p.aniversrio.dia := 21;
p.aniversrio.ms := 10;
p.sexo
:= f;

alfa;
alfa;
data;
(m, f);

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Declaradas as variveis

73

Tipo Estruturado Registro - Exemplo (2)

type data

type cor = (vermelho, azul, rosa);

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

74

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Tipo Estruturado Conjunto - Exemplo


Valores particulares podem ser construdos e atribudos:
ci
cc[2]
cc[4]
cc[5]

:= [1,4,9];
:= [vermelho..rosa];
:= [ ];
:= [azul, rosa];

Prioridade: interseo precede unio e diferena, que precedem


pertence a.
[1..5,7] [4,6,8]
[1..3,5] + [4,6]
[1..3,5] [2,4]
2 in [1..5]

[4]
[1..6]
[1,3,5]
true

75

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

76

Tipo Estruturado Arquivo - Exemplo


program Copia ( Velho , Novo) ;

{ copia o arquivo Velho no arquivo Novo }

So teis para criar estruturas de dados encadeadas, do tipo listas, rvores


e grafos.

type TipoAlfa = array [ 1 . .N] of char;


TipoPessoa = record
Sobrenome

: TipoAlfa ;

PrimeiroNome : TipoAlfa ;
Aniversario : TipoData;
Sexo

: (mas,fem) ;

end;
var Velho , Novo: f i l e of TipoPessoa;
Registro

77

Tipo Apontador (1)

const N = 30;
TipoData = record dia : 1 . . 3 1 ; mes: 1 . . 1 2 ; end;

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

O programa ao lado copia o contedo do arquivo Velho no arquivo


Novo. (Atribuio de
nomes de arquivos externos ao programa varia de compilador para
compilador.)

Um apontador uma varivel que referencia outra varivel alocada


dinamicamente.
Em geral, a varivel referenciada definida como um registro com um
apontador para outro elemento do mesmo tipo.

: TipoPessoa;

begin
reset ( Velho ) ;

rewrite (Novo) ;

while not eof ( Velho ) do


begin read ( Velho , Registro ) ; write(Novo, Registro ) ; end
end.

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

78

Tipo Apontador (2)

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Separador de Comandos

Exemplo:

O ponto e vrgula atua como um separador de comandos.

type Apontador = ^No;


type No = record
Chave: integer
Apont: Apontador;
end;

Quando mal colocado, pode causar erros que no so detectados em


tempo de compilao.
Exemplo: o trecho de programa abaixo est sintaticamente correto.
Entretanto, o comando de adio serSS executado sempre, e no somente
quando o valor da varivel a for igual a zero.

Dada uma varivel

if a = 0 then;
a := a + 1;

var Lista: Apontador;


possvel criar uma lista como a ilustrada.
Lista

50

100

...

200

nil

79

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Passagem de Parmetros (1)

80

Projeto de Algoritmos Cap.1 Introduo Seo 1.5

Passagem de Parmetros (2)

Por valor ou por varivel (ou referncia).

Exemplo: SomaUm recebe o parmetro x por valor e o parmetro y por varivel.

A passagem de parmetro por varivel deve ser utilizada se o valor


pode sofrer alterao dentro do procedimento, e o novo valor deve
retornar para quem chamou o procedimento.

program Teste;
var a, b : integer ;
procedure SomaUm ( x : integer ; var y : integer ) ;
begin
x : = x + 1;

y : = y + 1;

writeln ( Procedimento SomaUm : , x , y ) ;


end;
begin { Programa principal }
a : = 0 ; b : = 0 ; SomaUm ( a,b) ;
writeln ( Programa principal : , a, b) ;
end.

Resultado da execuo:
Procedimento SomaUm : 1 1
Programa principal
:0 1

81