Beruflich Dokumente
Kultur Dokumente
de Algoritmos
5
[
n
()
n
], onde
= (1 +
i1
k=1
2
k
=
= 2
i1
T(2) + 2
i
2 = 2
i1
+ 2
i
2 =
3n
2
2.
Logo, T(n) = 3n/2 2 para o melhor caso, o
pior caso e o caso mdio.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.4 25
Diviso e Conquista - Anlise do
Exemplo
Conforme o Teorema da pgina 10 do livro, o
algoritmo anterior timo.
Entretanto, ele pode ser pior do que os
apresentados no Captulo 1, pois, a cada
chamada do mtodo salva os valores de linf ,
lsup, maxMin[0] e maxMin[1], alm do
endereo de retorno dessa chamada.
Alm disso, uma comparao adicional
necessria a cada chamada recursiva para
vericar se lsup linf 1.
n deve ser menor do que a metade do maior
inteiro que pode ser representado pelo
compilador, para no provocar overow na
operao linf + lsup.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.4 26
Diviso e Conquista - Teorema Mestre
Teorema Mestre: Sejam a 1 e b > 1
constantes, f(n) uma funo
assintoticamente positiva e T(n) uma medida
de complexidade denida sobre os inteiros. A
soluo da equao de recorrncia:
T(n) = aT(n/b) + f(n),
para b uma potncia de n :
1. T(n) = (n
log
b
a
), se f(n) = O(n
log
b
a
)
para alguma constante > 0,
2. T(n) = (n
log
b
a
log n), se f(n) = (n
log
b
a
),
3. T(n) = (f(n)), se f(n) = (n
log
b
a+
) para
alguma constante > 0, e se
af(n/b) cf(n) para alguma constante
c < 1 e todo n a partir de um valor
sucientemente grande.
O problema dividido em a subproblemas de
tamanho n/b cada um sendo resolvidos
recursivamente em tempo T(n/b) cada.
A funo f(n) descreve o custo de dividir o
problema em subproblemas e de combinar os
resultados de cada subproblema.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.4 27
Diviso e Conquista - Teorema Mestre
A prova desse teorema no precisa ser
entendida para ele ser aplicado.
Em cada um dos trs casos a funo f(n)
comparada com a funo n
log
b
a
e a soluo
de T(n) determinada pela maior dessas
duas funes.
No caso 1, f(n) tem de ser
polinomialmente menor do que n
log
b
a
.
No caso 2, se as duas funes so iguais,
ento
T(n) = (n
log
b
a
log n) = (f(n) log n).
No caso 3, f(n) tem de ser
polinomialmente maior do que n
log
b
a
e,
alm disso, satisfazer a condio de que
af(n/b) cf(n).
Ele no pode ser aplicado nas aplicaes que
cam entre os casos 1 e 2 (quando f(n)
menor do que n
log
b
a
, mas no
polinomialmente menor), entre os casos 2 e 3
(quando f(n) maior do que n
log
b
a
, mas no
polinomialmente maior) ou quando a
condio af(n/b) cf(n) no satisfeita.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.4 28
Diviso e Conquista - Exemplo do Uso
do Teorema Mestre
Considere a equao de recorrncia:
T(n) = 4T(n/2) + n,
onde a = 4, b = 2, f(n) = n e
n
log
b
a
= n
log
2
4
= (n
2
).
O caso 1 se aplica porque
f(n) = O(n
log
b
a
) = O(n), onde = 1, e a
soluo T(n) = (n
2
).
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.5 29
Balanceamento
No projeto de algoritmos, importante
procurar sempre manter o balanceamento
na subdiviso de um problema em partes
menores.
Diviso e conquista no a nica tcnica em
que balanceamento til.
Vamos considerar um exemplo de ordenao
Seleciona o menor elemento do conjunto
v[0..n 1] e ento troca este elemento com o
primeiro elemento v[0].
Repete o processo com os n 1 elementos,
resultando no segundo maior elemento, o
qual trocado com o segundo elemento v[1].
Repetindo para n 2, n 3, . . ., 2 ordena a
seqncia.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.5 30
Balanceamento - Anlise do Exemplo
O algoritmo leva equao de recorrncia:
T(n) = T(n 1) + n 1, T(1) = 0, para o
nmero de comparaes entre elementos.
Substituindo:
T(n) = T(n 1) + n 1
T(n 1) = T(n 2) + n 2
.
.
.
.
.
.
T(2) = T(1) + 1
Adicionando lado a lado, obtemos:
T(n) = T(1) + 1 + 2 + + n 1 =
n(n1)
2
Logo, o algorimo O(n
2
).
Embora o algoritmo possa ser visto como
uma aplicao recursiva de diviso e
conquista, ele no eciente para valores
grandes de n.
Para obter ecincia assinttica necessrio
balanceamento: dividir em dois
subproblemas de tamanhos
aproximadamente iguais, ao invs de um de
tamanho 1 e o outro de tamanho n 1.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.5 31
Exemplo de Balanceamento -
Mergesort
Intercalao: unir dois arquivos ordenados
gerando um terceiro ordenado (merge).
Colocar no terceiro arquivo o menor elemento
entre os menores dos dois arquivos iniciais,
desconsiderando este mesmo elemento nos
passos posteriores.
Este processo deve ser repetido at que
todos os elementos dos arquivos de entrada
sejam escolhidos.
Algoritmo de ordenao (Mergesort):
dividir recursivamente o vetor a ser
ordenado em dois, at obter n vetores de 1
nico elemento.
Aplicar a intercalao tendo como entrada
2 vetores de um elemento, formando um
vetor ordenado de dois elementos.
Repetir este processo formando vetores
ordenados cada vez maiores at que todo
o vetor esteja ordenado.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.5 32
Exemplo de Balanceamento -
Implementao do Mergesort
package cap2;
public class Ordenacao {
public static void mergeSort ( int v[ ] , int i , int j ) {
i f ( i < j ) {
int m = ( i + j ) / 2;
mergeSort ( v, i , m) ; mergeSort ( v, m + 1 , j ) ;
merge ( v, i , m, j ) ; / / Intercala v[i..m] e v[m+1..j] em
v[i..j]
}
}
}
Considere n como sendo uma potncia de 2.
merge(v, i, m, j), recebe duas seqncias
ordenadas v[i..m] e v[m + 1..j] e produz uma
outra seqncia ordenada dos elementos de
v[i..m] e v[m + 1..j].
Como v[i..m] e v[m + 1..j] esto ordenados,
merge requer no mximo n 1 comparaes.
merge seleciona repetidamente o menor
dentre os menores elementos restantes em
v[i..m] e v[m + 1..j]. Caso empate, retira de
qualquer uma delas.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.5 33
Anlise do Mergesort
Na contagem de comparaes, o
comportamento do Mergesort pode ser
representado por:
T(n) = 2T(n/2) + n 1, T(1) = 0
No caso da equao acima temos:
T(n) = 2T(n/2) + n 1
2T(n/2) = 2
2
T(n/2
2
) + 2
n
2
2 1
.
.
.
.
.
.
2
i1
T(n/2
i1
) = 2
i
T(n/2
i
) + 2
i1
n
2
i1
2
i1
Adicionando lado a lado:
T(n) = 2
i
T(n/2
i
) +
i1
k=0
n
i1
k=0
2
k
= in
2
i1+1
1
2 1
= nlog n n + 1.
Logo, o algoritmo O(nlog n).
Para valores grandes de n, o balanceamento
levou a um resultado muito superior, samos
de O(n
2
) para O(nlog n).
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 34
Programao Dinmica
Quando a soma dos tamanhos dos
subproblemas O(n) ento provvel que o
algoritmo recursivo tenha complexidade
polinomial.
Quando a diviso de um problema de
tamanho n resulta em n subproblemas de
tamanho n 1 ento provvel que o
algoritmo recursivo tenha complexidade
exponencial.
Nesse caso, a tcnica de programao
dinmica pode levar a um algoritmo mais
eciente.
A programao dinmica calcula a soluo
para todos os subproblemas, partindo dos
subproblemas menores para os maiores,
armazenando os resultados em uma tabela.
A vantagem que uma vez que um
subproblema resolvido, a resposta
armazenada em uma tabela e nunca mais
recalculado.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 35
Programao Dinmica - Exemplo
Produto de n matrizes
M = M
1
M
2
M
n
, onde cada M
i
uma matriz com d
i1
linhas e d
i
colunas.
A ordem da multiplicao pode ter um efeito
enorme no nmero total de operaes de
adio e multiplicao necessrias para obter
M.
Considere o produto de uma matriz p q por
outra matriz q r cujo algoritmo requer
O(pqr) operaes.
Considere o produto M =
M
1
[10, 20] M
2
[20, 50] M
3
[50, 1] M
4
[1, 100],
onde as dimenses de cada matriz est
mostrada entre colchetes.
A avaliao de M na ordem
M = M
1
(M
2
(M
3
M
4
)) requer 125.000
operaes, enquanto na ordem
M = (M
1
(M
2
M
3
)) M
4
requer apenas
2.200.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 36
Programao Dinmica - Exemplo
Tentar todas as ordens possveis para
minimizar o nmero de operaes f(n)
exponencial em n, onde f(n) 2
n2
.
Usando programao dinmica possvel
obter um algoritmo O(n
3
).
Seja m
ij
menor custo para computar
M
i
M
i+1
M
j
, para 1 i j n.
Neste caso,
m
ij
=
0, se i = j,
Min
ik<j
(m
ik
+ m
k+1,j
+ d
i1
d
k
d
j
), se j > i.
m
ik
representa o custo mnimo para calcular
M
= M
i
M
i+1
M
k
m
k+1,j
representa o custo mnimo para
calcular M
= M
k+1
M
k+2
M
j
.
d
i1
d
k
d
j
representa o custo de multiplicar
M
[d
i1
, d
k
] por M
[d
k
, d
j
].
m
ij
, j > i representa o custo mnimo de
todos os valores possveis de k entre i e
j 1, da soma dos trs termos.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 37
Programao Dinmica - Exemplo
O enfoque programao dinmica calcula os
valores de m
ij
na ordem crescente das
diferenas nos subscritos.
O calculo inicia com m
ii
para todo i, depois
m
i,i+1
para todo i, depois m
i,i+2
, e assim
sucessivamente.
Desta forma, os valores m
ik
e m
k+1,j
estaro
disponveis no momento de calcular m
ij
.
Isto acontece porque j i tem que ser
estritamente maior do que ambos os valores
de k i e j (k + 1) se k estiver no intervalo
i k < j.
Programa para computar a ordem de
multiplicao de n matrizes,
M
1
M
2
M
n
, de forma a obter o
menor nmero possvel de operaes.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 38
Programao Dinmica -
Implementao
package cap2;
import java. i o . ;
public class AvaliaMultMatrizes {
public static void main( String [ ] args)throws IOException {
int n, maxn = Integer . parseInt ( args[ 0] ) ;
int d[ ] = new int [maxn + 1] ;
int m[ ] [ ] = new int [maxn] [maxn] ;
BufferedReader i n = new BufferedReader (
new InputStreamReader (System. i n ) ) ;
System. out . pri nt ( "Numero de matrizes n: " ) ;
n = Integer . parseInt ( i n . readLine( ) ) ;
System. out . pri nt l n ( "Dimensoes das matrizes: " ) ;
for ( int i = 0; i <= n; i ++) {
System. out . pri nt ( " d[ "+i +" ] = " ) ;
d[ i ] = Integer . parseInt ( i n . readLine( ) ) ;
}
/ / Continua na prxima transparncia...
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 39
Programao Dinmica - Continuao
da Implementao
for ( int i = 0; i < n; i ++) m[ i ] [ i ] = 0;
for ( int h = 1; h < n; h++) {
for ( int i = 1; i <= n h; i ++) {
int j = i + h;
m[ i 1][ j 1] = Integer .MAX_VALUE;
for ( int k = i ; k < j ; k++) {
int temp = m[ i 1][k1] +m[ k] [ j 1] +
+ d[ i 1] d[ k] d[ j ] ;
i f (temp < m[ i 1][ j 1]) m[ i 1][ j 1] = temp;
}
System. out . pri nt ( " m[ " +i +" ] [ "+j +" ]= " + m[ i 1][ j 1]);
}
System. out . pri nt l n ( ) ;
}
}
}
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 40
Programao Dinmica -
Implementao
A execuo do programa obtm o custo
mnimo para multiplicar as n matrizes,
assumindo que so necessrias pqr
operaes para multiplicar uma matriz p q
por outra matriz q r.
A execuo do programa para as quatro
matrizes onde d
0
, d
1
, d
2
, d
3
, d
4
so 10, 20, 50,
1, 100, resulta:
m
11
= 0 m
22
= 0 m
33
= 0 m
44
= 0
m
12
= 10.000 m
23
= 1.000 m
34
= 5.000
m
13
= 1.200 m
24
= 3.000
m
14
= 2.200
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 41
Programao Dinmica - Princpio da
Otimalidade
A ordem de multiplicao pode ser obtida
registrando o valor de k para cada entrada da
tabela que resultou no mnimo.
Essa soluo eciente est baseada no
princpio da otimalidade:
em uma seqncia tima de escolhas ou
de decises cada subseqncia deve
tambm ser tima.
Cada subseqncia representa o custo
mnimo, assim como m
ij
, j > i.
Assim, todos os valores da tabela
representam escolhas timas.
O princpio da otimalidade no pode ser
aplicado indiscriminadamente.
Quando o princpio no se aplica provvel
que no se possa resolver o problema com
sucesso por meio de programao dinmica.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 42
Aplicao do Princpio da Otimalidade
Por exemplo, quando o problema utiliza
recursos limitados, quando o total de recursos
usados nas subinstncias maior do que os
recursos disponveis.
Se o caminho mais curto entre Belo Horizonte
e Curitiba passa por Campinas:
o caminho entre Belo Horizonte e
Campinas tambm o mais curto possvel
assim como o caminho entre Campinas e
Curitiba.
Logo, o princpio da otimalidade se aplica.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 43
No Aplicao do Princpio da
Otimalidade
No problema de encontrar o caminho mais
longo entre duas cidades:
Um caminho simples nunca visita uma
mesma cidade duas vezes.
Se o caminho mais longo entre Belo
Horizonte e Curitiba passa por Campinas,
isso no signica que o caminho possa ser
obtido tomando o caminho simples mais
longo entre Belo Horizonte e Campinas e
depois o caminho simples mais longo
entre Campinas e Curitiba.
Quando os dois caminhos simples so
ajuntados pouco provvel que o caminho
resultante tambm seja simples.
Logo, o princpio da otimalidade no se
aplica.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.7 44
Algoritmos Gulosos
Resolve problemas de otimizao.
Exemplo: algoritmo para encontrar o caminho
mais curto entre dois vrtices de um grafo.
Escolhe a aresta que parece mais
promissora em qualquer instante;
Independente do que possa acontecer
mais tarde, nunca reconsidera a deciso.
No necessita avaliar alternativas, ou usar
procedimentos sosticados para desfazer
decises tomadas previamente.
Problema geral: dado um conjunto C,
determine um subconjunto S C tal que:
S satisfaz uma dada propriedade P, e
S mnimo (ou mximo) em relao a
algum critrio .
O algoritmo guloso para resolver o problema
geral consiste em um processo iterativo em
que S construdo adicionando-se ao mesmo
elementos de C um a um.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.7 45
Caractersticas dos Algoritmos
Gulosos
Para construir a soluo tima existe um
conjunto ou lista de candidatos.
So acumulados um conjunto de candidatos
considerados e escolhidos, e o outro de
candidatos considerados e rejeitados.
Existe funo que verica se um conjunto
particular de candidatos produz uma soluo
(sem considerar otimalidade no momento).
Outra funo verica se um conjunto de
candidatos vivel (tambm sem preocupar
com a otimalidade).
Uma funo de seleo indica a qualquer
momento quais dos candidatos restantes o
mais promissor.
Uma funo objetivo fornece o valor da
soluo encontrada, como o comprimento do
caminho construdo (no aparece de forma
explicita no algoritmo guloso).
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.7 46
Pseudo Cdigo de Algoritmo Guloso
Conjunto guloso ( Conjunto C) { / C: conjunto de candidatos /
S = ; / S contm conjunto soluo /
while ( (C ,= ) && not soluo(S) ) {
x = seleciona (C) ;
C = C x;
i f ( vivel (S + x) ) S = S + x;
}
i f ( soluo (S) )
return S else return ( "No existe soluo" ) ;
}
Inicialmente, o conjunto S de candidatos
escolhidos est vazio.
A cada passo, o melhor candidato restante
ainda no tentado considerado. O critrio
de escolha ditado pela funo de seleo.
Se o conjunto aumentado de candidatos se
torna invivel, o candidato rejeitado. Seno,
o candidato adicionado ao conjunto S de
candidatos escolhidos.
A cada aumento de S vericamos se S
constitui uma soluo tima.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.7 47
Caractersticas da Implementao de
Algoritmos Gulosos
Quando funciona corretamente, a primeira
soluo encontrada sempre tima.
A funo de seleo geralmente
relacionada com a funo objetivo.
Se o objetivo :
maximizar provavelmente escolher o
candidato restante que proporcione o
maior ganho individual.
minimizar ento ser escolhido o
candidato restante de menor custo.
O algoritmo nunca muda de idia:
Uma vez que um candidato escolhido e
adicionado soluo ele l permanece
para sempre.
Uma vez que um candidato excludo do
conjunto soluo, ele nunca mais
reconsiderado.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.8 48
Algoritmos Aproximados
Problemas que somente possuem algoritmos
exponenciais para resolv-los so
considerados difceis.
Problemas considerados intratveis ou
difceis so muito comuns.
Exemplo: problema do caixeiro viajante
cuja complexidade de tempo O(n!).
Diante de um problema difcil comum
remover a exigncia de que o algoritmo tenha
sempre que obter a soluo tima.
Neste caso procuramos por algoritmos
ecientes que no garantem obter a soluo
tima, mas uma que seja a mais prxima
possvel da soluo tima.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.8 49
Tipos de Algoritmos Aproximados
Heurstica: um algoritmo que pode produzir
um bom resultado, ou at mesmo obter a
soluo tima, mas pode tambm no
produzir soluo alguma ou uma soluo que
est distante da soluo tima.
Algoritmo aproximado: um algoritmo que
gera solues aproximadas dentro de um
limite para a razo entre a soluo tima e a
produzida pelo algoritmo aproximado
(comportamento monitorado sob o ponto de
vista da qualidade dos resultados).