Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
n g
n f
lim
( )
( )
13
log 5 2
13 lim
log 5 2 13
lim lim
2 3
2 3
=
+ + =
+ +
=
n
n
n n
n n n n
n g
n f
PROJETO E ANLISE DE ALGORITMOS 23
Exemplo: Verifque, se g(n)=(n+1)
2
, ento:
g(n) O(n
2
) ou g(n)=O(n
2
), ou seja, (cR*
+
)((n
0
N)(nn0) g(n)
cf(n)
f(n)=n
2
(n+1)
2
c.n
2
n
2
+2n+1 c.n
2
c 1 + 2/n + 1/n
2
Logo, n
0
=1 e c=4
Isto porque (n+1)
2
4n
2
para n 1.
Exemplo: g(n)=3n
3
+ 2n
2
+ n O(n
3
)
Basta mostrar que 3n
3
+ 2n
2
+ n 6n
3
, para n 1
A funo g(n) = 3n
3
+ 2n
2
+ n tambm O(n
4
), entretanto, esta
afrmao mais fraca do que dizer que g(n) O(n
3
).
Exemplo: g(n)=log
5
n O(logn).
O log
b
n difere do log
c
n por uma contante no caso log
b
c.
Como n=c
logcn
, tomando o logaritmo base b em ambos os lados da
igualdade, temos que log
b
n=log
b
c
logcn
= log
c
n x log
b
c
Exemplo: Suponha que f(n)=2n
2
+ 3n +4 e que g(n)=n
2
. Observe que
2n
2
=3n + 4 2n
2
+ 3n
2
+ 4n
2
= 9n
2
desde que n 1. Resumindo, f(n) 9g(n)
para todo n 1. Portanto, f(n)=O(g(n)).
Exemplo: Suponha que f(n)= 3 + 2/n e que g(n)= n
0
, ou seja, g(n)=1.
Ento, 3 + 2/n 3 + 1 =4 = 4n0 desde que n 2. Resumindo, f(n) 4g(n) para
n 2. Portanto, f(n)=O(gn)).
Exemplo: Suponha que f(n)=n3 e que g(n)=500n2. No verdade
que f(n)=O(g(n)). De fato, se existissem c e n0 tais que f(n)cg(n), teramos
n500c para todo nn0. Mas isso absurdo!
Exemplo: 7n 2 O(n)
Prova: Pela defnio da notao O, precisou achar uma constante
c>0 e uma constante inteira n
0
>1, tais que 7n 2 cn para todo inteiro nn
0
.
fcil perceber que uma escolha poderia ser c=7 e n
0
=1. De fato, esta uma
das infnitas escolhas possveis porque qualquer nmero real maior ou igual
a 7 ser uma escolha possvel para c e qualquer inteiro maior ou igual a 1
uma escolha possvel para n
0
.
Algumas regras se aplicam na avaliao O(.)
Regra das Somas
UNIDADE 1 24
Proposio 1
Se determinado algoritmo P se divide em partes independentes,
digamos P1 e P2 e sendo T
1
(n) e T
2
(n) respectivamente de ordem O(f(n))
e O(g(n)) ento: T(n)=T
1
(n)+T
2
(n) e P ser de ordem O(mximo{f(n), g(n)})
(CAMPELLO & MACULAN, 1994).
Demonstrao:
Para c
1
,c
2
,n
1
e n
2
constantes
T
1
(n) c
1
.f(n), n n
1
T
2
(n) c
2
.g(n), n n
2
Sendo n
o
= mximo{n
1
,n
2
} e com n no.
Ento T
1
(n)+T
2
(n) c
1
.f(n)+c
2
.g(n) (c
1
+c
2
)mximo{f(n),g(n)}
Portanto, T(n) de ordem O(mximo{f(n),g(n)}.
Exemplo: Calcular o tempo de execuo de uma sequncia de trechos
de programas usando a regra da soma para O(f(n))+O(g(n)).
Suponha trs trechos cujos tempos de execuo so O(n), O(n
2
) e
O(n.logn).
O tempo de execuo dos dois primeiros O(max(n,n
2
)) que O(n
2
).
Exemplo: Considere o caso em que as funes f(.) e g(.) so dadas a
seguir:
Neste caso:
O tempo de execuo de todos os trs trechos O(max(n
2
,n.logn))
que O(n
2
).
Regra dos Produtos
( )
=
mpar n se , n
par n se , n
n f
2
4
( )
=
mpar n se , n
par n se , n
n g
3
2
( ) ( ) { }
=
mpar n se , n
par n se , n
n g , n f mximo
3
4
PROJETO E ANLISE DE ALGORITMOS 25
Proposio 2
Se T
1
(n) e T
2
(n) so de ordem O(f(n)) e O(g(n)) respectivamente,
ento:
T(n) = T
1
(n) . T
2
(n) de ordem O(f(n).g(n)).
Demonstrao
Por hiptese constantes c1 , c2, n1, n2 tais que:
T
1
(n) = O(f(n)) T
1
(n) c1.f(n), n n1
T
2
(n) = O(g(n)) T
2
(n) c2.g(n), n n2
Fazendo no = mximo{n1,n2} e c = c1.c2
T(n)= T
1
(n).T
2
(n) c(f(n).g(n)), n no
E, portanto, T(n) de ordem O(f(n).g(n))
Segue-se que O(k.f(n)) o mesmo que O(f(n)) quando k uma
constante positiva.
Outras propriedades:
f(n)=O(f(n))
k. O(f(n))= O(f(n)) k = constate
O(f(n)) + O(f(n)) = O(f(n))
O(O(f(n))) = O(f(n))
f(n)O(g(n)) = O(f(n)g(n))
Teorema:
Se T(n)=t
m
n
m
+t
m-1
n
m-1
+...+ t
1
n+t
o
um polinmio de grau m ento
T(n)=O(n
m
).
Demonstrao:
Usando a defnio:
T(n) = O(n
m
) ( c R
+
) T(n) c.n
2
, n no
|T(n)| |t
m
|n
m
+ |t
m-1
|n
m-1
+...+ |t
1
|n+|t
o
|
|T(n)| (|t
m
|+ |t
m-1
|/n+...+ |t
o
|/n
m
)n
m
|T(n)| = (|t
m
|+...+ |t
o
|)n
m
, n 1
Substituindo c=|t
m
|+...+ |t
o
| e n
o
=1
Temos |T(n)| c|n
m
| T(n) c.n
m
T(n) = O(n
m
)
UNIDADE 1 26
Exemplo: Seja T(n)= 2x
5
+45x
4
+ 100008x
2
-8888888 um polinmio de
grau 5, logo T(n)=O(n
5
), ou seja, despreza todos os termos de grau menor do
que 5 e a constante.
Uma ferramenta poderosa e verstil para provar que alguma funo
de ordem de outra a regra do limite, dadas as funes arbitrrias f,g:NR
+
*.
1. Se lim(f(n)/g(n)) R
+
* ento f(n) O(g(n)) e g(n) O(f(n))
2. Se lim(f(n)/g(n)) = 0 ento f(n) O(g(n)) mas g(n) O(f(n))
3. Se lim(f(n)/g(n)) = + ento f(n) O(g(n)) e g(n) O(f(n))
Exemplo: Sejam f(n) = logn e g(n) = n
Deseja-se determinar a ordem relativa das duas funes.
Desde que f(n) e g(n) tendem ao infnito quando n tende ao infnito,
deve-se usar regra de lHpital para calcular este limite.
Resoluo:
Provar que este limite existe.
Agora, a regra do limite nos mostra que logn O(n) e n O(logn).
Em outras palavras, a funo n cresce assintoticamente mais rpido
que log n.
1. Notao (mega)
A notao O nos d um limite superior para o tempo que algum
algoritmo gastar para qualquer instncia de tamanho n. Para estimar um
limite inferior, podemos usar a seguinte notao: (f(n)).
Exemplo: f(n)=7n
3
+5 cresce menos rapidamente do que uma
exponencial g(n)=2
n
.
Diz-se que a exponencial g(n) f(n)).
Defnio:
( ) ( ) ( ) ( ) n g n f
n
n g n f
n
~ ~
/
lim
/
lim
=
( ) ( ) ( ) 0 / 2 lim )
2
1
/ / 1 lim / log lim = = = n
n
n n n
PROJETO E ANLISE DE ALGORITMOS 27
Diz-se que g(n) (f(n)), se e somente se, para alguma constante c
R*
+
e n
o
N tal que g(n) c.f(n)
Isto : (f(n)) = {g: NR
+
|( c R*
+
)( n
o
N) ( n n
o
)[g(n)
c.f(n)]}
Em outra palavras, (f(n)) um conjunto de todas as funes g(n)
limitadas inferiormente por mltiplo real positivo de f(n), para n sufcientemente
grande.
Exemplo: Para mostrar que g(n)= 3n
3
+2n
2
(n
3
), basta fazer c=1, e
ento 3n
3
+2n
2
n
3
para n 0.
Exemplo: Seja g(n)=n para n mpar (n 1) e g(n) = n
2
/10 para n par (n
0). Neste caso, g(n) (n
2
), bastando considerar c=1/10 e n=0,2,4,...
Exemplo: A Figura 1.4 mostra o grfco para a notao .
Figura 1.4
Exemplo: Seja t(n)=n
3
-2n
2
+4n, podemos afrmar que t(n) (n
3
), pois
n
3
-2n
2
+4n 0.5n3 para n>1.
Exemplo: Se f(n)=n
2
-1, ento so vlidas as igualdades f(n)=(n
2
),
f(n)=(n) e f(n)=(1), mas no vale f(n)=(n
3
).
Exerccio: Para as funes exponencial f(n)=2
n
e cbica g(n)=7n
3
+5,
verifque que f(n) (g(n)), determinando as constantes c e no.
1. Notao (Theta)
A notao defne um limite assinttico exato. Por exemplo, as
funes quadrtica f(n)=5n
2
+ 4 e g(n)=n
2
+ 1 crescem com a mesma rapidez.
Diz-se que f(n) (f(n)), ou seja, (f(n)) = O(f(n)) (f(n)), se e
somente se, g(n)) = {f: NR
+
|( c, d R*
+
)( n
o
N) (n no)[c.g(n)
UNIDADE 1 28
f(n) d.g(n)]}
Podemos afrmar que duas funes f(n) e g(n), f(n)= (g(n)), se e
somente se, f(n)=O(g(n)) e f(n)= (g(n)).
Na prtica, normalmente aplicamos a notao para descrever um
limite inferior para o melhor caso e a notao O para descrever um limite
superior para o pior caso. A Figura 1.5 abaixo ilustra a notao
Figura 1.5 f(n) (g(n))
Exemplo: Seja g(n)=n
2
/3-2n. Vamos mostrar que g(n) = (n
2
).
Temos de obter constantes c, d e n
0
tais que c.n
2
(1/3)n
2
- 2n d.n
2
para todo n n
0
.
Dividindo por n
2
, temos c 1/3 - 2/n d.
O lado direito da desigualdade ser sempre vlido para qualquer
valor de n 1 quando escolhemos d 1/3. Da mesma maneira, escolhendo c
1/21, o lado esquerdo da desigualdade ser vlido para qualquer valor de
n 7. Logo, escolhendo c = 1/21, d = 1/3 e n
0
= 7, verifca-se que n
2
/3 - 2n=
(n
2
).
Outras constantes podem existir, mas o importante que existe
alguma escolha para as trs constantes.
A regra do limite para a notao reformulada da seguinte forma:
1. Se lim(f(n)/g(n)) R
+
* ento f(n) (g(n))
2. Se lim(f(n)/g(n)) = 0 ento f(n) O(g(n)), mas f(n) (g(n))
3. Se lim(f(n)/g(n)) = + ento f(n) (g(n)), mas f(n) (g(n))
Comparao de Funes
Algumas das propriedades relacionadas a nmeros reais tambm se
aplicam a comparao de funes assintticas. Nas propriedades seguintes,
suponha que f(n) e g(n) sejam assintoticamente positivas.
As notaes apresentadas respeitam as seguintes propriedades:
PROJETO E ANLISE DE ALGORITMOS 29
Refexividade:
1. f(n)= (f(n))
2. f(n)= O(f(n))
3. f(n)= (f(n))
Simetria:
1. f(n)=O(g(n)) se e somente se g(n)=O(f(n))
Transitividade:
2. f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n))
3. f(n) = O(g(n)) e g(n) = O(h(n)) implicam f(n) = O(h(n))
4. f(n) = (g(n)) e g(n) = (h(n)) implicam f(n) = (h(n))
Comportamento Assinttico
Se f uma funo de complexidade para um algoritmo A, ento O(f)
considerada a complexidade assinttica ou o comportamento assinttico do
algoritmo A. A relao de dominao assinttica permite comparar funes
de complexidade. Entretanto, se as funes f e g dominam assintoticamente
uma a outra, ento os algoritmos associados so equivalentes. Nestes casos,
o comportamento assinttico no serve para comparar algoritmos.
Exemplo: Dois algoritmos C e D aplicados mesma classe de
problemas, sendo que C leva trs vezes o tempo de D ao ser executado,
isto , f(n) = 3g(n), sendo que O(f(n)) = O(g(n)). Logo, o comportamento
assinttico no serve para comparar os algoritmos C e D porque eles diferem
apenas por uma constante.
Podemos avaliar programas, comparando as funes de
complexidade. Um programa com tempo de execuo O(n) melhor que
outro com tempo O (n
2
). Porm, as constantes de proporcionalidade podem
alterar esta considerao.
Exemplo: Um programa leva 100n unidades de tempo para ser
executado e outro leva 2n
2
. Qual dos dois o melhor?
A resposta a essa pergunta depende do tamanho do problema a ser
executado. Para n<50, o programa com tempo 2n
2
melhor que 100n. Para
problemas com entrada de dados pequena, prefervel usar o programa cujo
tempo de execuo O(n
2
). Entretanto, quando n cresce, o programa com
tempo O(n
2
) leva muito mais tempo que o programa O(n).
Desafo:
D um exemplo de
funo positiva f(n) de
tal forma que f(n) no
seja nem O(n) nem (n).
UNIDADE 1 30
Classes de Comportamentos Assintticos
As principais classes de problemas possuem as funes de
complexidade descritas a seguir. Segundo Zivianni (2007),
1. f(n)=O(1)
1. Algoritmos de complexidade O(1) so ditos de complexidade
constante. O uso do algoritmo independe do tamanho de n. As instrues do
algoritmo so executadas um nmero fxo de vezes.
2. f(n) = O(log n)
1. Um algoritmo de complexidade O(log n) dito ter complexidade
logartmica. Esse tipo de execuo ocorre em algoritmos que resolvem um
problema transformando-o em problemas pequenos.
1. f(n) = O(n)
1. Um algoritmo de complexidade O(n) dito ter complexidade linear.
1. f(n) = O(nlog n)
1. Tpico em algoritmos que quebram um problema em outros menores
resolve cada um deles independentemente e depois unindo as solues.
2. f(n) = O(n
2
)
1. Um algoritmo de complexidade O(n
2
) dito ter complexidade
quadrtica, os quais ocorrem quando os itens de dados so processados
aos pares, sendo muitas vezes em um ninho dentro do outro. So teis para
resolver problemas de tamanhos pequenos.
3. f(n) = O(n
3
)
1. Um algoritmo de complexidade O(n
3
) dito ter complexidade
cbica. teis para resolver pequenos problemas.
4. f(n) = O(2
n
)
1. Um algoritmo de complexidade O(2
n
) dito ter complexidade
exponencial. No so teis do ponto de vista prtico.
5. f(n) = O(n!)
1. Um algoritmo de complexidade O(n!) dito ter complexidade
exponencial tambm, apesar de a complexidade fatorial O(n!) ter
PROJETO E ANLISE DE ALGORITMOS 31
comportamento muito pior que O(2
n
).
Segue a ordem de complexidade dos algoritmos.
2. O(1) < O(log n) < O(n) < O(n log n) <O(n
2
) <O(n
3
)<O(2
n
)
Um Algoritmo cuja complexidade O(c
n
), c>1 chamado de algoritmo
exponencial no tempo de execuo. O algoritmo cuja funo de complexidade
um polinmio, isto , O(p(n)) p(n) e chamado de algoritmo polinomial
em tempo de execuo. A diferena entre esses algoritmos cresce quando o
tamanho do problema a ser resolvido aumenta, conforme ilustra a Tabela 1.3.
TABELA 1.3 COMPARAO DE VRIAS FUNES
Um problema considerado intratvel quando ele to difcil que
no existe um algoritmo polinomial para resolv-lo, enquanto um problema
considerado tratvel quando existe um algoritmo polinomial para resolv-lo.
Exemplo: um algoritmo com funo de complexidade f(n)=2
n
mais
rpido que um algoritmo g(n)=n
5
para valores de n menores ou iguais a 20.
Tambm existem algoritmos exponenciais que so muito teis na prtica.
Exemplo: O algoritmo Simplex para programao linear possui
complexidade de tempo exponencial para o pior caso, mas executa muito
rpido na prtica.
Exemplo: Um caixeiro viajante deseja visitar n cidades de tal forma
que sua viagem inicie e termine em uma mesma cidade, sendo que cada
cidade deve ser visitada uma nica vez. Supondo que sempre exista uma
estrada entre duas cidades quaisquer, o problema encontrar a menor rota
para a viagem.
UNIDADE 1 32
A Figura 1.4 abaixo ilustra o exemplo para quatro cidades c1, c2, c3
e c4 em que os nmeros nos arcos indicam a distncia entre as cidades. O
percurso <c1, c3, c4, c2, c1> uma soluo para o problema, cujo percurso
total em distncia 24.
Figura 1.6 Problema do caixeiro viajante
RECORRNCIAS
Introduo
Quando um algoritmo contm uma chamada recursiva, o seu tempo
de execuo pode ser descrito por uma recorrncia. Uma recorrncia uma
equao ou uma inequao que descreve uma funo em termos de seu
valor em entrada menor. Para exemplifcar, vamos apresentar a equao de
recorrncia do Mergesort (Intercalao).
T(n)=
Cuja soluo T(n)=O(nlogn).
Apresentaremos a seguir trs mtodos para resolver recorrncia, isto
, para obter limites assintticos para a soluo.
Algoritmos Defnidos por Recorrncia
1. Quando se deseja especifcar um algoritmo para a soluo de um
determinado problema, podemos utilizar duas abordagens:
1. Defnir um algoritmo iterativo.
2. Defnir um algoritmo recursivo.
Algoritmos Iterativos:
Saiba Mais
O uso da notao O
iniciou vrias discusses
na comunidade de
anlise de algoritmos e
teoria da computao,
como por exemplo, a
de que a igualdade
f(n) = g(n) de mo
nica, ou seja, apenas
no sentido esquerdo
para direita, mesmo
adotando-se o fato de
que a notao O defna
um conjunto de funes.
PROJETO E ANLISE DE ALGORITMOS 33
1. Algoritmo do fatorial
1 FAT 1
2 para i de 2 at n, faa:
3 FAT FAT * i
4 retorne FAT
1. Algoritmo de Fibonacci
1 Fib(1) Fib(2) 1
2 para i de 3 at n faa
3 Fib(1) Fib(i - 2) + Fib(i 1)
Algoritmos Recursivos
1. Na construo de um algoritmo recursivo devemos ter o
cuidado de sempre especifcarmos primeiro a condio bsica para depois
estabelecermos o passo recorrente. Estes dois elementos devero estar
isolados por intermdio de uma clusula condicional do tipo:
Se <condio bsica> ento:
<ao da condio bsica>
Seno,
<ao do passo recorrente>
Algoritmos Recursivos:
Algoritmo Fatorial
funo Fat(n):
Se n = 0 ou n = 1, ento:
retorne (1)
Seno,
retorne(n * Fat(n - 1))
Algoritmo de Fibonacci
funo Fib(n):
Se n = 1 ou n = 2, ento:
Desafo
Apresente um algoritmo
recursivo para calcular o
produto de dois inteiros
m e n usando apenas
adio.
UNIDADE 1 34
retorne (1)
Seno,
retorne (Fib(n - 2) + Fib(n - 1))
Recorrncias
Uma recorrncia uma frmula que defne uma funo sobre os
nmeros naturais. Uma relao de recorrncia um caminho para defnir
uma funo por uma expresso envolvendo a mesma funo.
Exemplo: A recorrncia abaixo defne uma funo T no conjunto dos
nmeros naturais:
T(1) =1 e
T(n)=T(n-1) + 3n + 2 para n=2, 3, 4, ...
Eis os valores de T(n) para valores pequenos de n:
Seja T(n) uma funo de complexidade que representa o nmero de
inspees nos n elementos do conjunto. O termo T(n) especifcado em
funo dos termos anteriores T(1), T(2), ..., T(n - 1).
T(n) = T(n/3) + n, T(1) = 1 (para n=1 fazemos uma inspeo).
Por exemplo: T(3) = T(3/3) + 3 = 4; T(9) = T(9/3) + 9 = 12?, e assim
por diante.
Seja T(n) uma funo de complexidade que representa o nmero de
inspees nos n elementos do conjunto. O termo T(n) especifcado em
funo dos termos anteriores T(1), T(2),... , T(n - 1).
Solucionando Recorrncia
Resolver uma relao de recorrncia nem sempre fcil. Resolvendo
uma relao de recorrncia, determina-se o tempo de execuo do algoritmo
recursivo correspondente.
Exemplo: A sequncia T abaixo se encontra defnida por recorrncia:
1. Condio bsica: T(1) = 2
2. Passo recorrente: T(n) = 2 T(n - 1), para n 2
PROJETO E ANLISE DE ALGORITMOS 35
Solucionando Recorrncia:
De acordo com a defnio da sequncia T, temos os seguintes
termos:
T(1) = 2
T(2) = 2T(1) = 2 2 = 2
2
T(3) = 2T(2) = 2 2
2
= 2
3
T(4) = 2T(3) = 2 2
3
= 2
4
T(5) = 2T(4) = 2 2
4
= 2
5
Podemos concluir que T(n) = 2n. Esta equao denominada de
SOLUO EM FORMA FECHADA para a relao de recorrncia sujeita a
condio bsica T(1). Denomina-se RESOLVER uma recorrncia ao processo
de se encontrar uma soluo em forma fechada para a recorrncia.
Exemplo: Atravs de induo matemtica a conjectura T(n) = 2n,
verifcada da seguinte forma:
Passo bsico:
1. T(1) = 21 = 2 verdade;
2. Hiptese de Induo:
I. Suponha que T(k) = 2k seja verdade;
3. Passo Indutivo:
Prova-se que T(k+1) = 2k+1
Pela defnio temos T(k+1) = 2T((k+1)-1) = 2T(k) = 2 2k = 2k+1
Logo, est provada nossa conjectura.
4. Passo Indutivo:
Prova-se que T(k) = 3k
2
/2 + 7k/2 - 4
Temos T(k) = T(k-1) + 3k + 2 por defnio
T(k) = [3(k-1)
2
/2 + 7(k-1)/2 - 4] + 3k + 2
T(k) = 3k
2
/2 + 7k/2 - 8/2
T(k) = (3k
2
+ 7k - 8)/2
Logo, est provada nossa conjectura.
Como a frmula est correta, prova-se que T(n) = O(n
2
).
Como determinar a complexidade de um algoritmo recursivo?
Exemplo: Algoritmo Mergesort
UNIDADE 1 36
Pode ser escrito pela recorrncia:
Tcnicas de Recorrncia
Apresentaremos a seguir trs mtodos para resolver recorrncias,
isto , para obter limites assintticos para a soluo.
2. Mtodo da Substituio;
3. Mtodo da rvore de Recurso (iterao);
4. Mtodo Mestre.
Mtodo da Substituio
Este mtodo consiste em propor uma forma para a soluo (por
inspirao); determinar as constantes envolvidas por induo e mostrar que o
limite estabelecido vlido. Substituio vem do fato de substituir a resposta
inspirada pela hiptese indutiva aplicada a valores menores. um mtodo
poderoso, mas depende da percepo de quem analisa. efciente, mas
s pode ser aplicado em casos nos quais seja fcil pressupor a forma de
resposta.
Exemplo: Determinar um limite superior para a recorrncia T(n) =
2T(n/2) +(n)
Supondo que o mtodo da soluo visualizada seja T(n) = O(n log
n, o mtodo consiste em provar que T(n) c n log n para uma constante
c > 0 apropriada.
Assumiremos que este limite verdadeiro para n/2 , isto , T( n/2
) c n/2 log( n/2 ).
Substituindo na recorrncia temos:
T(n) 2(c n/2 log( n/2 ) + n
c n log(n/2) + n
c n logn c n log2 + n
c n logn c n + n
c n logn, para c 1
O prximo passo consiste em provar que a nossa soluo vlida
para as condies de contorno do problema, ou seja, devemos mostrar que
podemos escolher a constante c to grande quanto possvel que o limite T(n)
cnlogn vale para as condies de contorno. Assumindo que T(1) = 1 como
condio de contorno da recorrncia, no conseguiremos encontrar uma
PROJETO E ANLISE DE ALGORITMOS 37
constante c, pois T(1) c 1 log1 = 0. A sada para superar esta difculdade
consiste em usar um valor n n0 sendo n
0
uma constante qualquer maior
do que 1. Assim podemos impor T(2)= 4 e T(3)= 5, constantes e usar a
recorrncia a partir de T(4).
T(2) c 2 log2
4 2 c
c 2, para todo n 2.
Como observamos, qualquer valor de c 2 sufciente para que os
casos bsicos de n=2 e n=3 sejam vlidos.
A grande difculdade deste mtodo que no existe uma forma
geral para solucionar recorrncias corretamente. Pressupor soluo exige
experincia e criatividade na rea, entretanto existem algumas heursticas,
rvore de recurso, que veremos adiante, que podem ajudar a gerar boas
hipteses.
Se uma recorrncia for semelhante a uma que voc j tenha visto
antes, ento ser fcil supor uma soluo semelhante.
Exemplo: Considere a recorrncia.
T(n) = 2T( n/2 +35) + n, que semelhante recorrncia
vista anteriormente, exceto pelo termo 35. Este termo no pode afetar
substancialmente a soluo da recorrncia. Quando n grande, a diferena
entre T( n/2 ) e T( n/2 +35) no grande. Conclumos que T(n)=O(nlogn),
pode ser verifcado usando o mtodo da substituio.
Exemplo: Resolver a recorrncia T(n) = 2T(n ) + logn
Parece difcil, porm tentaremos resolv-la mediante uma substituio
de variveis. Por convenincia vamos considerar que n inteira. Substituindo
m = logn obtemos T(2
m
) = 2T(2
m/2
) + m. Substituindo a recorrncia S(m)
= T(2
m
), produzimos a recorrncia S(m) = 2S(m/2) + m, cuja soluo j
conhecida, ou seja, S(m) = O(m logm) . Substituindo m obtemos T(n) = T(2
m
)
= S(m) = O(m logm)= O(logn.log(logn))
O Mtodo de rvore de Recurso (Iterao)
Embora o mtodo de substituio possa fornecer uma prova de que
uma soluo para uma recorrncia correta, s vezes difcil apresentar
uma boa suposio. Traar uma rvore de recurso um caminho direto
para se criar uma boa suposio. Este mtodo consiste em desenhar uma
rvore cujos ns representam os tamanhos dos subproblemas. Cada nvel i
UNIDADE 1 38
contm todos os subproblemas de profundidade i. Dois aspectos importantes
devem ser considerados: A altura da rvore e o nmero de passos executados
em cada nvel. A soluo de recorrncia (tempo de execuo do algoritmo)
a soma de todos os passos de todos os nveis. No caso particular em que
o total de passos de cada nvel o mesmo, l(n), por exemplo, a soluo
T(n)=h.l(n), onde h a altura da rvore.
Uma rvore de recurso usada para gerar uma boa suposio, o
qual verifcado pelo mtodo de substituio.
Talvez o mtodo seja mais intuitivo.
Exemplo: Considere a equao de recorrncia do Mergesort.
Veremos como uma rvore de recurso forneceria uma boa suposio
para a recorrncia T(n) = 2T(n/2) + n
1. Supomos que n potncia de 2.
n/2
h
= 1 h = log
2
n Total = h.n
A altura da rvore h=logn Logo, O(n . log n)
Mesmo este mtodo no exigindo inspirao, requer mais lgebra que
o mtodo da substituio. A ideia consiste em expandir (iterar) a recorrncia e
express-la como um somatrio e dependendo apenas de n e das condies
iniciais.
Exemplo: Considere a recorrncia
Soluo usando a lgebra:
T(n) = 2(2T(n - 2) + 1) + 1
PROJETO E ANLISE DE ALGORITMOS 39
T(n) = 4T(n - 2) + 2 + 1
T(n) = 4(2T(n - 3) + 1) + 2 + 1
T(n) = 2
3
T(n - 3) + 4 + 2 + 1
- - - - - - - - - - - - - - - - - - - -
T(n) = 2
i
T(n-i) + 2
i-1
+ 2
i-2
+...+ 2
1
+ 2
0
O caso base alcanado quando i = n - 1
Logo, T(n) = 2
n-1
+ 2
n-2
+ 2
n-3
+...+ 2
1
+ 2
0
T(n) = 2
n
- 1 = O(2
n
)
Mtodo Mestre
Este mtodo fornece uma receita de bolo para resolver recorrncia da
forma: T(n) = aT(n/b) + f(n), onde a 1 e b > 1 so constantes e f(n) uma
funo assintoticamente positiva. O mtodo exige a memorizao de trs
casos, mas a soluo de muitas recorrncias torna-se mais simples.
Utilizando o mtodo mestre, a soluo depende do Teorema Mestre.
Teorema Mestre
Sejam a 1 e b > 1, constantes. Seja f(n) uma funo, e seja T(n)
defnido no domnio dos inteiros no negativos pela recorrncia T(n) = aT(n/b)
+ f(n), onde n/b pode ser n/b ou n/b. Ento, T(n) pode ser limitada
assintoticamente por:
1- Se f(n) = O(n
log
b
a-) para uma constante > 0, ento T(n) = (n
log
b
a).
2- Se f(n) = (n
log
b
a), ento T(n) = (n
log
b
alogn).
3- Se f(n) = (nlogba+) para uma constante > 0 e se af(n/b) cf(n)
para alguma constante c < 1 e n sufcientemente grande, ento T(n) = (f(n)).
Para melhor compreender o signifcado deste teorema, observe que
nos trs casos estamos comparando a funo f(n) com a funo n
log
b
a
. A
soluo da recorrncia dada pela maior das duas funes. No caso 1, a
funo nlogba maior, ento a soluo T(n) = (n
log
b
a
). No caso 2, as funes
so de mesma dimenso, sendo introduzido um fator logn e a soluo T(n)
= (n
log
b
a
logn) = (f(n)logn). No caso 3, a funo f(n) maior, ento, a soluo
T(n) = (f(n)).
importante ressaltar que o teorema no cobre todos os casos
possveis, apenas aqueles em que f(n) menor que nlogba por um fator
polinomial, isto , f(n) deve ser assintoticamente menor ou maior que nlogba
UNIDADE 1 40
para os casos 1 e 3 do teorema Mestre. Para o caso 3, deve ser satisfeita a
condio de regularidade onde af(n/b) cf(n).
Exemplo: Considere a seguinte equao de recorrncia
1. T(n) = 9T(n/3) + n
Neste caso, a = 9, b = 3, f(n) = n n
log
b
a
= n
log
3
9
= (n
2
)
Como f(n) = O(n
log
b
a-
=
=
n
i
i i
v x Minx
1
0
W v x
n
i
i i
=1
UNIDADE 3 86
Sem perda de generalidade, supondo que os itens estejam ordenados
pela ordem no crescente da razo v
i
/w
i
. Por contradio, supondo que seja
possvel retirarmos uma quantidade q do item i da soluo fornecida pelo
algoritmo guloso e substituirmos pela mesma quantidade q do item j de forma
tal que o valor a ser transportado seja maior. O valor transportado obtido pelo
algoritmo guloso vale:
Com a retirada de uma quantidade q de um elemento i da soluo e a
colocao da mesma quantidade de um elemento j, o valor a ser transportado
passa a ser:
A hiptese de x
0
>x
0
, de onde se conclui que x
0
- x
0
> 0, e assim,
o que uma contradio.
Logo, o algoritmo guloso sempre acha uma soluo tima para o
problema da mochila fracionrio.
Complexidade do Problema da Mochila Fracionrio:
Para resolver o problema da mochila fracionrio, uma abordagem
consiste em ordenar os valores v
i
/w
i
, o que exige O(nlogn) passos, onde m
o nmero total e elementos.
Resumindo, os passos para o projeto de algoritmos gulosos so:
1. Formule o problema como um problema de otimizao (P.P.M.), no
qual uma escolha feita, restando-nos ento resolver um nico subproblema
a resolver.
2. Provar que existe sempre uma soluo tima do problema que
atende escolha gulosa, ou seja, a escolha feita pelo algoritmo guloso e
segura.
3. Demonstrar que, uma vez feita a escolha gulosa, o que resta a
=
=
n
i i
i
i
w
v
x x
1
0
j
j
i
i
'
v
w
q
v
w
q
x x + - =
0 0
i
i
j
j
j
j
i
i
w
v
w
v
w
v
w
v
q > >
+ 0
PROJETO E ANLISE DE ALGORITMOS 87
resolver um subproblema tal que se combinarmos a resposta tima deste
subproblema com o(s) elemento(s) da escolha gulosa, chega-se soluo
tima do problema original. Esta a parte que requer mais engenhosidade.
4. Normalmente, a prova comea com uma soluo tima genrica e
mostram que ela pode ser modifcada possivelmente apos vrios passos at
que ela inclua o(s) elemento(s) identifcado(s) pela escolha gulosa.
Cdigo de Huffman
Esta uma estratgia efciente para a compresso de dados, muito
utilizada em sistemas para internet, que utiliza uma tabela das frequncias de
ocorrncia dos caracteres para elaborar um modo timo de representar cada
caractere como uma cadeia binria.
As redues no tamanho dos arquivos dependem das caractersticas
dos dados contidos nos mesmos. Em geral, os valores tpicos oscilam entre
20% e 90%.
Exemplo: arquivo texto contendo 100.000 caracteres no alfabeto e =
{a; b; c; d; e; f}. As frequncias de cada caractere no arquivo so indicadas
na tabela abaixo.
A codifcao do arquivo consiste em representar cada caractere por
uma sequncia de bits.
Exemplo: Para armazenar compactamente um arquivo de dados com
100.000 caracteres
Observando a tabela que representa cada caractere por cdigos, qual
o tamanho (em bits) do arquivo comprimido usando os cdigos acima?
Por um cdigo de tamanho fxo (3 bits) : 3 x 100.000 = 300.000
Por um cdigo de tamanho varivel:
Saiba Mais
O termo algoritmo
guloso foi criado por
Jack Edmonds em 1971,
embora o conceito
j existisse desde a
segunda grande guerra
mundial.
UNIDADE 3 88
45 x 1 + 13 x 3 + 12 x 3 + 16 x 3 + 9 x 4 + 5 x 4
=
224.000 bits
Cdigos Livres de Prefxo
Cdigos livres de prefxo so aqueles dados dois caracteres quaisquer
i e j representados pela codifcao, a sequncia de bits associada a i no
um prefxo da sequncia associada a j. So cdigos nos quais nenhuma
palavra de cdigo tambm um prefxo de alguma outra palavra de cdigo.
Pode-se provar que sempre existe uma soluo tima do problema da
codifcao que dado por um cdigo livre de prefxo.
O processo de codifcao, ou seja, de gerao do arquivo comprimido
sempre fcil, pois se reduz a concatenar os cdigos dos caracteres
presentes no arquivo original em sequncia.
Por exemplo, usando a codifcao de tamanho varivel do exemplo
anterior, o arquivo original dado por "abc" seria codifcado por 0101100.
A vantagem dos cdigos livres de prefxo se torna evidente quando
vamos decodifcar o arquivo comprimido.
Como nenhuma palavra de cdigo um prefxo de qualquer outra, a
palavra de cdigo que inicia um arquivo codifcado no apresenta ambiguidade.
Pode-se simplesmente identifcar este cdigo inicial, traduzi-lo de volta
ao caractere original e repetir o processo no restante do arquivo comprimido.
Exemplo: usando a codifcao de tamanho varivel do exemplo
anterior, o arquivo comprimido contendo os bits 001011101 divide-se de
forma unvoca em 0 0 101 1101, ou seja, corresponde ao arquivo original
dado por aabe.
O processo de decodifcao precisa de uma representao
conveniente para o cdigo de prefxo, de forma que a palavra de cdigo inicial
possa ser extrada com facilidade. A soluo para isso utilizar rvore binria
Se C o alfabeto do qual os caracteres so obtidos e todas as
frequncias de caracteres so positivas, ento a rvore para um cdigo de
prefxo timo tem exatamente |C| folhas, uma para cada letra do alfabeto e
exatamente |C|1 ns internos. Dada uma rvore T, para cada caractere c no
alfabeto C, seja f(c) a frequncia de c no arquivo e seja dT(c) a profundidade
da folha de c na rvore (ou o comprimento da palavra cdigo). O nmero de
bits exigidos para codifcar um arquivo (ou custo da rvore) :
PROJETO E ANLISE DE ALGORITMOS 89
O flho esquerdo est associado ao bit 1 enquanto o flho direito
fca associado ao bit 0. Nas folhas encontram-se os caracteres presentes no
arquivo original.
rvore de Tamanho fxo:
rvore de Tamanho varivel:
( )
C c
T
c d c f = T B ) ( ) (
UNIDADE 3 90
Huffman criou um algoritmo guloso que produz um cdigo de prefxo
timo chamado cdigo de Huffman.
No pseudocdigo, C um conjunto de n caracteres e cada caractere
c C um objeto com uma frequncia defnida f [c].
O algoritmo constri de baixo para cima a rvore T correspondente
ao cdigo timo.
Comea com um conjunto de |C| folhas e executa uma sequncia
de |C|1 operaes de intercalao para criar a rvore fnal. Uma fla de
prioridade mnima Q, tendo f como chave, usada para identifcar os dois
objetos menos frequentes a serem intercalados. O resultado da intercalao
um novo objeto cuja frequncia a soma das frequncias dos 2 objetos que
foram intercalados.
1 Huffman (C)
Entrada: conjunto de caracteres C e as frequncias f dos caracteres
em C
Sada: raiz de uma rvore binria representando uma codifcao
tima livre de prefxos
2 n |C|
3 Q C # Q a fla de prioridades dada pelas frequncias dos
vrtices ainda no intercalados
PROJETO E ANLISE DE ALGORITMOS 91
4 para i 1 at n -1 faa
5 aloque um novo n z
6 esq[z] x EXTRACT-MIN(Q)
7 dir[z] y EXTRACT-MIN(Q)
8 f[z] f[x] + f[y]
9 insert(Q,z)
10 retorne EXTRACT-MIN(Q) # retorna a raiz da rvore
A seguir, mostraremos como funciona o algoritmo para as frequncias
dadas na tabela inicial. Cada passo mostra o contedo da fla classifcada
crescentemente de acordo com a frequncia. A cada passo, duas rvores
com menores frequncias so unidas. Os ns folhas so exibidos com
retngulos contendo um caractere e sua frequncia. Ns internos so
exibidos com crculos contendo a soma das frequncias dos ns flhos. Como
tratado anteriormente, rotula-se com 0 o conector ao conectar um n pai com
seu flho esquerdo e 1 ao seu flho direito. O cdigo para um caractere a
sequncia de rtulos da raiz at chegar ao caractere.
Passo 1
Passo 2
Passo 3
UNIDADE 3 92
Passo 4
Passo 5
PROJETO E ANLISE DE ALGORITMOS 93
Passo 6 a rvore fnal
Fazendo a Anlise do Algoritmo, temos que os custos so:
5. Construir Heap O(n)
6. (n 1) iteraes, cada uma com 3.O(log n)
Portanto, o algoritmo executa em tempo O(n log n)
Exerccio 1
1. O Professor Chiquinho elaborou um algoritmo para realizar o merge de
k listas ordenadas, cada uma com n/k elementos. O algoritmo pega a
primeira lista e realiza o merge com a segunda lista, fazendo uso de um
algoritmo de tempo linear para fazer o merge de duas listas ordenadas
como o algoritmo de merge do MergeSort. Ento, um merge feito com
a lista resultante de 2n/k elementos e a terceira lista, um novo merge
com a lista resultante de 3n/k elementos e a quarta lista, e assim
sucessivamente, at conseguir uma nica lista ordenada com todos os
n elementos. Faa uma anlise de pior caso do tempo de execuo do
algoritmo do Professor Chiquinho. Apresente o resultado em termos de
n e k.
UNIDADE 3 94
2. Representar o polinmio p(n)=a
0
+a
1
n+a
2
n
2
+...+a
d
n
d
de grau d por um
vetor P[0,...,d] contendo seus coefcientes. Supondo que voc tenha um
algoritmo capaz de multiplicar um polinmio de grau k por um polinmio
de grau 1 em tempo O(k), bem como um outro algoritmo capaz de
multiplicar dois polinmios de grau k em tempo O(k.logk). Sugira um
algoritmo efciente baseado na tcnica dividir-e-conquistar que encontre
o nico polinmio p(n) de grau d cujo coefciente do termo de maior grau
1, tal que p(n
1
)= p(n
2
)= ... =p(n
d
) = 0, para n
1
, n
2
e n
d
inteiros. Analise a
efcincia do algoritmo sugerido.
3. Considere n pontos distribudos ao longo do eixo dos x. O objetivo
encontrar os dois pontos com menor distncia mtua.
a) Escreva um algoritmo baseado na estratgia dividir-e-conquistar que
resolva o problema. Indique a complexidade do algoritmo.
b) Se utilizarmos fora bruta, qual a complexidade desta soluo?
4. Dados n pontos no plano de coordenadas cartesianas, sugerir um
algoritmo capaz de achar o par de pontos mais prximos em O(n.logn)
passos no pior caso.
5. Considere um array A de nmeros reais. Escreva um algoritmo O(n.log n)
que encontre um par de elementos (x, y) de A, em que |x + y| seja mnimo.
6. Um switch um circuito com duas entradas, um controle e duas sadas.
A entrada A sair na sada correspondente; A e B sair na sada B ou
A sair em B e B sair em A, dependendo da posio do controle. Use
estes switches para construir uma rede com n entradas e n sadas tal
que qualquer das n! das entradas seja possvel na sada. O nmero de
switches deve ser O(n.logn).
7. Um problema que est relacionado com o problema de ordenao o de
encontrar o k-simo menor elemento de uma lista no ordenada.
a) Escreva um algoritmo que encontre o k-simo menor elemento. Esse
algoritmo deve ser (n) na mdia e no melhor caso.
b) Argumente que seu algoritmo est correto.
c) Efetue a anlise de complexidade de sua soluo para melhor caso, pior
caso e caso mdio.
8. Dados os pontos P
1
(x
1
,y
1
,h
1
) e P
2
(x
2
,y
2
,h
2
), onde x
i
,y
i
so as coordenadas
no plano e hi a altura do ponto. Considerando que tais pontos esto sobre
um terreno real e que ao terreno foi associada uma matriz InfoTerreno[0..
max,0..max] com cada clula representando uma clula de terreno
de dimenses kxk em metros e cada clula da matriz armazena os
PROJETO E ANLISE DE ALGORITMOS 95
campos elevao (que corresponde altura do ponto mdio do terreno
representado pela clula) e tipo de terreno. O tipo de terreno pode ser
1=limpo, 2=vegetao, 3=foresta, 4=urbano, 5=estrada. As coordenadas
dos pontos P
1
e P
2
so em metros. Desenvolver um algoritmo para
determinar se h uma linha de visada direta entre os mesmos sem
obstculos. So considerados obstculos a existncia de rea urbana,
vegetao ou foresta por um trecho superior a 20 metros ou o terreno Ter
altura superior altura da linha de visada.
9. Seja um conjunto de n garrafas distintas e n correspondentes rolhas
(existe uma correspondncia de um-pra-um entre garrafas e rolhas). No
permitido comparar duas garrafas ou duas rolhas diretamente, mas
permitido comparar uma garrafa e uma rolha para saber quem maior das
duas. Escreva um algoritmo para encontrar o casamento entre garrafas e
rolhas. esperado que, no caso mdio, a complexidade de seu algoritmo
seja O(n.log n).
10. Considere uma lista com n nmeros distintos x
1
, x
2
, ..., x
n
, em ordem
arbitrria, e um valor k < n. Escreva em pseudocdigo, um algoritmo que
imprima os k menores valores da lista, em qualquer ordem. Por exemplo,
se k = 3, deve ser impresso os 3 menores valores de x
1
, x
2
, ..., x
n
. O
algoritmo deve resolver o problema em O(n), independente do tamanho
de k.
11. Considere um array A, contendo n nmeros distintos. Esse array tem a
seguinte propriedade: existe um ndice m de modo que os nmeros do
subarray A[1..m] esto em ordem crescente e os nmeros do subarray
A[m+1..n] esto em ordem decrescente. Escreva (em pseudocdigo) um
algoritmo O(log n) que retorna o ndice m. Por exemplo, se o array de
entrada A[1..9] = [3; 7; 8; 9; 6; 5; 4; 2; 1], a sada deve ser m = 4.
Argumente que o seu algoritmo est correto.
12. Implementar em linguagem C o algoritmo para produto de nmeros
grandes de forma tal que receba os nmero de tamanho varivel e retorne
o produto correto. A implementao deve tornar o algoritmo efciente para
a soluo computacional.
Exerccio 2
1. Determinar uma parentizao tima para o produto de matrizes cuja
sequncia de dimenses [5,10,3,12,5,50,6]
UNIDADE 3 96
2. Elaborar um algoritmo que imprima a parentizao tima de uma cadeia
de matrizes usando a matriz s fornecida pelo algoritmo Parentizar_
Cadeia_Matriz(p:vetor[0..n]).
3. Mostrar que uma parentizao completa de uma expresso com n
elementos tem exatamente n-1 pares de parnteses.
4. Seja T(n) um nmero de Catalo, propor um algoritmo efcaz para avaliar
5. Aplicar o algoritmo de caminho mnimo apresentado ao seguinte grafo G
representado pela sua matriz de distncias.
6. Voc dispe de um container com capacidade para W toneladas e dispe
de diversas mercadorias a serem transportadas. Cada mercadoria
caracterizada por seu peso e valor. Aplicar a tcnica de programao
dinmica para conceber um algoritmo para alocao tima de mercadorias
de forma a maximizar o valor transportado. dado como entrada uma
matriz de mercadorias e a capacidade do container. Implementar o
algoritmo e resolver o problema abaixo.
W = 15 ton
PROJETO E ANLISE DE ALGORITMOS 97
7. Uma cadeia de 3 lanchonetes comprou 8 lates de leite, cada um ao
preo de $ 20,00. Cada lato pode ser vendido ao preo de $ 40,00.
O fornecedor se compromete a recomprar cada lato no vendido ao
fm do dia, pagando $ 10,00 por lato. Constatou-se historicamente a
probabilidade de demanda em cada uma das lanchonetes, formando-se
a tabela abaixo.
Qual deve ser a alocao de lates de forma a maximizar o lucro esperado?
Sugesto: Construa uma tabela com o lucro esperado para cada
quantidade de lates e para cada lanchonete.
8. O Secretrio de Segurana do Estado do Piau constatou que o nmero de
crimes em uma determinada localidade depende do nmero de patrulhas
alocadas, segundo a tabela abaixo:
UNIDADE 3 98
O secretrio conta com 8 viaturas. Use a programao dinmica para
determinar a alocao de patrulhas que minimize o total de crimes.
9. Um investidor tem 6 unidades monetrias (digamos 6 mil reais para serem
investidos em lotes de 1 mil reais) para investir em um negcio de risco.
O capital ganho numa etapa tambm pode ser investido. Um determinado
investimento oferece as seguintes possibilidades.
Dobrar o valor investido 30%
Manter mesmo valor 40%
Perder o valor investido 30%
1. Qual o maior ganho possvel para os prximos quatro anos?
2. Qual a probabilidade de conseguir este ganho?
3. Qual a estratgia adotada se quiser maximizar a probabilidade acumulada
de conservarmos no mnimo 25 unidades (25 mil reais) ao fm de quatro anos?
10. Seja B1,..., Bn um conjunto de n caixas todas com um mesmo peso p e
tais que a caixa Bi tem um custo Ci.
a) Escreva um algoritmo que dado um valor K, determina um subconjunto de
caixas cujo peso menor ou igual a K e tal que o custo total mximo.
b) Determine a complexidade de pior caso do seu algoritmo, considerando o
nmero de vezes que cada caixa analisada.
c) Mostre que o seu algoritmo est correto, isto , que nenhum outro
subconjunto de caixas com peso total menor ou igual a K possui um custo
total maior do que o custo total do subconjunto obtido pelo seu algoritmo.
Exerccio 3
1. O mtodo guloso sempre fornece uma soluo tima? Justifque a sua
resposta atravs de um exemplo.
2. Sobre mtodos gulosos:
a) Apresente sua defnio.
b) Quais as suas vantagens?
c) Quais as suas desvantagens?
3. Para o problema do troco, suponha que as moedas disponveis so c
0
,
c
1
,..., c
k
, para inteiros c>1 e k>1. Mostrar que o algoritmo guloso sempre
leva a uma soluo tima.
4. Suponha que temos um conjunto de m atividades a serem alocadas a um
grande nmero de locais. Deseja-se alocar todas as atividades usando
o menor nmero possvel de locais. Cada atividade possui um tempo
PROJETO E ANLISE DE ALGORITMOS 99
inicial e um tempo fnal. Projetar um algoritmo guloso para resolver este
problema.
5. Considerando o problema de selos de postagem, argumente que o seu
algoritmo est correto e efetue a anlise de complexidade de sua soluo.
a) Mostre que qualquer postagem de valor inteiro maior do que 7 centavos
pode ser formada, utilizando apenas selos de 3 e 5 centavos.
b) Escreva um algoritmo que dado um valor da postagem retorna o nmero
de selos de 3 e 5 centavos, respectivamente.
c) Mostre que o algoritmo est correto.
d) Indique a complexidade do algoritmo.
6. Considere o seguinte problema de coleta de cupons. Existe uma certa
quantidade de diferentes tipos de caixa de biscoito. Em cada caixa de
biscoito encontramos um cupom que d um desconto na compra de uma
outra caixa de biscoito (no necessariamente do mesmo tipo). possvel
utilizar mltiplos cupons para comprar uma nova de caixa de biscoito at
o valor de obt-la grtis. No possvel receber dinheiro de volta, mesmo
se sobra cupom. necessrio comprar uma caixa de cada tipo de biscoito,
gastando o menor valor possvel. Descreva um algoritmo efciente, que
recebe como entrada, para cada tipo de biscoito, seu preo, o valor do
cupom e a marca contemplada no cupom e retorna a ordem tima de
compra das caixas de biscoito.
7. Dados seis DVD+Rs, cada um com capacidade de armazenamento de
10GB, necessitamos armazenar seis arquivos de tamanhos 5GB, 6GB,
3GB, 7GB, 5GB e 4GB nestes DVD+Rs. O problema encontrar o nmero
mnimo de DVD+Rs necessrios para armazenar todos estes arquivos.
Considere que os arquivos no podem ser particionados.
a) possvel obter uma soluo exata para este problema? Caso positivo,
descreva a sua soluo.
b) possvel obter uma soluo exata para este problema utilizando um
algoritmo de efcincia polinomial? Explique a sua resposta.
c) Utilizando a estratgia fora bruta, projete um algoritmo para determinar
o nmero mnimo de DVD+Rs necessrios para armazenar todos estes
arquivos. Apresente o pseudocdigo ou a descrio dos passos, utilizando
linguagem natural.
d) Qual o menor nmero de DVD+Rs encontrado pelo seu algoritmo para
armazenar os seis arquivos?
UNIDADE 3 100
e) possvel utilizar a estratgia dividir-e-conquistar para resolver este
problema? Justifque sua resposta.
8. O professor Joo est planejando uma viagem entre as cidades A e B. Ele
dispe da distncia total entre as duas cidades, a localizao de todos os
postos de abastecimento ao longo do trajeto e a autonomia do veculo. O
professor deseja fazer o menor nmero possvel de paradas. Descrever
uma estratgia efciente para determinar em quais postos parar e provar
que sua estratgia conduz a uma soluo tima.
9. Modifcar o algoritmo de Dijkstra implementando a lista de prioridade com
o uso de heap. Determinar a complexidade desse algoritmo. melhor
do que o algoritmo apresentado?
10. Modifcar o algoritmo de Dijkstra implementando a lista de prioridade com
o uso de lista encadeada ordenada. Determinar a complexidade desse
algoritmo. melhor do que o algoritmo apresentado?
11. Mostrar como resolver o problema da mochila em tempo O(n), onde n o
nmero de itens disponveis.
12. O problema conhecido como task-scheduling para um processador tem
como entrada as duraes das tarefas t1, t2,...,tn. Programar a ordem das
tarefas tal que o tempo mdio gasto por cada uma delas no sistema seja
mnimo. Propor um algoritmo guloso que resolva o problema e provar sua
otimizao usando matrides. Qual a complexidade do algoritmo?
13. Seja o problema para achar um subconjunto T de arestas de um grafo
conexo G, tal que todos os ns permaneam conexos quando somente
as arestas de T so usadas e a soma das arestas a menor possvel.
Imagine a possibilidade de haver arestas com comprimentos negativos. A
soluo pode no ser uma rvore.
14. Considere um arquivo texto onde encontramos apenas os seguintes
caracteres: a(25), b(12), c(4), d(4), e(7), i(30), z(18). Entre parnteses
est indicada a frequncia de ocorrncia de cada caractere. Aplicar a
estratgia de Huffman para a compresso de arquivos. Qual seria o fator
de compresso neste caso?
PROJETO E ANLISE DE ALGORITMOS 101
UNIDADE 4
Classes de Problemas
Com esta unidade finalizaremos o nosso estudo de Projeto de Algoritmos e sua anlise classificando
os problemas de acordo com a sua natureza e complexidade. Visamos apenas oferecer ao leitor uma
viso geral dos problemas, enfatizando os de ordem polinominal e os problemas no determinstico
polinominalmente (NP).
Resumindo
PROJETO E ANLISE DE ALGORITMOS 103
CLASSES DE PROBLEMAS
INTRODUO
"Alguns problemas computacionais so difceis. Tentamos
e tentamos
encontrar algoritmos efcientes para resolv-los, mas
falhamos
repetidamente. Seria bom se pudssemos provar que
impossvel
encontrar um algoritmo efciente nestes casos. Tal prova
seria til,
pois poderamos nos tranquilizar sabendo que um
algoritmo
desse tipo no pode ser achado.
Goodrich, Michael T., Tamassia, Roberto
H alguns problemas computacionais que so difceis de serem
resolvidos ou que impossvel se provar que no existe soluo efciente.
Vimos a convenincia de se utilizar medidas de complexidade como
medida de efcincia. Aprendemos que um algoritmo efciente quando a
sua complexidade for polinomial em relao ao tamanho de sua entrada. Um
algoritmo dito ser de tempo polinomial se for O(nk), para alguma constante
k > 0. Qualquer outro algoritmo que no for polinomial exponencial.
Contudo, essa classifcao no absoluta. Algumas vezes pode ser
apenas satisfatria, mas, na maioria dos casos, aceitvel.
Solucionabilidade de Problemas
Problemas Resolvveis e No Resolvveis
UNIDADE 4 104
De uma maneira geral, os problemas podem ser divididos em
Resolvveis e No Resolvveis:
Resolvveis - H pelo menos um algoritmo que o descreve e o resolve.
No Resolvveis - No h um algoritmo para resolv-los. So tambm
chamados de Problemas Halting, ou seja, problemas onde: Sejam dados
um programa qualquer e um conjunto de entradas vlidas e genricas. O
programa ir terminar?
Problemas Tratveis e Intratveis
Problemas Tratveis
So todos os tipos de problemas da natureza que podem ser resolvidos
em tempo hbil, independentemente do tamanho da entrada. Nestes casos,
compensa investir em melhorias nas velocidades de processamento do
hardware ou at mesmo em reprojetar processos, como por exemplo, uma
implementao do algoritmo timo por meio de processamento paralelo ou
distribudo, para que seja possvel a obteno de respostas em tempo mais
breve, uma vez que o tempo de resposta dos algoritmos timos dos problemas
tratveis previsivelmente de natureza igual ou abaixo complexidade
polinomial. Entre os exemplos, podemos destacar:
1. Problemas de Ordenao;
2. Soma, multiplicao, produto, diviso, MDC, MMC e exponenciao
em aritmtica ilimitada;
3. Problemas de Atribuio;
4. Problema de Filas de Prioridade;
5. Problemas de seleo em estruturas ordenadas;
Problemas Resolvveis, mas Intratveis
So todos os tipos de problemas da natureza que podem ser
resolvidos, porm no em tempo hbil. A solucionabilidade desses problemas
necessita de um grande poder de computao ainda no desenvolvido, o
que torna invivel a sua tratabilidade. Como exemplos, temos o Problema do
Caixeiro Viajante, Problema do Ciclo Hamiltoniano, o Problema de encontrar
subconjuntos mutuamente disjuntos de um conjunto, dadas condies de
formao (Restries), o Problema de encontrar o melhor preenchimento de
PROJETO E ANLISE DE ALGORITMOS 105
uma mochila, sabendo que ela tem um limite de peso para carregar itens de
valor, dentre muitos itens existentes de valor conhecido, etc.
Problemas Intratveis e Indecidveis
Esta classe de problemas extrema, em termos de complexidade,
uma vez que estes no tm nenhuma garantia sobre sua programabilidade,
ou at mesmo, se um algoritmo existe para trat-lo de alguma forma, tal
algoritmo no h prova dele ser timo a menos que P=NP, o que ser visto
mais adiante.
Sendo assim, nem sempre possvel afrmar que a soluo
tima desejada possvel de ser obtida, uma vez que no existe mtodo
generalista que a encontre para toda instncia. Como exemplos, pode-se
citar: o problema do Nmero Cromtico; o problema de Steiner Euclidiano;
o problema de Empacotamento de Vrtices (Vertex Packing), etc. Tais
problemas aproximam-se queles do tipo Halting, porm, no so Halting.
Formas de Problemas
Para melhor abordar a questo da complexidade de problemas e o
enquadramento dos mesmos nas classes P e NP, conveniente classifc-los
nas seguintes categorias:
1. Problemas de deciso;
2. Problemas de localizao;
3. Problemas de otimizao.
Problemas de Deciso
Os problemas de deciso so problemas cuja soluo corresponde
a responder sim ou no ao que foi formulado. Por exemplo, dado um grafo
G(V,E), orientado e ponderado nas arestas, dois vrtices u, v V e um inteiro
no negativo k. Existe um caminho em G entre u e v com comprimento menor
ou igual a k? Ento, dada a instncia I=<G,u,v,k>, a resposta ser sim se
houver tal caminho; ou no, caso contrrio.
UNIDADE 4 106
Problemas de Localizao
Os problemas de localizao so aqueles nos quais o objetivo
encontrar, caso exista, determinada estrutura satisfazendo requisitos
especifcados por uma questo. No caso do problema de caminho, dado o
grafo G(V,E) ponderado nas arestas, os vrtices u, v e um nmero inteiro k.
O problema formulado consiste em localizar, caso exista, um caminho com
comprimento menor ou igual a k. A resposta seria exibir uma sequncia de
vrtices u, ....,v.
Problemas de Otimizao
Os problemas de otimizao so os que tm por objetivo encontrar
uma determinada estrutura satisfazendo critrio timo predefnido. Para
problema do caminho, um critrio timo poderia ser o caminho de menor
comprimento possvel.
Apesar da classifcao, tais classes apresentam um ntimo
relacionamento entre si. O problema de deciso parece ser bem mais fcil que
os de localizao e otimizao, o que no totalmente verdadeiro. Podemos
afrmar que o problema de deciso apresenta difculdade no maior que a
do problema de localizao, e este, por sua vez, apresentam difculdade no
maior que a do problema de otimizao correspondente. H casos em que os
Problemas de Localizao e Otimizao so to difceis quanto o Problema
de Deciso respectivo.
Sendo o problema de deciso normalmente mais fcil e pelo fato do
tamanho da sada do mesmo ser constante, sim ou no, torna-o padro para
anlise de intratabilidade de problemas.
Problemas de Deciso da Classe P
Estudaremos agora a classe de problemas que possuem soluo em
tempo polinomial e so tambm chamados de tratveis. Cumpre ressaltar
que um problema que requer tempo (n
100
) intratvel, bem como qualquer
problema que exige tempo polinomial com grau muito elevado.
Podemos afrmar que um problema tratvel, caso ele possa ser
solucionado em um tempo oportuno para o fm a que se destina.
Outro aspecto a considerar que muitos problemas que podem ser
PROJETO E ANLISE DE ALGORITMOS 107
resolvidos em tempo polinomial em um modelo computacional pode ser
resolvido em tempo polinomial em outro modelo.
Defnio - Classe P
P a classe de problemas de deciso que podem ser resolvidos por
um algoritmo de tempo polinomial.
A classe de problemas polinomiais tem propriedades de fechamento
em relao adio, multiplicao e composio. Assim, um algoritmo
polinomial que gera entradas para outro algoritmo polinomial forma um
algoritmo composto tambm polinomial.
O problema de caminho apresentado no pargrafo anterior um caso
tpico de problema da classe P.
Observe que dado um problema para o qual no se conhece algoritmo
polinomial no signifca, necessariamente, que tal problema no pertena
classe P. Para tal afrmao, deve ser exibida uma prova formal de que todo
algoritmo possvel para resolver tal problema no polinomial.
Apresentaremos, a seguir, dois problemas para os quais no se
conhece algoritmo exato e tempo polinomial:
Problema de Satisfabilidade (Satisfability Problem - SAT)
Dada uma expresso lgica E(x1,x2,...,xn) na forma normal conjuntiva,
isto , constituda de uma conjuno de clusulas, cada uma delas constituda
de uma disjuno de literais.
Exemplo:
onde x
1
,x
2
,x
3
so variveis lgicas denominadas literais e as
expresses entre parnteses so as clusulas.
O problema da Satisfabilidade consiste em determinar se a expresso
verdadeira para uma data atribuio das variveis lgicas. Dado x
1
=V, x
2
=F,
x
3
=F, a resposta exige o teste de cada uma das clusulas o que conduz
resposta F. No problema dado, a expresso ser verdadeira quando x
1
= x
2
= x
3
=F.
Desafo:
Suponha que um
orculo deu a voc um
computador mgico C
que recebe qualquer
frmula booleana B
em FNC (forma normal
conjuntiva) e responde
uma etapa se B pode ser
satisfeita ou no. Mostre
como usar C para
construir uma atribuio
de valores booleanos
que satisfaam qualquer
frmula booleana B que
possa ser satisfeita.
Quantas chamadas voc
precisa fazer a C para
fazer isso, no pior caso?
UNIDADE 4 108
Problema do Ciclo Hamiltoniano
Dado um grafo G=(V,E), onde V um conjunto de vrtices e E um
conjunto de pares (u,v) tal que u,v V, denominados arestas. O grafo G dito
no orientado, pois (u,v) = (v,u) denotam uma s aresta. O conjunto V tem n
vrtices e o conjunto E tem m arestas.
Um ciclo hamiltoniano consiste em um caminho fechado v
1
,v
2
,...,v
n
,v
1
e o problema de deciso correspondente pode ser formalizado da seguinte
forma:
Entrada: Grafo G
Questo: G possui um Ciclo Hamiltoniano?
At o momento, no se conhece um algoritmo polinomial que resolva
este problema.
Classe NP
Algoritmos de Verifcao
Consideramos um problema bem mais fcil. Dados um grafo G
hamiltoniano e uma sequncia de vrtices C, provar que C forma um ciclo
hamiltoniano. Todos concordam que um problema bem mais fcil e para
resolv-lo basta percorrer cada um dos vrtices, na ordem, verifcando a
existncia de arestas. Este algoritmo de verifcao pode ser implementado
em O(n
2
), onde n o nmero de vrtices.
Um algoritmo de verifcao um algoritmo A com 2 argumentos onde
um argumento uma cadeia x de entrada e o outro argumento uma cadeia
binria y denominado certifcado. O algoritmo A verifca a entrada x para obter
um certifcado y, tal que A(x,y)=1. Intuitivamente, um algoritmo A verifca uma
linguagem L em busca de um certifcado y para a entrada x L. Entretanto,
para alguma entrada x L e no deve haver certifcado provando que x L.
No caso do Problema Ciclo Hamiltoniano(PCH), o certifcado uma lista de
vrtices do ciclo hamiltoniano.
Defnio da Classe NP
A classe de problemas NP a classe de linguagens que podem ser
verifcadas por um algoritmo de tempo polinomial.. Uma linguagem L pertence
PROJETO E ANLISE DE ALGORITMOS 109
a NP se e somente se existe um algoritmo A que verifque um certifcado em
tempo polinomial.
Ento, podemos concluir que o Problema do Ciclo Hamiltoniano
pertence a NP.
Relao entre P e NP
O que falar de P em relao a NP?
Pela defnio da classe NP, podemos afrmar que se L P, ento,
L NP. A justifcativa imediata, pois se L pode ser resolvido em tempo
polinomial, a verifcao tambm ser em tempo polinomial.
A classe Co-NP
Reduo Linear
Determinar a complexidade exata de um dado problema no uma
tarefa fcil na prtica. Uma soluo consiste em comparar a difculdade
relativa de diferentes problemas. Dizemos que um problema reduz a outro
se podemos transformar efcientemente instncias do primeiro problema em
instncias do segundo problema, tal que, resolvendo o segundo problema,
estaremos resolvendo o primeiro.
Sejam os problemas de multiplicao e quadrado (um nmero elevado
ao quadrado) de grandes nmeros inteiros. J estudamos uma forma de
resolver o problema de multiplicao de inteiros grandes com um algoritmo
O(n
1,59
), que bem melhor em relao ao algoritmo tradicional quadrtico.
Podemos fazer tal clculo com menor complexidade? Achar um algoritmo
melhor funo do desenvolvedor de algoritmos; provar que um algoritmo
UNIDADE 4 110
timo do escopo da complexidade. No entanto, no se conhece limites
inferiores para a multiplicao e para o quadrado.
Multiplicar dois nmeros requer (n), pois uma entrada com n dgitos
exige que cada digito seja verifcado. Procura-se um algoritmo ainda no
conhecido que processe a multiplicao em tempo O(n).
Considerando agora o problema quadrado, ele parece ser mais
simples do que a multiplicao.
Como resolver o problema quadrado usando multiplicao?
x
2
= x.x
Desta forma, estamos reduzindo o problema quadrado ao problema
multiplicao.
Como resolver o problema multiplicao usando quadrado?
x.y = ((x+y)
2
-(x-y)
2
)/4
Desta forma, estamos reduzindo o problema multiplicao ao
problema quadrado.
Quando um problema X redutvel a um problema Y e este redutvel
ao problema X, dizemos que X e Y so computacionalmente equivalentes, ou
seja, a difculdade para resolver X e Y de mesma ordem. Para formalizar a
transformao, basta exibir os algoritmos:
funo quadrado(x)
retornar multiplicar(x,x)
funo multiplicar(x,y)
retornar ((quadrado(x+y) - quadrado(x-y))/4)
Defnio: Sejam A e B dois problemas. Diz-se que A linearmente
redutvel a B, denotado por A l B, se a existncia de um algoritmo para B
que trabalha em um tempo O(t(n)) para uma funo arbitrria t(n) implica que
existe um algoritmo para A que tambm trabalha em um tempo O(t(n)).
Quando A l B e B l A, diz-se que A e B so linearmente equivalentes
e se escreve Al B.
A Classe NP-Completo
H um grande nmero de problemas do mundo real para os quais
no se conhece algoritmos computacionais efcientes para resolv-los e
cuja difculdade intrnseca ainda no foi provada. No entanto, h diversos
problemas, tais como Caixeiro Viajante, Nmero Cromtico em grafos,
Problema da Mochila, Ciclo Hamiltoniano, SAT, Programao Inteira para os
PROJETO E ANLISE DE ALGORITMOS 111
quais h provas formais da difculdade intrnseca em resolv-los. Todos os
problemas desta classe so problemas reconhecidamente intratveis, mas se
for desenvolvido algum algoritmo polinomial para qualquer um dos problemas
desta classe, todos os outros problemas da classe estaro resolvidos em
tempo polinomial, conforme veremos ao longo desta Unidade, no so
poucos os problemas reconhecidamente intratveis.
J vimos o questionamento quanto incluso das classes P e NP.
Intuitivamente, descobrir uma prova mais difcil do que verifc-la. Esta
intuio pode conduzir conjectura de que P NP o que at hoje no
foi possvel verifcar. Por outro lado, h diversos problemas da classe NP
que com certeza no esto em P e que so muito difceis de resolver. Tais
problemas foram agrupados na classe NP-Completo, defnida a seguir.
Defnio: Um problema de deciso X NP-completo se,
i) X NP, e
ii) Y
p
t
X, para todo problema Y NP.
Pela defnio, um problema Y para pertencer classe NP-completo,
primeiro deve pertencer classe NP e em segundo, todos os problemas da
classe NP devem ser redutveis a ele.
Usando a defnio acima, caso tenhamos um problema X NP-
completo e um problema Z da classe NP, se X
p
t
Z, o que pode-se afrmar ?
Pode-se afrmar que Z to difcil quanto X ou pior.
Ser que Z pertence a NP-completo ?
Teorema: Seja X um problema NP-Completo. Considerar um problema
de deciso Z pertencente a NP tal que X
p
t
Z. Ento, Z tambm pertence a
NP-completo.
Prova:
Para z ser NP-Completo deve satisfazer as duas condies da
defnio imediatamente anterior. Primeiro Z NP, o que uma hiptese do
teorema; a segunda condio considera um Y arbitrrio em NP. Como X
NP-Completo e Y NP, segue que Y
p
t
X. Pela hiptese X
p
t
Z.
Agora, dado um novo problema Z, como provar que ele pertence
a NP-Completo? Aplicando a defnio de NP-Completo, primeiro deve-se
provar que Z pertence a NP, conforme a defnio anterior. A seguir, deve-se
provar que todos os problemas da classe NP so redutveis a Z. Como provar
isto?
UNIDADE 4 112
Este teorema um mecanismo de grande valia para provar que um
novo problema Z pertence classe NP-Completo. Basta provar que Z pertence
a NP e escolher um problema X conveniente do conjunto de problemas NP-
Completo conhecido e mostrar que X Turing polinomialmente redutvel a Z.
Os seis problemas NP-completo bsicos so:
1. 3-SATISFATIBILIDADE (3-SAT);
2. 3-Matching Dimensional (3-DM);
3. Cobertura de Vrtices (VC);
4. Clique;
5. Circuito Hamiltoniano(HC);
6. Partio
As redues obtidas:
1. SAT -> 3-SAT
2. 3-SAT -> 3-DM e 3-SAT -> VC
3. 3-DM -> Partio
4. VC -> HC e VC -> Clique
Algumas Redues
Teorema: 3-SAT NP-completo
Prova:
fcil de ver que 3-SAT pertence a NP, pois dada uma expresso
com clusulas de 3 literais cada, a verifcao de uma atribuio feita em
tempo polinomial.
Para transformar SAT em 3-SAT, seja U={u
1
,u
2
,...,u
n
} um conjunto
de variveis e C={c
1
,c
2
...,cm} um conjunto de clusulas construindo uma
instncia arbitrria de SAT.
Construiremos um conjunto C de clusulas com 3 literais sobre um
conjunto U de variveis, tal que C satisfaz se, e somente se, C conseguir
satisfazer.
Conjuntos Independentes
Cada literal de cada clusula representa um vrtice. Ligam-se os
vrtices referentes mesma clusula e ligam-se os vrtices que representam
Saiba Mais
O primeiro problema
NP-Completo foi o
problema SAT pela
prova apresentada por
Stephen Cook em 1971.
PROJETO E ANLISE DE ALGORITMOS 113
literais complementares.
Considerando uma expresso E com m clusulas, E satisfazvel se
e somente se G tem um conjunto independente de tamanho m.
Exemplo de Reduo:
A Classe NP-Difcil
Defnio: Um problema de deciso X NP-Difcil se
i) Y
p
t
X, para todo problema Y NP.
Conclui-se que um problema NP-Difcil pelo menos to difcil quanto
qualquer problema em NP.
Relaes entre Classes de Problemas
H basicamente quatro possibilidades de relacionamentos entre as
classes de problemas.
) ( ) ( ) ( ) (
5 4 3 5 3 2 4 2 1 3 2 1
x x x x x x x x x x x x
UNIDADE 4 114
A maioria dos pesquisadores considera a possibilidade (a) a mais
improvvel, ou seja, P = NP = co-NP.
Em (b), se NP fechado para complemento, ento NP=co-NP, mas
isso necessrio para o caso de no se ter P=NP. A regio em laranja
so os problemas P. Em (c), P=NP co-NP, mas NP no fechado para
complemento.
Por outro lado, boa parte dos pesquisadores considera a possibilidade
(d) como a mais provvel, onde NPco-NP e P NP co-NP. A regio em
bege representa os problemas P.
Backtracking e branch-and-bound
Backtracking
uma estratgia para sistematicamente determinar uma lista de
possveis solues, eliminando (explicitamente) a verifcao de uma boa
parte dos possveis candidatos. Pode ser considerado como uma variao de
busca em profundidade, pois utiliza uma rvore implcita.
O projeto com backtracking uma forma de construir algoritmos
para um problema difcil L. Esse algoritmo procura sistematicamente em um
grande (possivelmente exponencial) conjunto de possibilidades. A estratgia
de procura geralmente otimizada para evitar simetrias em instncias para
L e para percorrer o espao de busca de forma que seja encontrada uma
soluo fcil para L, se tal soluo existir.
A tcnica de backtracking tira a vantagem da estrutura inerente a
muitos problemas NP-completos. Lembre que a aceitao de uma instncia
x de um problema NP pode ser feita em polinomial, dado um certifcado de
tamanho polinomial. Frequentemente, esse certifcado consiste em uma srie
de escolhas tais como valores para variveis booleanas, um subconjunto de
vrtices de um grafo ou um conjunto de objetos para colocar em uma mochila.
De forma similar, a verifcao de um certifcado, frequentemente, envolve um
teste simples para verifcar se o certifcado fornece uma confgurao bem-
sucedida para x, tal como satisfazer uma frmula, cobrir todas as arestas de
um grafo ou estar de acordo com algum critrio de desempenho. Nesses casos
podemos usar um algoritmo de backtracking para procurar sistematicamente
pela soluo do problema, se esta soluo existir (GODRICH, TAMASSIA,
2004).
PROJETO E ANLISE DE ALGORITMOS 115
O algoritmo backtracking percorre os possveis caminhos de procura
para localizar solues ou pequenas sadas. A confgurao no fnal de um
caminho consiste em um par (x,y), onde x o subproblema que ainda deve ser
resolvido e y o conjunto de escolhas feitas para chegar a esse subproblema
a partir do problema original. Inicialmente, fornecemos ao algoritmo de
backtracking o par(x,0), onde x o problema original. Se o algoritmo descobrir
em algum momento que uma confgurao (x,y) no conduz a uma soluo
vlida, no importando quantas escolhas adicionais sejam feitas, ento ele
evita todas as procuras a partir dessa confgurao e retorna outra.
1. Algoritmo Backtrack(x):
2. Entrada: uma instncia x de um problema difcil
3. Sada: uma soluo para x ou sem soluo se nenhuma existir
4. F{(x,0)} {F o conjunto de fronteira de confguraes de
subproblemas}
5. enquanto F 0 faa
6. retire de F a confgurao (x,y) mais promissora
7. expanda (x,y) fazendo um pequeno conjunto de escolhas
adicionais
8. sejam (x
1
,y
1
),(x
2
,y
2
),...,(x
k
,y
k
) o conjunto de novas confguraes
9. para cada nova confgurao (x
i
,y
i
), faa:
10. verifque a consistncia de (x
i
,y
i
)
11. se a verifcao retornar soluo encontrada, ento:
12. retorne a soluo derivada de (x
i
,y
i
)
13. se a verifcao retornar sem sada, ento:
14. descarte a confgurao (x
i
,y
i
) {Backtrack}
15. seno
16. F F {(x
i
,y
i
)} {(x
i
,y
i
) inicia uma procura mais promissora}
17. retorne sem soluo
Resumindo, de uma maneira geral, a ideia para se resolver um
problema utilizando backtracking usando espao de soluo, onde as
solues so representadas por n-tuplas ou vetores de soluo <v
1
, v
2
, ...,
v
n
>, em que cada vi escolhido a partir de um conjunto fnito de opes Si.
Inicia-se com um vetor vazio, onde em cada etapa o vetor estendido
com um novo valor. O novo vetor , ento, avaliado, sendo que se no for
soluo parcial, o ltimo valor do vetor eliminado e outro candidato
UNIDADE 4 116
considerado.
As restries explcitas correspondem s regras que restringem cada
vi em tomar valores de um determinado conjunto. Est relacionado com a
representao do problema as escolhas possveis. J as restries implcitas
determinam como os vis se relacionam entre si.
Exemplos de Problemas:
Alguns exemplos de problemas onde se pode utilizar a tcnica de
backtracking.
Problema do Labirinto
Jogo da Troca de Bolas
O problema consiste em n bolas amarelas e n bolas azuis, com
tabuleiro (uma linha) com 2n + 1 posies, onde bolas com a mesma cor em
extremidades diferentes, e um espao vazio separando o conjunto de bolas
diferentes.
Os possveis movimentos so:
1. Bola azul para a esquerda e amarela para a direita;
2. Mover um espao se o espao est vazio;
3. Pular sobre exatamente uma bola de cor diferente, se o espao
logo aps a bola estiver vazio.
Alvo a atingir:
PROJETO E ANLISE DE ALGORITMOS 117
rvore com possibilidades e alvo:
Observa-se nesses problemas que:
1. Toma-se uma srie de decises entre vrias opes;
2. Cada deciso leva a um novo conjunto de decises;
3. Alguma(s) sequncia(s) de decises pode(m) conduzir a soluo
do problema;
4. Encontrar uma soluo consiste em:
1) Fazer uma lista com todos os candidatos possveis;
2) Examinar todas as respostas ou alguma delas;
3) Retornar a soluo.
Assim, se fossemos aplicar Fora bruta, na prtica, esta abordagem
no seria muito efciente, visto que a lista de candidatos grande.
Branch-and-bound
O algoritmo de backtracking efciente para problemas de deciso,
mas no foi planejado para problemas de otimizao, em que, alm de termos
UNIDADE 4 118
de satisfazer alguma condio de validade para um certifcado y, associado
a uma instncia x, tambm desejamos que uma dada funo f(x) seja
maximizada ou minimizada (sem perda da generalidade, vamos assumir que
a funo deve ser minimizada). Mesmo assim, podemos estender o algoritmo
backtracking para trabalhar com um problema de otimizao e, ao fazer isso,
obteremos o padro de algoritmos chamada de brach-and-bound.
O padro brach-and-bound dado pelo algoritmo seguinte tem todos
os elementos de backtracking, mas ele no termina simplesmente ao achar
a primeira soluo. Em vez disso, continuamos at a melhor soluo ser
encontrada. Alm disso, o algoritmo tem um mecanismo de pontuao para
escolher sempre a confgurao mais promissora a ser explorada em cada
iterao. Devido a essa abordagem, brach-and-bound chamado por vezes
de estratgia de busca best-frst (GODRICH, TAMASSIA, 2004).
1. Algoritmo Branch-and-Bound(x):
2. Entrada: uma instncia x de um problema difcil de otimizao
(minimizao)
3. Sada: uma soluo tima para x ou sem soluo se nenhuma
existir
4. F{(x,0)} { conjunto de fronteira de confguraes}
5. b{(+,0)} {custo e confgurao da melhor soluo conhecida}
6. enquanto F0, faa:
7. retire de F a confgurao (x,y) mais promissora
8. expanda (x,y) obtendo um conjunto (x
1
,y
1
),..., (x
k
,y
k
) de
confguraes adicionais
9. para cada nova confgurao (x
i
,y
i
), faa:
10. verifque a consistncia de (x
i
,y
i
)
11. se a verifcao retornar soluo encontrada, ento:
12. se o custo c da soluo para (x
i
,Y
i
) for melhor que b, ento:
13. b<- (c, (x
i
,y
i
))
14. seno,
15. descarte a confgurao (x
i
,y
i
)
16. se a verifcao retornar sem sada, ento:
17. descarte a confgurao (x
i
,y
i
) {Backtrack}
18. seno,
19. se min b(x
i
,y
i
) o menor custo de b, ento:
20. F F {(x
i
,y
i
)} {(x
i
,y
i
) inicia um novo caminho promissor}
PROJETO E ANLISE DE ALGORITMOS 119
21. seno,
22. descarte a confgurao (x
i
,y
i
) {o valor alto demais e j no
interessa}
23. retorne b
Para fornecer um critrio de otimizao e poder escolher a confgurao
mais promissora, adicionamos mais uma hiptese s trs hipteses usadas
para um algoritmo de backtracking:
Para qualquer confgurao (x,y), assumimos que temos uma funo
min b(xi, yi) que retorna um limite inferior para o custo de qualquer soluo
derivada desta confgurao.
A nica exigncia sobre min b(xi, yi) que ela seja menor ou igual
ao custo de qualquer soluo derivada. Como deve ser claro a partir do
algoritmo de branch-and-bound, quanto mais preciso for esse limite inferior,
mais efciente ser o algoritmo.
Exerccio 1
1. Julgue as seguintes assertivas com verdadeiro (V) ou falso (F), justifque
ou d contraexemplos:
( ) Existem problemas na classe NP que no esto na classe NP-completo.
( ) A classe NP-completo contm todos os problemas NP-difceis.
( ) Se houver uma soluo polinomial para o problema SAT, ento P = NP.
( ) NP-completo a classe dos problemas computacionais para os quais
no existe um algoritmo polinomial.
( ) Assim como os problemas P so problemas polinomiais, os NP so os
problemas no polinomiais.
( ) Se um problema A, de custo polinomial, redutvel polinomialmente a
outro B, ento B tambm ter custo polinomial.
( ) Se um problema A, NP-difcil, redutvel a outro B, ento B tambm
ser NP- difcil.
( ) Se um problema NP-difcil redutvel polinomialmente a outro NP,
ento eles so polinomialmente equivalentes. Neste caso, ambos so NP-
completo.
( ) Se dois problemas NP-difcil so polinomialmente equivalentes, ento
ambos so NP-completo ou ambos no o so.
( ) Se um problema NP-difcil reduz-se polinomialmente a um P, ento P =
UNIDADE 4 120
NP, e todos os problemas NP-completo faro parte do conjunto P tambm.
( ) As solues dos problemas NP so implementveis, havendo
vrias tcnicas para isso, como algoritmo exponencial, probabilstico e de
aproximao.
2. Mostrar que se NP um problema, ento uma resposta SIM ou NO
para pode ser obtida em tempo exponencial com o tamanho de sua
entrada.
3. Prove que a seguinte afrmativa verdadeira: Se o complemento de um
problema NP-Completo est em NP, ento NP = CoNP
4. Pesquise como o Problema do Ciclo Hamiltoniano pode ser reduzido ao
Problema de Deciso do Caixeiro Viajante.
5. Um array booleano M[1..n,1..n] representa um labirinto quadrado.
Estando em um determinado ponto do labirinto possvel se movimentar
para pontos adjacentes na mesma linha ou mesma coluna. Se M[i,j]
True, possvel passar pelo ponto (i,j); se M[i,j] False, no possvel
passar pelo ponto (i,j). possvel usar uma soluo por backtracking
que encontra um caminho, se existir, do ponto (1,1) para o ponto (n,n).
Abaixo encontramos um exemplo de um labirinto 5x5. Defna restries
implcitas e explcitas para a sua soluo de backtracking e monte a
rvore de espao de estados, indicando a soluo.
AZEREDO, Paulo A. Mtodos de classifcao de dados e anlise de suas
complexidades. Rio de Janeiro: Campus, 1996.
.
BALAKRISHNAN, J. & RANGANATHAN, K. A Textbook of Graph Theory.,
Ed. Springer-Verlag,1999.
BERG, M.; KREVELD, M. V.; OVERMARS, M.; SCHWARZKOPF, O.
Computational Geometry, Algorithms and Applications. 2nd edition,
Springer, 2000.
BOAVENTURA, P. O. Grafos: Teoria, Modelos, Algoritmos. Blucher: Ed.
Edgard, 1996.
BRASSARD, G., BRATLEY, P. Algorithmics: Theory and Practice. Prentice-
Hall.
CAMPELLO, R.E. & MACULAN, N. Algoritmos Heursticos: desenvolvimento
e avaliao de perfomance. Rio de Janeiro: Ed. EDUFF, 1994.
CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L.; STEIN, C. Algoritmos:
Teoria e Prtica, Ed. Campus. Rio de Janeiro, 2002.
DIESTEL, R. Graph Theory. Ed. Springer, 1997.
FUIRTADO, A. L. , Teoria dos Grafos: Algoritmos. Ed. LTC, 1973.
GAREY Michael R. and JOHNSON David S. Computers and Intractability -
A Guide to the Theory of NP-Completeness.
GERSTING, Judith L. Fundamentos matemticos para a Cincia da
computao. Rio de Janeiro, LTC, 1995.
GOODRICH, M. T. & TAMASSIA, R. , Projeto de Algoritmos: Fundamentos,
anlise e exemplos da internet, Ed. Bookman. Porto Alegre, 2004.
GOULD, R. , Graph Theory. The Benjamim/Cummings Publishing Company,
1988.
GRAHAM, Ronald L. Knuth, DONALD, E. Patashnik, Oren. Matemtica
concreta: fundamentos para a cincia da computao. Rio de Janeiro,
LTC, 1995.
KLEINBERG, J. Kleinberg, TARDOS, E. Algorithm Design. Addison Wesley,
2005.
KNUTH, D. E.; GRAHAM, L. R.; PATASHNIK, O. Concrete Mathematics - A
Foundation for Computer Science. Addison-Wesley, 1989.
LEVTIN, A. Introduction to the design and analysis of algorithms. Addison-
Wesley, 2003.
LEWIS, Harry R. and PAPADIMITRIOU, Christos H. Elementos de Teoria da
Computao.
MANBER, U. Introduction to Algorithms: a creative approach. Addison-
Wesley, 1988.
MIYAZAWA, F. K. Notas de Aula de Complexidade de Algoritmos. Relatrio
Tcnico, Unicamp, 1999.
RESENDE, P. J.; STOLFI, J. Fundamentos de geometria computacional.
IX Escola de Computao, 1994.
SZWARCFITER, J. L. Grafos e Algoritmos computacionais. Rio de Janeiro:
Campus, 1984.
______. Estruturas de Dados e seus Algoritmos. LTC Editora, 1994.
TERADA, R. Desenvolvimento de Algoritmos e Estrutura de Dados. So
Paulo: Makron Books, 1991.
TOSCANI, L.V. & VELOSO, P.A.S. Complexidade de Algoritmos. Porto
Alegre: Ed. Sagra Luzzatto, 2001.
WEST, D. Introduction to Graph Theory. Prentice Hall, 1996.
WILSON, R. J., Introduction to Graph Theory, Ed. AddisonWesley, 1996.
ZIVIANI, N. Projeto de Algoritmos com implementao em JAVA e C++.
So Paulo: Ed. Thomson, 2007.
______. Projeto de Algoritmos com implementao em PASCAL e C. So
Paulo: Ed. Thomson, 2005.
______. Projeto de Algoritmos com implementao em JAVA e C++. So
Paulo: Ed. Thomson. 2007.
WEB BIBLIOGRAFIA
Algorithms and Data Structures http://www.csse.monash.edu.au/~lloyd/
tildeAlgDS/
Algoritmos Animados em Java - http://gdias.artinova.pt/projecto/pt/menu_
applets.php
Algoritmos em grafos - http://www.ime.usp.br/~pf/algoritmos_em_grafos/
index.html
Algoritmos para grafos - http://www.ime.usp.br/~pf/algoritmos_para_grafos/
Anlise de algoritmos uma coletnea de textos - http://www.joinville.udesc.
br/portal/professores/gilmario/materiais/Analise_de_algoritmos__.pdf
Associao Brasileira de Educao a Distncia ABED - www.abed.org.br
Dictionary of Algorithms and Data Structures - http://www.itl.nist.gov/div897/
sqg/dads/
Graph Theory Tutorials - http://www.utm.edu/departments/math/graph/
Graphviz - http://www.graphviz.org/
Open Problems Graph Theory and Combinatorics, de Douglas West: - http://
www.math.uiuc.edu/~west/openp/
Projeto de Algoritmos - http://www.dcc.ufmg.br/algoritmos/
Secretaria de Educao a Distncia do MEC SEED - www.seed.mec.gov.br
Teoria dos Grafos - http://www.icmc.usp.br/manuals/sce183/grafos.html
Teoria dos Grafos - http://www.inf.ufsc.br/grafos/
Teoria dos Grafos, na Wikipdia: http://pt.wikipedia.org/wiki/Teoria_dos_
grafos
Uma Introduo Sucinta Teoria dos Grafos - http://www.ime.usp.br/~pf/
teoriadosgrafos/
Universidade Aberta do Brasil UAB - www.uab.gov.br
Universidade Aberta do Piau UAPI - www.ufpi.br/uapi
Francisco Jos de Arajo
CV. http://lattes.cnpq.br/9112511053307536
Possui graduao em Licenciatura Plena em Matemtica pela
Universidade Federal do Piau UFPI (1976) e Mestrado em Sistemas e
Computao pela Universidade Federal da Paraba (Campina Grande, 1980).
Foi Professor do Departamento de Informtica da Universidade Federal da
Paraba-Joo Pessoa (1979 a 1989) e do Departamento de Informtica e
Estatstica da Universidade Federal do Piau UFPI (1989 a 2004). Atualmente,
est aposentado pela Universidade Federal, mas continua exercendo
atividade docente no curso de Cincia da Computao do Centro de Ensino
Unifcado de Teresina - CEUT e sendo coordenador do Curso de Sistemas de
Informao da Faculdade das Atividades Empresariais de Teresina FAETE.
Jos Messias Alves da Silva
CV. http://lattes.cnpq.br/0683740460851435
Possui graduao em Licenciatura Plena em Matemtica pela
Universidade Estadual do Piau-UESPI (2001), Bacharelado em Cincia da
Computao pela Universidade Federal do Piau UFPI (2003). Especialista em
Matemtica e Estatstica e Especialista em Administrao e m Redes Linux
pela Universidade Federal de Lavras-MG (2005). Foi Professor substituto
do Departamento de Matemtica-DM e do Departamento de Informtica e
Estatstica DIE, da Universidade Federal do Piau - UFPI. Tem experincia
na rea de Cincia da Computao com nfase em Sistemas de Computao.
Seus principais interesses de pesquisa e atuao incluem Software Livre,
lgebra Computacional, Segurana e Criptografa, Anlise de Desempenho,
Processamento Paralelo, Sistemas Distribudos e Computao baseada em
Clusters e em Grades (Grid Computing).