Escolar Documentos
Profissional Documentos
Cultura Documentos
Projeto e Analise de Algoritmos - Nivio Ziviani PDF
Projeto e Analise de Algoritmos - Nivio Ziviani PDF
Estruturas de dados
Programas
Programar basicamente estruturar dados e
construir algoritmos.
Programas so formulaes concretas de
algoritmos abstratos, baseados em
representaes e estruturas especficas de
dados.
Programas representam uma classe especial
de algoritmos capazes de serem seguidos por
computadores.
Um computador s capaz de seguir
programas em linguagem de mquina
(seqncia de instrues obscuras e
desconfortveis).
necessrio construir linguagens mais
adequadas, que facilitem a tarefa de
programar um computador.
Uma linguagem de programao uma
tcnica de notao para programar, com a
inteno de servir de veculo tanto para a
expresso do raciocnio algortmico quanto
para a execuo automtica de um algoritmo
por um computador.
Projeto de Algoritmos Cap.1 Introduo Seo 1.2 5
Tipos de Dados
Implementao de TADs
Considere uma aplicao que utilize uma lista
de inteiros. Poderamos definir TAD Lista,
com as seguintes operaes:
1. faa a lista vazia;
2. obtenha o primeiro elemento da lista; se a lista
estiver vazia, ento retorne nulo;
3. insira um elemento na lista.
Custo de um Algoritmo
Funo de Complexidade
package cap1;
public class Max {
public static int max ( int v [ ] , int n) {
int max = v [ 0 ] ;
for ( int i = 1; i < n ; i ++)
i f (max < v [ i ] ) max = v [ i ] ;
return max;
}
}
Neste caso
n(n+1)
f (n) = n1 (1+2+3+ +n) = 1
n 2
= n+1
2
package cap1;
public class MaxMin1 {
public static int [ ] maxMin1 ( int v [ ] , int n) {
int max = v [ 0 ] , min = v [ 0 ] ;
for ( int i = 1; i < n ; i ++) {
i f ( v [ i ] > max) max = v [ i ] ;
i f ( v [ i ] < min) min = v [ i ] ;
}
int maxMin[ ] = new int [ 2 ] ;
maxMin[0] = max; maxMin[1] = min;
return maxMin;
}
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 21
package cap1;
public class MaxMin2 {
public static int [ ] maxMin2 ( int v [ ] , int n) {
int max = v [ 0 ] , min = v [ 0 ] ;
for ( int i = 1; i < n ; i ++) {
i f ( v [ i ] > max) max = v [ i ] ;
else i f ( v [ i ] < min) min = v [ i ] ;
}
int maxMin[ ] = new int [ 2 ] ;
maxMin[0] = max; maxMin[1] = min;
return maxMin;
}
}
d d d d
Contm o mximo
d d d d
Contm o mnimo
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 24
package cap1;
public class MaxMin3 {
public static int [ ] maxMin3 ( int v [ ] , int n) {
int max, min, FimDoAnel;
i f ( (n % 2) > 0) { v [n] = v [n1]; FimDoAnel = n ; }
else FimDoAnel = n1;
i f ( v[0] > v [ 1 ] ) { max = v [ 0 ] ; min = v [ 1 ] ; }
else { max = v [ 1 ] ; min = v [ 0 ] ; }
int i = 2;
while ( i < FimDoAnel) {
i f ( v [ i ] > v [ i +1]) {
i f ( v [ i ] > max) max = v [ i ] ;
i f ( v [ i +1] < min) min = v [ i +1];
}
else {
i f ( v [ i ] < min) min = v [ i ] ;
i f ( v [ i +1] > max) max = v [ i +1];
}
i = i + 2;
}
int maxMin[ ] = new int [ 2 ] ;
maxMin[0] = max; maxMin[1] = min;
return maxMin;
}
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.3 25
Os trs f (n)
algoritmos Melhor caso Pior caso Caso mdio
comparaes. 2
Comportamento Assinttico de
Funes
Dominao assinttica
A anlise de um algoritmo geralmente conta
com apenas algumas operaes elementares.
A medida de custo ou medida de
complexidade relata o crescimento assinttico
da operao considerada.
Definio: Uma funo f (n) domina
assintoticamente outra funo g(n) se
existem duas constantes positivas c e m tais
que, para n m, temos |g(n)| c |f (n)|.
f,g
c f (n)
g(n)
n
m
Exemplo:
Sejam g(n) = (n + 1)2 e f (n) = n2 .
As funes g(n) e f (n) dominam
assintoticamente uma a outra, desde que
|(n + 1)2 | 4|n2 | para n 1 e |n2 | |(n + 1)2 |
para n 0.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 33
Notao O
Escrevemos g(n) = O(f (n)) para expressar
que f (n) domina assintoticamente g(n). L-se
g(n) da ordem no mximo f (n).
Exemplo: quando dizemos que o tempo de
execuo T (n) de um programa O(n2 ),
significa que existem constantes c e m tais
que, para valores de n m, T (n) cn2 .
Exemplo grfico de dominao assinttica
que ilustra a notao O.
f,g
c f (n)
g(n)
n
m
O valor da constante m mostrado o menor
valor possvel, mas qualquer valor maior
tambm vlido.
Definio: Uma funo g(n) O(f (n)) se
existem duas constantes positivas c e m tais
que g(n) cf (n), para todo n m.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.1 34
Exemplos de Notao O
Exemplos de Notao O
Notao
Especifica um limite inferior para g(n).
Definio: Uma funo g(n) (f (n)) se
existirem duas constantes c e m tais que
g(n) cf (n), para todo n m.
Exemplo: Para mostrar que g(n) = 3n3 + 2n2
(n3 ) basta fazer c = 1, e ento
3n3 + 2n2 n3 para n 0.
Exemplo: Seja g(n) = n para n mpar (n 1)
e g(n) = n2 /10 para n par (n 0).
Neste caso g(n) (n2 ), bastando
considerar c = 1/10 e n = 0, 2, 4, 6, . . .
Exemplo grfico para a notao
f,g
g(n)
c f (n)
n
m
Notao
g(n)
c1 f ( n )
n
m
Exemplo de Notao
Notao o
Notao
Classes de Comportamento
Assinttico
Se f uma funo de complexidade para
um algoritmo F , ento O(f ) considerada a
complexidade assinttica ou o
comportamento assinttico do algoritmo F .
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 os algoritmos.
Por exemplo, considere dois algoritmos F e G
aplicados mesma classe de problemas,
sendo que F leva trs vezes o tempo de G ao
serem executados, isto , f (n) = 3g(n), sendo
que O(f (n)) = O(g(n)).
Logo, o comportamento assinttico no serve
para comparar os algoritmos F e G, porque
eles diferem apenas por uma constante.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 43
Comparao de Programas
f (n) = O(n).
Um algoritmo de complexidade O(n) dito
de complexidade linear.
Em geral, um pequeno trabalho
realizado sobre cada elemento de entrada.
a melhor situao possvel para um
algoritmo que tem de processar/produzir n
elementos de entrada/sada.
Cada vez que n dobra de tamanho, o
tempo de execuo tambm dobra.
Comparao de Funes de
Complexidade
Funo Tamanho n
de custo 10 20 30 40 50 60
Algoritmos Polinomiais
Algoritmo exponencial no tempo de
execuo tem funo de complexidade
O(cn ), c > 1.
Algoritmo polinomial no tempo de execuo
tem funo de complexidade O(p(n)), onde
p(n) um polinmio.
A distino entre estes dois tipos de
algoritmos torna-se significativa quando o
tamanho do problema a ser resolvido cresce.
Por isso, os algoritmos polinomiais so muito
mais teis na prtica do que os exponenciais.
Algoritmos exponenciais so geralmente
simples variaes de pesquisa exaustiva.
Algoritmos polinomiais so geralmente
obtidos mediante entendimento mais
profundo da estrutura do problema.
Um problema considerado:
intratvel: se no existe um algoritmo
polinomial para resolv-lo.
bem resolvido: quando existe um
algoritmo polinomial para resolv-lo.
Projeto de Algoritmos Cap.1 Introduo Seo 1.3.2 50
9 4 8
5 c3 3
c2 c4
8
Procedimento no Recursivo
Algoritmo para ordenar os n elementos de um
conjunto A em ordem ascendente.
package cap1;
public class Ordenacao {
public static void ordena ( int v [ ] , int n) {
(1) for ( int i = 0; i < n 1; i ++) {
(2) int min = i ;
(3) for ( int j = i + 1; j < n ; j ++)
(4) i f ( v [ j ] < v [min] )
(5) min = j ;
/ Troca v[min] e v[i] /
(6) int x = v [min ] ;
(7) v [min] = v [ i ] ;
(8) v[ i ] = x;
}
}
}
Anlise do Procedimento no
Recursivo
Anel Interno
Anlise do Procedimento no
Recursivo
Anel Externo
Procedimento Recursivo
void pesquisa(n) {
(1) i f (n <= 1)
(2) inspecione elemento e termine
else {
(3) para cada um dos n elementos inspecione elemento ;
(4) pesquisa(n/ 3 ) ;
}
}
T (n) = n + T (n/3)
T (n/3) = n/3 + T (n/3/3)
T (n/3/3) = n/3/3 + T (n/3/3/3)
.. ..
. .
T (n/3/3 /3) = n/3/3 /3 + T (n/3 /3)
Principais Componentes de um
Programa Java
Principais Componentes de um
Programa Java
O conceito de classe nasceu da necessidade
de se criar diversos objetos de um mesmo
tipo.
Dizemos que um objeto pertence a uma
classe ou, mais comumente, que uma
instncia
package cap1;
class PainelDeControle {
private float temperaturaCorrente ;
private float temperaturaDesejada;
Principais Componentes de um
Programa Java
Herana e Polimorfismo
Herana e Polimorfismo
package cap1;
class Empregado {
protected float salario ;
public float salarioMensal ( ) { return salario ; }
public void imprime ( ) { System. out . println ( "Empregado" ) ; }
}
class Secretaria extends Empregado {
private int velocidadeDeDigitacao ;
public void imprime ( ) { System. out . println ( "Secretaria" ) ; }
}
class Gerente extends Empregado {
private float bonus;
public float salarioMensal ( ) { return salario + bonus; }
public void imprime ( ) { System. out . println ( "Gerente" ) ; }
}
public class Polimorfismo {
public static void main ( String [ ] args ) {
Empregado empregado = new Empregado ( ) ;
Empregado secretaria = new Secretaria ( ) ;
Empregado gerente = new Gerente ( ) ;
empregado.imprime ( ) ; secretaria .imprime ( ) ;
gerente .imprime ( ) ;
}
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 69
Sobrecarga
Sobrescrita
Programa Principal
package cap1;
class ContaBancaria {
private double saldo ;
public ContaBancaria (double saldoInicial ) {
saldo = saldoInicial ;
}
public void deposito (double valor ) {
saldo = saldo + valor ;
}
public void saque (double valor ) {
saldo = saldo valor ;
}
public void imprime ( ) {
System. out . println ( "saldo=" + saldo ) ;
}
}
public class AplicacaoBancaria {
public static void main ( String [ ] args ) {
ContaBancaria conta1 = new ContaBancaria (200.00);
System. out . print ( "Antes da movimentacao, " ) ;
conta1.imprime ( ) ;
conta1. deposito (50.00); conta1.saque (70.00);
System. out . print ( "Depois da movimentacao, " ) ;
conta1.imprime ( ) ;
}
}
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 74
Programa Principal
Modificadores de Acesso
Modificadores de acesso: determinam
quais outros mtodos podem acessar um
campo de dados ou um mtodo.
Um campo de dados ou um mtodo que seja
precedido pelo modificador private pode ser
acessado somente por mtodos que fazem
parte da mesma classe.
Um campo de dados ou um mtodo que seja
precedido pelo modificador public pode ser
acessado por mtodos de outras classes.
Classe modificada com o modificador
public indica que a classe visvel
externamente ao pacote em que ela foi
definida (classe AplicacaoBancaria,
package cap1).
Em cada arquivo de um programa Java s
pode existir uma classe modificada por
public, e o nome do arquivo deve ser o
mesmo dado classe.
Os campos de dados de uma classe so
geralmente feitos private e os mtodos so
tornados public.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 76
Modificadores de Acesso
Modificadores de Acesso
package cap1;
class A {
public static int total ;
public int media;
}
public class B {
public static void main ( String [ ] args ) {
A a = new A( ) ; a. total = 5; a.media = 5;
A b = new A( ) ; b. total = 7; b.media = 7;
}
}
Interfaces
Uma interface em Java uma classe
abstrata que no pode ser instanciada, cujos
os mtodos devem ser public e somente suas
assinaturas so definidas
Uma interface sempre implementada por
outras classes.
Utilizada para prover a especificao de um
comportamento que seja comum a um
conjunto de objetos.
package cap1;
import java . io . ;
public class Max {
public static Item max ( Item v [ ] , int n) {
Item max = v [ 0 ] ;
for ( int i = 1; i < n ; i ++)
i f (max.compara ( v [ i ] ) < 0 ) max = v [ i ] ;
return max;
}
}
Interfaces
Para permitir a generalizao do tipo de
dados da chave necessrio criar a interface
Item que apresenta a assinatura do mtodo
abstrato compara.
package cap1;
public interface Item {
public int compara ( Item i t ) ;
}
package cap1;
import java . io . ;
public class MeuItem implements Item {
public int chave;
/ / outros componentes do registro
Interfaces
package cap1;
public class EncontraMax {
public static void main ( String [ ] args ) {
MeuItem v [ ] = new MeuItem[ 2 ] ;
v[0] = new MeuItem ( 3 ) ; v[1] = new MeuItem (10);
MeuItem max = (MeuItem) Max.max ( v , 2 ) ;
System. out . println ( "Maior chave : " + max.chave) ;
}
}
Pacotes
A linguagem Java permite agrupar as classes
e as interfaces em pacotes(do ingls,
package.
Convenientes para organizar e separar as
classes de um conjunto de programas de
outras bibliotecas de classes, evitando
colises entre nomes de classes
desenvolvidas por uma equipe composta por
muitos programadores.
Deve ser realizada sempre na primeira linha
do arquivo fonte, da seguinte forma por
exemplo:
package cap1;
possvel definir subpacotes separados por
".", por exemplo, para definir o subpacote
arranjo do pacote cap3 fazemos:
package cap3.arranjo;
A utilizao de uma classe definida em outro
pacote realizada atravs da palavra chave
import. O comando abaixo possibilita a
utilizao de todas as classes de um pacote:
import cap3.arranjo.*;
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 82
Pacotes
Classes Internas
Java permite realizar aninhamento de classes
como abaixo:
package cap1;
public class Lista {
/ / Cdigo da classe Lista
private class Celula {
/ / Cdigo da classe Celula
}
}
O Objeto this
package cap1;
public class Conta {
private double saldo ;
public void alteraSaldo (double saldo ) {
this . saldo = saldo ;
}
}
Excees
As excees so erros ou anomalias que
podem ocorrer durante a execuo de um
programa.
Deve ser obrigatoriamente representada por
um objeto de uma subclasse da classe
Throwable, que possui duas subclasses
diretas: (i) Exception e (ii) Error
Uma abordagem simples para tratar uma
exceo exibir uma mensagem relatando o
erro ocorrido e retornar para quem chamou
ou finalizar o programa, como no exemplo
abaixo:
Excees
Excees
Sada de Dados
Entrada de Dados
Todo programa em Java que tenha leitura de
dados tem de incluir o comando no incio do
programa
import java.io.*;
Mtodo para ler do teclado uma cadeia de
caracteres terminada com a tecla Enter:
public static String getString () throws
IOException {
InputStreamReader inputString = new
InputStreamReader (System.in);
BufferedReader buffer = new BufferedReader
(inputString);
String s = buffer.readLine (); return s;
}
Mtodo para realizar a entrada de um
caractere a partir do teclado:
public static char getChar () throws IOException {
String s = getString ();
return s.charAt (0);
}
Se o que est sendo lido de outro tipo,
ento necessrio realizar uma converso.
Projeto de Algoritmos Cap.1 Introduo Seo 1.5 90
induo,
recursividade,
diviso e conquista,
balanceamento,
programao dinmica,
algoritmos gulosos,
algoritmos aproximados.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.1 2
Induo Matemtica
til para provar asseres sobre a correo
e a eficincia de algoritmos.
Consiste em inferir uma lei geral a partir de
instncias particulares.
Seja T um teorema que que tenha como
parmetro um nmero natural n. Para provar
que T vlido para todos os valores de n,
basta provarmos que:
1. T vlido para n = 1;
2. Para todo n > 1, se T vlido para n 1,
ento T vlido para n.
A condio 1 chamada de passo base.
Provar a condio 2 geralmente mais fcil
que provar o teorema diretamente, uma vez
que podemos usar a assero de que T
vlido para n 1.
Esta afirmativa chamada de hiptese de
induo ou passo indutivo
As condies 1 e 2 implicam T vlido para
n = 2, o que junto com a condio 2 implica T
tambm vlido para n = 3, e assim por diante.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.1 3
Recursividade
Um mtodo que chama a si mesmo, direta ou
indiretamente, dito recursivo.
Recursividade permite descrever algoritmos
de forma mais clara e concisa, especialmente
problemas recursivos por natureza ou que
utilizam estruturas recursivas.
Ex.: rvore binria de pesquisa:
Todos os registros com chaves menores
esto na subrvore esquerda;
Todos os registros com chaves maiores
esto na subrvore direita.
5
3 7
2 4 6
package cap2;
public class ArvoreBinaria {
private static class No {
Object reg ;
No esq, dir ;
}
private No raiz ;
}
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2 9
Recursividade
No caminhamento central, os ns so
visitados em ordem lexicogrfica das chaves.
Implementao de Recursividade
Problema de Terminao em
Procedimentos Recursivos
Problema de Terminao em
Procedimentos Recursivos
package cap2;
public class Fibonacci {
public static int fibRec ( int n) {
i f (n < 2) return n;
else return ( fibRec ( n1) + fibRec ( n2));
}
}
package cap2;
public class Fibonacci {
public static int f i b I t e r ( int n) {
int i = 1 , f = 0;
for ( int k = 1; k <= n ; k++) {
f = i + f;
i = f i;
}
return f ;
}
}
void tenta ( ) {
inicializa seleo de movimentos ;
do {
seleciona prximo candidato ao movimento ;
i f ( aceitvel ) {
registra movimento ;
i f ( tabuleiro no est cheio ) {
tenta novo movimento ; / / Chamada recursiva
para tenta
i f ( no sucedido ) apaga registro anterior ;
}
}
} while ( movimento no sucedido e no acabaram can-
didatos a movimento ) ;
}
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.3 18
4 1
5 8
6 7
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.3 19
package cap2;
public class PasseioCavalo {
private int n ; / / Tamanho do lado do tabuleiro
private int a [ ] , b [ ] , t [ ] [ ] ;
Diviso e Conquista
Diviso e Conquista
package cap2;
public class MaxMin4 {
public static int [ ] maxMin4( int v [ ] , int l i n f , int lsup ) {
int maxMin[ ] = new int [ 2 ] ;
i f ( lsup l i n f <= 1) {
i f ( v [ l i n f ] < v [ lsup ] ) {
maxMin[0] = v [ lsup ] ; maxMin[1] = v [ l i n f ] ;
}
else {
maxMin[0] = v [ l i n f ] ; maxMin[1] = v [ lsup ] ;
}
}
else {
int meio = ( l i n f + lsup ) / 2 ;
maxMin = maxMin4 ( v , l i n f , meio) ;
int max1 = maxMin[ 0 ] , min1 = maxMin[ 1 ] ;
maxMin = maxMin4 ( v , meio + 1 , lsup ) ;
int max2 = maxMin[ 0 ] , min2 = maxMin[ 1 ] ;
i f (max1 > max2) maxMin[0] = max1;
else maxMin[0] = max2;
i f (min1 < min2) maxMin[1] = min1;
else maxMin[1] = min2;
}
return maxMin;
}
}
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.4 24
T (n) = 1, para n 2,
T (n) = T (bn/2c) + T (dn/2e) + 2, para n > 2.
T (n) = 2T (n/2) + 2
2T (n/2) = 4T (n/4) + 2 2
4T (n/4) = 8T (n/8) + 2 2 2
.. ..
. .
2i2 T (n/2i2 ) = 2i1 T (n/2i1 ) + 2i1
T (n) = 4T (n/2) + n,
onde a = 4, b = 2, f (n) = n e
nlogb a = nlog2 4 = (n2 ).
Balanceamento
T (n) = T (n 1) + n 1
T (n 1) = T (n 2) + n 2
.. ..
. .
T (2) = T (1) + 1
Exemplo de Balanceamento -
Mergesort
Exemplo de Balanceamento -
Implementao do Mergesort
package cap2;
public class Ordenacao {
public static void mergeSort ( int v [ ] , int i , int j ) {
if ( 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]
}
}
}
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
n
2T (n/2) = 22 T (n/22 ) + 2 2 1
2
.. ..
. .
i1 i1 i i i1 n i1
2 T (n/2 ) = 2 T (n/2 ) + 2 2
2i1
Adicionando lado a lado:
i1 i1
T (n) = 2i T (n/2i ) + 2k
X X
n
k=0 k=0
2i1+1 1
= in
21
= n log n n + 1.
Programao Dinmica
Produto de n matrizes
M = M1 M2 Mn , onde cada Mi
uma matriz com di1 linhas e di colunas.
Considere o produto M =
M1 [10, 20] M2 [20, 50] M3 [50, 1] M4 [1, 100],
onde as dimenses de cada matriz est
mostrada entre colchetes.
A avaliao de M na ordem
M = M1 (M2 (M3 M4 )) requer 125.000
operaes, enquanto na ordem
M = (M1 (M2 M3 )) M4 requer apenas
2.200.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 36
Programao Dinmica -
Implementao
package cap2;
import java . io . ;
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 in = new BufferedReader (
new InputStreamReader (System. in ) ) ;
System. out . print ( "Numero de matrizes n: " ) ;
n = Integer . parseInt ( in . readLine ( ) ) ;
System. out . println ( "Dimensoes das matrizes : " ) ;
for ( int i = 0; i <= n ; i ++) {
System. out . print ( " d[ "+i+" ] = " ) ;
d[ i ] = Integer . parseInt ( in . readLine ( ) ) ;
}
/ / Continua na prxima transparncia...
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.6 39
Programao Dinmica -
Implementao
No Aplicao do Princpio da
Otimalidade
Algoritmos Gulosos
Caractersticas da Implementao de
Algoritmos Gulosos
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.
Algoritmos Aproximados
Listas Lineares
Desvantagens:
custo para inserir ou retirar itens da lista,
que pode causar um deslocamento de
todos os itens, no pior caso;
em aplicaes em que no existe previso
sobre o crescimento da lista, a utilizao
de arranjos exigir a realocao de
memria.
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2 10
Vantagens:
Permite inserir ou retirar itens do meio da
lista a um custo constante (importante
quando a lista tem de ser mantida em
ordem).
Bom para aplicaes em que no existe
previso sobre o crescimento da lista (o
tamanho mximo da lista no precisa ser
definido a priori).
void Vestibular {
ordena os registros pelo campo notaFinal ;
for ( nota = 10; nota >= 0; nota)
while ( houver registro com mesma nota)
i f ( existe vaga em um dos cursos
de opo do candidato)
insere registro no conjunto de aprovados
else insere registro no conjunto de reprovados;
imprime aprovados por curso ;
imprime reprovados;
}
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2 17
7
8 ...
9 Registro nil
10 Registro Registro nil
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2 18
void Vestibular {
l nmero de vagas para cada curso;
inicializa listas de classificao, de aprovados e de reprovados;
l registro; // vide formato do registro na transparncia 15
while (chave 6= 0) {
insere registro nas listas de classificao, conforme notaFinal;
l registro;
}
for (nota = 10; nota >= 0; nota)
while (houver prximo registro com mesma notaFinal) {
retira registro da lista;
if (existe vaga em um dos cursos de opo do candidato) {
insere registro na lista de aprovados;
decrementa o nmero de vagas para aquele curso;
}
else insere registro na lista de reprovados;
obtm prximo registro;
}
imprime aprovados por curso;
imprime reprovados;
}
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2 20
package cap3;
import java . io . ;
import cap3. autoreferencia . Lista ; / / vide programa da trans-
parncia 11
public class Vestibular {
private class Definicoes {
public static final int nOpcoes = 3;
public static final int nCursos = 7;
}
private static class Registro {
short chave ; byte notaFinal ;
byte opcao[ ] = new byte[ Definicoes .nOpcoes] ;
public String toString ( ) {
return new String ( " " + this .chave ) ; }
}
private static BufferedReader in =
new BufferedReader(new InputStreamReader(System. in ) ) ;
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2 21
Pilha
TAD Pilhas
Conjunto de operaes:
1. Cria uma pilha Vazia.
2. Verifica se a lista est vazia. Retorna true
se a pilha est vazia; caso contrrio,
retorna false.
3. Empilhar o item x no topo da pilha.
4. Desempilhar o item x no topo da pilha,
retirando-o da pilha.
5. Verificar o tamanho atual da pilha.
nil
6
x1
6
..
.
6
xn1
topo - xn
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2 31
ET - Implementao
Este programa utiliza um tipo abstrato de
dados sem conhecer detalhes de sua
implementao.
A implementao do TAD Pilha que utiliza
arranjo pode ser substituda pela
implementao que utiliza estruturas
auto-referenciadas sem causar impacto no
programa.
package cap3;
import cap3. arranjo . Pilha ; / / vide programa da transparn-
cia 11
public class ET {
private class Definicoes {
public static final int maxTam = 70;
public static final char cancelaCarater = # ;
public static final char cancelaLinha = \\ ;
public static f i n a l char saltaLinha = ;
public static f i n a l char marcaEof = ~ ;
}
private static void imprime( Pilha pilha )throws Exception {
Pilha pilhaAux = new Pilha ( Definicoes .maxTam) ;
Character x ;
/ / Continua na prxima transparncia
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2 36
ET - Implementao
ET - Implementao
Filas
TAD Filas
Conjunto de operaes:
1. Criar uma fila vazia.
2. Enfileirar o item x no final da fila.
3. Desenfileirar. Essa funo retorna o item x
no incio da fila e o retira da fila.
4. Verificar se a fila est vazia. Essa funo
retorna true se a fila est vazia; do
contrrio, retorna false.
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1 40
4
Tras
8 5
7 6
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1 41
...
4
Tras
8 5
7 6
/ / Operaes
public Fila ( int maxTam) { / / Cria uma Fila vazia
this . item = new Object [maxTam] ;
this . frente = 0;
this . tras = this . frente ;
}
public void enfileira ( Object x ) throws Exception {
i f ( ( this . tras + 1) % this . item . length == this . frente )
throw new Exception ( "Erro : A f i l a esta cheia" ) ;
this . item [ this . tras ] = x ;
this . tras = ( this . tras + 1) % this . item . length ;
}
public Object desenfileira ( ) throws Exception {
i f ( this . vazia ( ) )
throw new Exception ( "Erro : A f i l a esta vazia" ) ;
Object item = this . item [ this . frente ] ;
this . frente = ( this . frente + 1) % this . item . length ;
return item ;
}
public boolean vazia ( ) {
return ( this . frente == this . tras ) ;
}
}
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.2 44
6 6
frente trs
Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.2 45
Ordenao
Introduo - Conceitos Bsicos
Ordenao Interna
Ordenao por Seleo
Ordenao por Insero
Shellsort
Quicksort
Heapsort
Ordenao Parcial
Seleo Parcial
Insero Parcial
Heapsort Parcial
Quicksort Parcial
Ordenao Externa
Intercalao Balanceada de Vrios
Caminhos
Implementao por meio de Seleo por
Substituio
Consideraes Prticas
Intercalao Polifsica
Quicksort Externo
Projeto de Algoritmos Cap.4 Ordenao 2
e
< < < .
Algoritmo:
1. Distribuir as cartas abertas em treze
montes: ases, dois, trs, . . ., reis.
2. Colete os montes na ordem especificada.
3. Distribua novamente as cartas abertas em
quatro montes: paus, ouros, copas e
espadas.
4. Colete os montes na ordem especificada.
Projeto de Algoritmos Cap.4 Ordenao 4
package cap4;
public interface Item {
public int compara ( Item i t ) ;
public void alteraChave ( Object chave) ;
public Object recuperaChave ( ) ;
}
Projeto de Algoritmos Cap.4 Ordenao 6
package cap4;
import java . io . ;
public class MeuItem implements Item {
private int chave;
/ / outros componentes do registro
Ordenao Interna
Ordenao Interna
Ordenao Interna
Chaves iniciais: O R D E N A
i=1 A R D E N O
i=2 A D R E N O
i=3 A D E R N O
i=4 A D E N R O
i=5 A D E N O R
Anlise
n2 n
C(n) = 2
2
M (n) = 3(n 1)
Vantagens:
Desvantagens:
O algoritmo no estvel.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.2 16
Algoritmo:
Em cada passo a partir de i=2 faa:
Selecione o i-simo item da seqncia
fonte.
Coloque-o no lugar apropriado na
seqncia destino de acordo com o
critrio de ordenao.
Chaves iniciais: O R D E N A
i=2 O R D E N A
i=3 D O R E N A
i=4 D E O R N A
i=5 D E N O R A
i=6 A D E N O R
Soluo:
Utilizar um registro sentinela na posio
zero do vetor.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.2 19
Shellsort
Shellsort
Exemplo de utilizao:
1 2 3 4 5 6
Chaves iniciais: O R D E N A
h=4 N A D E O R
h=2 D A N E O R
h=1 A D E N O R
Shellsort
h(s) = 1, para s = 1.
Shellsort
Shellsort
Anlise
Shellsort
Vantagens:
Shellsort uma tima opo para arquivos
de tamanho moderado.
Sua implementao simples e requer
uma quantidade de cdigo pequena.
Desvantagens:
O tempo de execuo do algoritmo
sensvel ordem inicial do arquivo.
O mtodo no estvel,
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.4 28
Quicksort
Quicksort
Quicksort
Quicksort
1 2 3 4 5 6
O R D E N A
A R D E N O
A D R E N O
Quicksort
Mtodo Partio:
Quicksort
Mtodo ordena e algoritmo Quicksort:
Quicksort
Chaves iniciais: O R D E N A
1 A D R E N O
2 A D
3 E R N O
4 N R O
5 O R
A D E N O R
Quicksort
Anlise
Pior caso:
C(n) = O(n2 )
Quicksort
Anlise
Melhor caso:
Quicksort
Vantagens:
extremamente eficiente para ordenar
arquivos de dados.
Necessita de apenas uma pequena pilha
como memria auxiliar.
Requer cerca de n log n comparaes em
mdia para ordenar n itens.
Desvantagens:
Tem um pior caso O(n2 ) comparaes.
Sua implementao muito delicada e
difcil:
Um pequeno engano pode levar a
efeitos inesperados para algumas
entradas de dados.
O mtodo no estvel.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.5 38
Heapsort
Algoritmo:
1. Selecione o menor item do vetor.
2. Troque-o com o item da primeira posio
do vetor.
3. Repita estas operaes com os n 1 itens
restantes, depois com os n 2 itens, e
assim sucessivamente.
Heapsort
Filas de Prioridades
Aplicaes:
SOs usam filas de prioridades, nas quais
as chaves representam o tempo em que
eventos devem ocorrer.
Mtodos numricos iterativos so
baseados na seleo repetida de um item
com maior (menor) valor.
Sistemas de gerncia de memria usam a
tcnica de substituir a pgina menos
utilizada na memria principal por uma
nova pgina.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.5 40
Heapsort
Filas de Prioridades - Tipo Abstrato de Dados
Operaes:
1. Constri uma fila de prioridades a partir de
um conjunto com n itens.
2. Informa qual o maior item do conjunto.
3. Retira o item com maior chave.
4. Insere um novo item.
5. Aumenta o valor da chave do item i para
um novo valor que maior que o valor
atual da chave.
6. Substitui o maior item por um novo item, a
no ser que o novo item seja maior.
7. Altera a prioridade de um item.
8. Remove um item qualquer.
9. Ajunta duas filas de prioridades em uma
nica.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.5 41
Heapsort
Filas de Prioridades - Representao
Heapsort
Filas de Prioridades - Representao
Observao:
Para implementar a operao Ajunta de forma
eficiente e ainda preservar um custo
logartmico para as operaes Insere, Retira,
Substitui e Altera necessrio utilizar
estruturas de dados mais sofisticadas, tais
como rvores binomiais (Vuillemin, 1978).
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.5 43
Heapsort
Filas de Prioridades - Algoritmos de
Ordenao
Heapsort
Heaps
uma seqncia de itens com chaves
c[1], c[2], . . . , c[n], tal que:
c[i] c[2i],
c[i] c[2i + 1],
1 S
2 R O 3
4 E 5 N A 6 D 7
Heapsort
Heaps
1 2 3 4 5 6 7
S R O E N A D
Heapsort
Heaps
Heapsort
Estrutura de dados fila de prioridades
implementada utilizando um heap
Heapsort
Heaps
Algoritmo:
1 2 3 4 5 6 7
Chaves iniciais: O R D E N A S
Esq = 3 O R S E N A D
Esq = 2 O R S E N A D
Esq = 1 S R O E N A D
Heapsort
Heaps
Heapsort
Heaps
Heapsort
Heaps
Heapsort
Heaps
Heapsort
Heaps
(a) S (b) S
R O R O
i i
E N A D E N U D
(c) S (d) U i
i
R U R S
E N O D E N O D
Heapsort
Heaps
Heapsort
Algoritmo:
1. Construir o heap.
2. Troque o item na posio 1 do vetor (raiz
do heap) com o item da posio n.
3. Use o procedimento Refaz para
reconstituir o heap para os itens v [1],
v [2], . . . , v [n 1].
4. Repita os passos 2 e 3 com os n 1 itens
restantes, depois com os n 2, at que
reste apenas um item.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.5 56
Heapsort
1 2 3 4 5 6 7
S R O E N A D
R N O E D A S
O N A E D R
N E A D O
E D A N
D A E
A D
Heapsort
Programa que mostra a implementao do
Heapsort para um conjunto de n itens
implementado como um vetor do tipo Item:
Anlise
O procedimento Refaz gasta cerca de log n
operaes, no pior caso.
Logo, Heapsort gasta um tempo de execuo
proporcional a n log n, no pior caso.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.5 58
Heapsort
Vantagens:
O comportamento do Heapsort sempre
O(n log n), qualquer que seja a entrada.
Desvantagens:
O anel interno do algoritmo bastante
complexo se comparado com o do
Quicksort.
O Heapsort no estvel.
Recomendado:
Para aplicaes que no podem tolerar
eventualmente um caso desfavorvel.
No recomendado para arquivos com
poucos registros, por causa do tempo
necessrio para construir o heap.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.6 59
Complexidade
Insero O(n2 )
Seleo O(n2 )
Shellsort O(n log n)
Quicksort O(n log n)
Heapsort O(n log n)
O mtodo estvel.
Ordenao Parcial
Ordenao Parcial
Aplicaes:
Ordenao Parcial
Algoritmos considerados:
Seleo parcial.
Insero parcial.
Heapsort parcial.
Quicksort parcial.
Seleo Parcial
Princpio de funcionamento:
Selecione o menor item do vetor.
Troque-o com o item que est na primeira
posio do vetor.
Repita estas duas operaes com os itens
n 1, n 2 . . . n k.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.7 75
Seleo Parcial
Anlise:
k2 k
C(n) = kn 2
2
M (n) = 3k
Projeto de Algoritmos Cap.4 Ordenao Seo 4.1.7 76
Seleo Parcial
Insero Parcial
Insero Parcial
Obs:
Insero Parcial
Algoritmo de Insero Parcial que preserva o
restante do vetor:
Insero Parcial
Anlise:
No anel mais interno, na i-sima iterao o
valor de Ci :
melhor caso : Ci (n) = 1
pior caso : Ci (n) = i
1 i+1
caso medio : Ci (n) = i
(1 + 2 + + i) = 2
Insero Parcial
Anlise:
O nmero de movimentaes na i-sima
iterao :
Mi (n) = Ci (n) 1 + 3 = Ci (n) + 2
Heapsort Parcial
Heapsort Parcial
Heapsort Parcial
Anlise:
Quicksort Parcial
Quicksort Parcial
Chaves iniciais: O R D E N A
1 A D R E N O
2 A D
3 E R N O
4 N R O
5 O R
A D E N O R
Quicksort Parcial
Quicksort Parcial
Anlise:
Ordenao Externa
Ordenao Externa
Fatores que determinam as diferenas das
tcnicas de ordenao externa:
Ordenao Externa
Ordenao Externa
Objetivo:
Ordenar os 22 registros e coloc-los em
uma fita de sada.
Operao de substituio:
Retirar o menor item da fila de prioridades.
Colocar um novo item no seu lugar.
Reconstituir a propriedade do heap.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.2 101
E I N T
R N E* T
C R E* T
A T E* C*
L A* E* C*
A C* E* L*
C E* A L*
A L* A C
O A A C
B A O C
A B O C
L C O A*
A L O A*
N O A* A*
C A* N* A*
E A* N* C*
A C* N* E*
D E* N* A
A N* D A
A D A
A D
D
A A R P
Z A R P
P R Z
R Z
Z
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.2 104
Algoritmo:
A A C I
L A C I
E C L I
R E L I
N I L R
L N R
T N R
R T
T
Consideraes Prticas
Consideraes Prticas
Consideraes Prticas
Consideraes Prticas
Consideraes Prticas
Intercalao Polifsica
Soluo:
Intercalao polifsica.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.4 112
Intercalao Polifsica
Intercalao Polifsica
Exemplo:
Blocos ordenados obtidos por meio de
seleo por substituio:
fita 1: AABCLO
fita 2:
fita 3: AACEINNRT AAACDEL
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.4 114
Intercalao Polifsica
Exemplo:
Depois da intercalao-de-2-caminhos das
fitas 1 e 3 para a fita 2:
fita 1:
fita 2: AAAABCCEILNNORT
fita 3: AAACDEL
Finalmente:
fita 1: AAAAAAABCCCDEEILLNNORT
fita 2:
fita 3:
Intercalao Polifsica
Intercalao Polifsica
Anlise:
Quicksort Externo
Quicksort Externo
Quicksort Externo
Algoritmo:
1. Particionar A da seguinte forma:
{R1 , . . . , Ri } Ri+1 Ri+2 . . . Rj2
Rj1 {Rj , . . . , Rn },
2. chamar recursivamente o algoritmo em
cada um dos subarquivos
A1 = {R1 , . . . , Ri } e A2 = {Rj , . . . , Rn }.
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.5 120
Quicksort Externo
Quicksort Externo
i Li Ls j i Li Ls j
rea Linf Lsup rea Linf Lsup
a) 5 3 10 6 1 7 4 b) 5 3 10 6 1 7 4 4
Ei Es Ei Es
i Li Ls j i Li Ls j
c) 5 3 10 6 1 7 4 4 5 d) 5 3 10 6 1 7 4 4 5 7
Ei Es Ei Es
i Li Ls j i Li Ls j
e) 5 3 10 6 1 7 7 4 5 7 f) 5 3 10 6 1 7 7 3 4 5 7
Ei Es Ei Es
i Li Ls j i Li Ls j
g) 3 3 10 6 1 7 7 4 5 3 7 h) 3 3 10 6 1 7 7 4 5 3 7
Ei Es Ei Es
Li
i Li Ls j i Ls j
i) 3 1 10 6 1 7 7 4 5 3 7 j) 3 1 10 6 1 7 7 4 5 3 7
Ei Es Ei Es
Li
i Ls j i Ls Li j
k) 3 1 10 6 1 10 7 4 5 3 7 l) 3 1 10 6 1 10 7 4 5 6 3 7
Ei Es Ei Es
i Ls Li j i Ls Li j
m) 3 1 10 6 6 10 7 4 5 3 7 n) 3 1 4 5 6 10 7 3 7
Ei Es Es Ei
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.5 122
Quicksort Externo
O programa a seguir apresenta a classe
QuicksortExterno, na qual so definidos as
estruturas de dados e os mtodos utilizados
pelo algoritmo Quicksort Externo.
package cap4.ordenacaoexterna;
import cap3. arranjo .Area;
import cap4.MeuItem;
import java . io . ;
public class QuicksortExterno {
private static class LimiteParticoes { int i ; int j ; }
private RandomAccessFile arqLi ;
private RandomAccessFile arqEi ;
private RandomAccessFile arqLEs;
private boolean ondeLer;
private MeuItem ultLido ;
private Area area;
private int tamArea;
/ / Mtodos utilizados pelo mtodo particao do quicksort ex-
terno
private int leSup ( int ls ) throws IOException
private int leInf ( int l i ) throws IOException
private int inserirArea ( ) throws Exception
Quicksort Externo
Quicksort Externo
Quicksort Externo
Mtodos auxiliares utilizados pelo mtodo
particao:
Quicksort Externo
Mtodos auxiliares utilizados pelo mtodo
particao:
Quicksort Externo
Mtodo Partio:
Quicksort Externo
Mtodo Partio:
Quicksort Externo
Programa teste:
package cap4;
import java . io .RandomAccessFile;
import cap4.ordenacaoexterna. QuicksortExterno ; / / vide transparncia 122
public class TestaQuicksortExterno {
public static void main ( String [ ] args ) {
try {
RandomAccessFile arq = new RandomAccessFile ( "qe. dat" , "rwd" ) ;
MeuItem item = new MeuItem ( 5 ) ; item .gravaArq ( arq ) ;
item = new MeuItem ( 3 ) ; item .gravaArq ( arq ) ;
item = new MeuItem ( 1 0 ) ; item .gravaArq ( arq ) ;
item = new MeuItem ( 6 ) ; item .gravaArq ( arq ) ;
item = new MeuItem ( 1 ) ; item .gravaArq ( arq ) ;
item = new MeuItem ( 7 ) ; item .gravaArq ( arq ) ;
item = new MeuItem ( 4 ) ; item .gravaArq ( arq ) ;
arq . close ( ) ;
QuicksortExterno quicksortExterno=new QuicksortExterno( "qe. dat" ,3);
quicksortExterno . quicksortExterno ( 1 , 7 ) ;
quicksortExterno . fechaArquivos ( ) ;
arq = new RandomAccessFile ( "qe. dat" , " r " ) ;
item . leArq ( arq ) ;
while ( arq . getFilePointer ( ) < arq . length ( ) ) {
System. out . println ( "Registro=" + item . toString ( ) ) ;
item . leArq ( arq ) ;
}
System. out . println ( "Registro=" + item . toString ( ) ) ; arq . close ( ) ;
} catch ( Exception e ) { System. out . println (e.getMessage ( ) ) ; }
}
}
Projeto de Algoritmos Cap.4 Ordenao Seo 4.2.5 130
Quicksort Externo
Anlise:
Melhor caso: O( nb )
Por exemplo, ocorre quando o arquivo de
entrada j est ordenado.
n2
Pior caso: O( TamArea )
ocorre quando um dos arquivos retornados
pelo procedimento Particao tem o maior
tamanho possvel e o outro vazio.
A medida que n cresce, a probabilidade de
ocorrncia do pior caso tende a zero.
n
Caso Mdio: O( nb log( TamArea ))
o que tem amaior probabilidade de
ocorrer.
Pesquisa em Memria
Primria
Objetivo da pesquisa:
Encontrar uma ou mais ocorrncias de
registros com chaves iguais chave de
pesquisa.
Tabela:
Associada a entidades de vida curta, criadas
na memria interna durante a execuo de
um programa.
Arquivo:
Geralmente associado a entidades de vida
mais longa, armazenadas em memria
externa.
Distino no rgida:
tabela: arquivo de ndices
arquivo: tabela de valores de funes.
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria 4
Depende principalmente:
1. Quantidade dos dados envolvidos.
2. Arquivo estar sujeito a inseres e
retiradas freqentes.
Dicionrio
Pesquisa Seqencial
Pesquisa Seqencial
package cap5;
import cap4. Item ; / / vide programa do captulo 4
public class Tabela {
private Item registros [ ] ;
private int n;
Pesquisa Seqencial
Pesquisa Seqencial
Pesquisa Seqencial
Anlise
C 0 (n) = n + 1.
Pesquisa Binria
Chaves iniciais: A B C D E F G H
A B C D E F G H
E F G H
G H
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.2 14
Pesquisa Binria
Anlise
rvores de Pesquisa
E D
R D
E
3 7
2 4 6
O nvel do n raiz 0.
A altura de um n o comprimento do
caminho mais longo deste n at um n folha.
package cap5;
import cap4. Item ; / / vide programa do captulo 4
public class ArvoreBinaria {
private static class No {
Item reg ;
No esq, dir ;
}
private No raiz ;
/ / Entram aqui os mtodos privados das transparncias 21, 22 e
26
public ArvoreBinaria ( ) {
this . raiz = null ;
}
public Item pesquisa ( Item reg ) {
return this .pesquisa ( reg , this . raiz ) ;
}
public void insere ( Item reg ) {
this . raiz = this . insere ( reg , this . raiz ) ;
}
public void retira ( Item reg ) {
this . raiz = this . retira ( reg , this . raiz ) ;
}
}
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.1 21
package cap5;
import java . io . ;
import cap4.MeuItem; / / vide programa do captulo 4
public class CriaArvore {
public static void main ( String [ ] args ) throws Exception {
ArvoreBinaria dicionario = new ArvoreBinaria ( ) ;
BufferedReader in = new BufferedReader (
new InputStreamReader (System. in ) ) ;
int chave = Integer . parseInt ( in . readLine ( ) ) ;
while (chave > 0) {
MeuItem item = new MeuItem (chave) ;
dicionario . insere ( item ) ;
chave = Integer . parseInt ( in . readLine ( ) ) ;
}
}
}
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.1 24
Alguns comentrios:
1. A retirada de um registro no to simples
quanto a insero.
2. Se o n que contm o registro a ser
retirado possui no mximo um
descendente a operao simples.
3. No caso do n conter dois descendentes o
registro a ser retirado deve ser primeiro:
substitudo pelo registro mais direita
na subrvore esquerda;
ou pelo registro mais esquerda na
subrvore direita.
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.1 25
3 7
2 4 6
bye
and easy
be to
bye
and to
be
be be
and to
and to
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.1 28
Caminhamento Central
Caminhamento Central
Percorrer a rvore:
5
3 7
2 4 6
Anlise
Anlise
5 4
3 7 2 6
2 4 6 1 3 5 7
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2 33
rvores SBB
2,5 10 2 5 10
1 3,4 6 8,9 11 1 3 4 6 8 9 11
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2.1 36
rvores SBB
rvore 2-3 rvore B binria (assimetria
inerente)
1. Referncias esquerda apontam para um
n no nvel abaixo.
2. Referncias direita podem ser verticais
ou horizontais.
Eliminao da assimetria nas rvores B
binrias rvores B binrias simtricas
(Symmetric Binary B-trees SBB)
rvore SBB uma rvore binria com 2 tipos
de referncias: verticais e horizontais, tal que:
1. todos os caminhos da raiz at cada n
externo possuem o mesmo nmero de
referncias verticais, e
2. no podem existir dois referncias
horizontais sucessivos.
3 5 9
1 2 4 6 7 8 10
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2.2 37
2 3 1 2 3 2
1 1 3
1 3 1 2 3 2
2 1 3
package cap5;
import cap4. Item ; / / vide programa do captulo 4
public class ArvoreSBB {
private static class No {
Item reg ; No esq, dir ; byte incE , incD;
}
private static final byte Horizontal = 0;
private static final byte Vertical = 1;
private No raiz ; private boolean propSBB;
Exemplo
5 3 5 9
5 7 10 2 4 7 10 2 4 6 7 10
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2.2 44
Procedimento Retira
Exemplo
Dada a rvore:
5 3 5 9
5 7 10 2 4 7 10 2 4 6 7 10
3 5 9 4 9 4
2 4 6 10 2 3 6 10 2 3 6 10
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2.2 50
Caso 1: 4
4 2 4
2 10
2 6 10 1 3 6 10
1 3 6 12 t
6
1 3 2a chamada
DirCurto
1a chamada DirCurto
2 chamadas DirCurto
Caso 2:
4 4 4
2 10
2 6 8 10 2 8
1 3 6 8 12
1 3 1 3 6 10
1a chamada DirCurto
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2.2 51
2 6 10 2 6 10
1 3 5 8 12 1 3 5 8
2 6
1 3 5 8 10
4 4
2 6 10 2 6 10
1 3 5 8 9 12 1 3 5 8 9
4
4
2 6 9
2 6
1 3 5 8 10
1 3 5 8 10
9
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.3.2.2 52
Anlise
Anlise
log(n + 1) k 2 log(n + 2) 2.
Pesquisa Digital
Trie
Exemplo
B = 010010
C = 010011
H = 011000
J = 100001
M = 101000
0 1
1 0
0 1 0 1
0 H J Q
1
0 1
B C
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.1 57
0 1
1 0
0 1 0 1
0 H J Q
1
0 1
B C
0 1
1 0 1
0 1 0 1 W
0 H 0 Q
1 0 1
0 1 J K
B C
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.1 58
Desvantagem:
Uma grande desvantagem das tries a
formao de caminhos de uma s direo
para chaves com um grande nmero de
bits em comum.
Exemplo: Se duas chaves diferirem
somente no ltimo bit, elas formaro um
caminho cujo comprimento igual ao
tamanho delas, no importando quantas
chaves existem na rvore.
Caminho gerado pelas chaves B e C.
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.2 59
B = 010010
C = 010011
H = 011000
J = 100001
Q = 101000
3 3
6 H J Q
B C
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.2 61
Insero da Chave K
1
3 3
6 H J Q
B C
3 3
6 H 5 Q
B C J K
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.2 62
Insero da Chave W
3 2
6 H 3 W
B C 5 Q
J K
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.2 63
Mtodos Auxiliares
/ / Retorna o i-simo bit da chave k a partir da esquerda
private int bit ( int i , char k) {
i f ( i == 0) return 0;
int c = ( int )k;
for ( int j = 1; j <= this .nbitsChave i ; j ++) c = c/2;
return c % 2;
}
/ / Verifica se p n externo
private boolean eExterno (PatNo p) {
Class classe = p.getClass ( ) ;
return classe.getName( ) .equals(PatNoExt.class.getName( ) ) ;
}
Mtodos Auxiliares
Continuao:
3. Caso contrrio, ou seja, se a raiz da
subrvore corrente for um n interno,
vai-se para a subrvore indicada pelo bit
da chave k de ndice dado pelo n
corrente, de forma recursiva.
4. Depois so criados um n interno e um n
externo: o primeiro contendo o ndice i e o
segundo, a chave k. A seguir, o n interno
ligado ao externo pela referncia
subrvore esquerda ou direita,
dependendo se o bit de ndice i da chave k
seja 0 ou 1, respectivamente.
5. O caminho de insero percorrido
novamente de baixo para cima, subindo
com o par de ns criados no Passo 4 at
chegar a um n interno cujo ndice seja
menor que o ndice i determinado no
Passo 2. Esse o ponto de insero e o
par de ns inserido.
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.4.2 68
Algoritmo de insero
private PatNo insereEntre (char k , PatNo t , int i ) {
PatNoInt aux = null ;
i f ( ! this .eExterno ( t ) ) aux = (PatNoInt) t ;
i f ( this .eExterno ( t ) | | ( i < aux. index ) ) { / / Cria um novo n
externo
PatNo p = this . criaNoExt ( k ) ;
i f ( this . bit ( i , k) == 1) return this . criaNoInt ( i , t , p) ;
else return this . criaNoInt ( i , p, t ) ;
} else {
i f ( this . bit (aux. index , k) == 1)
aux. dir = this . insereEntre ( k , aux. dir , i ) ;
else aux.esq = this . insereEntre ( k , aux.esq, i ) ;
return aux;
}
}
Hash significa:
1. Fazer picadinho de carne e vegetais para
cozinhar.
2. Fazer uma baguna. (Websters New
World Dictionary)
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.5 70
Funes de Transformao
h(K) = K mod M,
Transformao de Chaves No
Numricas
Transformao de Chaves No
Numricas
Implementao da funo de
transformao:
Listas Encadeadas
0 - U - nil
1 - A - nil
2 - P - I - nil
3 - Q - nil
4 - nil
5 - E - S - S - nil
6 - nil
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.5.2 78
Anlise
Endereamento Aberto
Exemplo
Anlise
Seja = N/M o fator de carga da tabela.
Conforme demonstrado por Knuth (1973), o
custo de uma pesquisa com sucesso
1 1
C(n) = 1+
2 1
Vantagens e Desvantagens de
Transformao da Chave
Vantagens:
Simplicidade de implementao.
Desvantagens:
Hashing Perfeito
Exemplo
0 6 1
10 2
3
5 10
4
9 3
8
2
8 11 4
7 7 5
6
Algoritmo:
1. Qualquer vrtice no processado
escolhido e feito g[v] = 0.
2. As arestas que saem do vrtice v so
seguidas e o valor g(u) do vrtice u
destino rotulado com o valor da
diferena entre o valor da aresta (v, u) e
g(v), tomado mod N .
3. Procura-se o prximo componente
conectado ainda no visitado e os
mesmos passos descritos acima so
repetidos.
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.5.4 97
0 6 1
10 2
3
5 10
4
9 3
8
2
8 11 4
7 7 5
6
Problema
Primeiro Refinamento do
Procedimento para Atribuir Valores ao
Arranjo g
boolean rotuleDe ( int v , int c , Grafo G, int g [ ] ) {
boolean grafoRotulavel = true ;
i f (g[ v ] ! = Indefinido ) i f (g[ v ] ! = c)
grafoRotulavel = false ;
else {
g[ v ] = c ;
for (u G. listaAdjacentes ( v) )
rotuleDe ( u , (G. aresta ( v,u) g[ v]) % N, g) ;
}
return grafoRotulavel ;
}
boolean atribuig ( Grafo G, int g [ ] ) {
boolean grafoRotulavel = true ;
for ( int v = 0; v < M; v++) g[ v ] = Indefinido ;
for ( int v = 0; v < M; v++)
i f (g[ v] == Indefinido )
grafoRotulavel = rotuleDe ( v , 0 , G, g) ;
return grafoRotulavel ;
}
Projeto de Algoritmos - Cap.5 Pesquisa em Memria Primria Seo 5.5.4 100
Anlise
Anlise
Anlise
Outra Alternativa
Outra Alternativa
Experimentos
Introduo
Pesquisa em memria secundria: arquivos
contm mais registros do que a memria
interna pode armazenar.
Custo para acessar um registro algumas
ordens de grandeza maior do que o custo de
processamento na memria primria.
Medida de complexidade: custo de trasferir
dados entre a memria principal e secundria
(minimizar o nmero de transferncias).
Memrias secundrias: apenas um registro
pode ser acessado em um dado momento
(acesso seqencial).
Memrias primrias: acesso a qualquer
registro de um arquivo a um custo uniforme
(acesso direto).
Em um mtodo eficiente de pesquisa, o
aspecto sistema de computao importante.
As caractersticas da arquitetura e do sistema
operacional da mquina tornam os mtodos
de pesquisa dependentes de parmetros que
afetam seus desempenhos.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1 2
Memria Virtual
O mapeamento de endereos :
f (e) = f (p, b) = p0 + b, onde e o endereo do
programa, p o nmero da pgina e b o
nmero do byte.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 6
Tabela_de_Pginas Pgina p
-
-
? ?
p0 p0 + b
p0 = nil pgina no
presente na
memria
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.1 7
Fim -
?
Pgina p
..
6
?
..
Incio
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.2 10
package cap6.umtipo;
class Registro {
private short chave;
/ / Outros componentes e mtodos de um registro
}
class Endereco {
private short p;
private byte b ; / / b [0, itensPorPagina 1]
/ / Mtodos para operar com um endereo
}
class Item {
private Registro reg ;
private Endereco esq, dir ;
/ / Mtodos para operar com um item
}
public class Pagina {
private Item pagina [ ] ;
public Pagina ( byte itensPorPagina ) {
/ / itensPorPagina = tamanhoDaPagina/tamanhoDoItem
this .pagina = new Item [ itensPorPagina ] ;
}
/ / Mtodos para operar com uma pgina
}
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.1.2 11
Memria Virtual
Em casos em que precisamos manipular mais
de um arquivo ao mesmo tempo:
Deve-se utilizar os mecanismos de
Herana e Polimorfismo de Java que
permitem que uma pgina possa ser
definida como vrios tipos diferentes.
A fila de molduras nica cada moldura
deve ter indicado o arquivo a que se refere
aquela pgina.
Memria Virtual
6 p0
p ?
A2 P5
Fila Grava pgina
de na memria
molduras p secundria
Programa p0 p0
Usurio p0
A1 A3 p0
Tabela
6 de Memria
pginas secundria Pgina
6 p6
p0 p
? p0 ?
P2 P4
Determina Recupera pgina
endereo da memria
p0 Pgina
real secundria
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.2 14
1 3 5 7 11 2 14 17 20 21 3 25 29 32 36 4 41 44 48
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.2 15
rvores B
package cap6;
import cap4. Item ; / / vide Programa do captulo 4
public class ArvoreB {
private static class Pagina {
int n ; Item r [ ] ; Pagina p [ ] ;
public Pagina ( int mm ) {
this .n = 0; this . r = new Item [ mm ] ;
this .p = new Pagina[ mm+1];
}
}
private Pagina raiz ;
private int m, mm ;
/ / Entra aqui o mtodo privado da transparncia 21
public ArvoreB ( int m) {
this . raiz = null ; this .m = m; this . mm = 2m;
}
public Item pesquisa ( Item reg ) {
return this .pesquisa ( reg , this . raiz ) ;
}
public void insere ( Item reg ) { vide transparncias 24 e
25 }
rvores B - Insero
rvores B - Insero
rvores B - Remoo
rvores B - Remoo
4j 4j j
,, ll * ,
, ll
2j 6j j 6j 4 6
AA AA AA T
j j 5j 7j j j jj
1 3 1 2 5 7 1 2 5 7
(b) Pgina vizinha possui exatamente m registros
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.1 29
rvores B - Remoo
(d) 13 25 43 48
rvores B* - Pesquisa
Insero na rvore B*
Semelhante insero na rvore B,
Diferena: quando uma folha dividida em
duas, o algoritmo promove uma cpia da
chave que pertence ao registro do meio
para a pgina pai no nvel anterior, retendo
o registro do meio na pgina folha da
direita.
Remoo na rvore B*
Relativamente mais simples que em uma
rvore B,
Todos os registros so folhas,
Desde que a folha fique com pelo menos
metade dos registros, as pginas dos
ndices no precisam ser modificadas,
mesmo se uma cpia da chave que
pertence ao registro a ser retirado esteja
no ndice.
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.3 38
rvore B de ordem m:
P r{Psmp esteja no 1 nvel} =
1 (2 ln12)m + O(m2 ),
3
P r{Psmp esteja acima do 1 nvel} = 7
=
1
(2 ln 2)m
+ O(m 2
).
Projeto de Algoritmos Cap.6 Pesquisa em Memria Secundria Seo 6.3.4 44
rvore B - Tcnica de
Transbordamento (ou Overflow)
Motivao
Aplicaes
Conceitos Bsicos
0 1 4
2 vrtice
Notao: G = (V, A)
G: grafo
V: conjunto de vrtices
A: conjunto de arestas
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 4
Grafos Direcionados
0 1 4
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 5
Grafos No Direcionados
0 1 4
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 6
Grau de um Vrtice
Em grafos no direcionados:
O grau de um vrtice o nmero de
arestas que incidem nele.
Um vrice de grau zero dito isolado ou
no conectado.
Ex.: O vrtice 1 tem 0 1 4
grau 2 e o vrtice 3
isolado.
3 2 5
Em grafos direcionados
O grau de um vrtice o nmero de
arestas que saem dele (out-degree) mais
o nmero de arestas que chegam nele
(in-degree).
Ex.: O vrtice 2 tem 0 1 4
in-degree 2, out-degree
2 e grau 4.
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 7
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 8
Ciclos
Em um grafo direcionado:
Um caminho (v0 , v1 , . . . , vk ) forma um ciclo
se v0 = vk e o caminho contm pelo
menos uma aresta.
O ciclo simples se os vrtices
v1 , v2 , . . . , vk so distintos.
O self-loop um ciclo de tamanho 1.
Dois caminhos (v0 , v1 , . . . , vk ) e
(v00 , v10 , . . . , vk0 ) formam o mesmo ciclo se
existir um inteiro j tal que vi0 = v(i+j) mod k
para i = 0, 1, . . . , k 1.
0 1 4
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 9
Ciclos
Em um grafo no direcionado:
Um caminho (v0 , v1 , . . . , vk ) forma um ciclo
se v0 = vk e o caminho contm pelo
menos trs arestas.
O ciclo simples se os vrtices
v1 , v2 , . . . , vk so distintos.
0 1 4
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 10
Componentes Conectados
0 1 4
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 11
0 1 4
3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 12
Grafos Isomorfos
G = (V, A) e G0 = (V 0 , A0 ) so isomorfos se
existir uma bijeo f : V V 0 tal que
(u, v) A se e somente se (f (u), f (v)) A0 .
0 1
4 5
7 6
3 2
s w x t
v z y u
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 13
Subgrafos
Um grafo G0 = (V 0 , A0 ) um subgrafo de
G = (V, A) se V 0 V e A0 A.
0 1 4
3 2 5
1 4
2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 14
2 2
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 15
Em um grafo no direcionado, u e v so
vizinhos se eles so adjacentes.
0 1 4 0 1 4
3 2 5 3 2 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.1 16
Grafos Completos
rvores
(a) (b)
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.2 19
6. Imprimir um grafo.
i f ( ! grafo . listaAdjVazia ( v ) ) {
Aresta aux = grafo . primeiroListaAdj ( v ) ;
while (aux ! = null ) {
int u = aux. vertice2 ( ) ; int peso = aux.peso ( ) ;
aux = grafo . proxAdj ( v ) ;
}
}
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.2.1 23
Matriz de Adjacncia
0 1 4 0 1 4
3 2 5 3 2 5
0 1 2 3 4 5 0 1 2 3 4 5
0 1 1 0 1 1
1 1 1 1 1 1
2 1 1 2 1 1
3 1 3
4 4
5 5
(a) (b)
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.2.1 25
3 0 1 5
5
0 1 1 3 2 7
1
7 2
3 2 3
0 1 5
5
0 1 0 5 2 7
1
7 1 7
2
3 2
3
Busca em Profundidade
Busca em Profundidade
Busca em Profundidade -
Implementao
package cap7;
import cap7. listaadj . autoreferencia .Grafo;
public class BuscaEmProfundidade {
public static final byte branco = 0;
public static byte cinza = 1;
public static byte preto = 2;
private int d [ ] , t [ ] , antecessor [ ] ;
private Grafo grafo ;
Busca em Profundidade -
Implementao
public void buscaEmProfundidade ( ) {
int tempo = 0; int cor [ ] = new int [ this . grafo .numVertices ( ) ] ;
for ( int u = 0; u < grafo .numVertices ( ) ; u++) {
cor [u] = branco ; this . antecessor [u] = 1;
}
for ( int u = 0; u < grafo .numVertices ( ) ; u++)
i f ( cor [u] == branco ) tempo = this . visitaDfs ( u, tempo, cor ) ;
}
public int d ( int v ) { return this .d[ v ] ; }
public int t ( int v ) { return this . t [ v ] ; }
public int antecessor ( int v ) { return this . antecessor [ v ] ; }
}
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.3 43
b( / ) b( / )
b( / ) 2 3 b( / ) 2 3
(a) (b)
b( / ) b( / )
b( / ) 2 3 c(3/ ) 2 3
(c) (d)
c(1/ ) c(2/ )
0 1
b( / )
p(3/4) 2 3
(e)
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.3 44
0 1 0 1
b( / ) b( / )
p(3/4) 2 3 p(3/4) 2 3
(f) (g)
c(7/ ) p(7/8)
p(3/4) 2 3 p(3/4) 2 3
(h) (i)
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.3 45
Desde que
X
|adj[u]| = O(|A|),
uV
Classificao de Arestas
Existem:
Classificao de Arestas
3 cruz 4 cruz 5
4/5 7/8 11/12
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.3.2 48
Busca em Largura
Busca em Largura
3 2 5 3 2 5
b( ) b( ) b( ) c(1) b( ) b( )
F 0 F 1 3
0 1 1
(c) (d)
p(0) p(1) b( ) p(0) p(1) b( )
0 1 4 0 1 4
3 2 5 3 2 5
c(1) c(2) b( ) p(1) c(2) b( )
F 3 2 F 2
1 2 2
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.4 54
3 2 5 3 2 5
p(1) p(2) b( ) p(1) p(2) b( )
F F 4
0
(g) (h)
p(0) p(1) p(0) p(0) p(1) p(0)
0 1 4 0 1 4
3 2 5 3 2 5
p(1) p(2) c(1) p(1) p(2) p(1)
F 5 F
1
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.4 55
Ordenao Topolgica
Ordenao Topolgica
2 4 7
3/14 6/13 8/11
9 0 5 1 2 4 6 7 8 3
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.5 59
Ordenao Topolgica
Ordenao Topolgica -
Implementao
0 1 0 1 0,1,2
3 2 3 2 3
2. Obter GT .
3 2 3 2 arv
cruz
4/5 3/6 7/8 2/5
1
Modelagem:
G = (V, A): grafo conectado, no
direcionado.
V : conjunto de cidades.
A: conjunto de possveis conexes
p(u, v): peso da aresta (u, v) A, custo
total de cabo para conectar u a v.
minimizado.
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.7 70
0 0
6 5
1 1
1 2 2 3 1 2 2 3
2 2
5 6 4 4 4
4 5 4 5
3 3
(a) (b)
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.7.1 71
Um corte (V 0 , V V 0 ) de um grafo no
direcionado G = (V, A) uma partio de V .
(c) 0 (d) 0
0 0
2 2 2 2
1 3 1 3
2 2
1 1
4 5 4 4
6 4 6 4
(e) 0 (f) 0
0 0
2 2 2 2
1 3 1 3
2 2
1 1
4 5 4 5
5 4 3 4
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.7.2 76
(c) (d)
0 0
1 3 1 3
2 2
4 5 4 5
(e) (f)
0 0
1 3 1 3
2 2
4 5 4 5
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.7.3 83
Primeiro refinamento:
void Kruskal ( Grafo grafo )
ConjuntoDisjunto conj = new ConjuntoDisjunto ( ) ;
1. S = ;
2. for ( int v=0; v<grafo .numVertices ( ) ; v++) conj . criaConjunto (v ) ;
3. Ordena as arestas de A pelo peso;
4. for (cada ( u, v ) de A tomadas em ordem ascendente de peso)
5. i f ( conj . encontraConjunto (u) ! = conj . encontraConjunto ( v) )
6. S = S + {(u, v)} ;
7. conj . uniao ( u, v ) ;
Algoritmo de Dijkstra
Relaxamento
5 1 6 5 1 6
2 3 2 3
2 2 3
(c) 0
0
1 10
1 10
1 3 4
5 1 6
2 3
6 2 3
(a)
(b) {0} 0 1 3 10
(c) {0, 1} 0 1 6 3 10
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.8 96
5 1 6 5 1 6
2 3 2 3
5 2 3 5 2 3
(f) 0
0
1 10
1 6
1 3 4
5 1 6
2 3
5 2 3
(d) {0, 1, 3} 0 1 5 3 9
(e) {0, 1, 3, 2} 0 1 5 3 6
(f) {0, 1, 3, 2, 4} 0 1 5 3 6
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.8 97
Algoritmo de Dijkstra
(a) 0 (b) 0 1 2 3 4
5 arestas (1,2,0) (3,4,1) (3,5,2) (0,2,3) (2,3,4)
1
0 1 2 3 4 5
2 3
0 prim 3 0 4 9 6 7
4
2 0 1 2 3 4 5 6 7 8 9
3 prox 1 1 1 1 8 1 1 1 5 2
1 4
Projeto de Algoritmos Cap.7 Algoritmos em Grafos Seo 7.9 106
Transparncias
elaboradas por Charles Ornelas, Fabiano Botelho, Leonardo
Rocha, Leonardo Mata e Nivio Ziviani
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1 1
Definio e Motivao
Exemplos de aplicao:
edio de texto;
recuperao de informao;
estudo de seqncias de DNA em biologia
computacional.
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1 2
Notao
Os elementos de P e T so escolhidos de um
alfabeto finito de tamanho c.
Ex.: = {0, 1} ou = {a, b, . . . , z}.
Categorias de Algoritmos
P e T no so pr-processados:
algoritmo seqencial, on-line e de
tempo-real;
padro e texto no so conhecidos a priori.
complexidade de tempo O(mn) e de
espao O(1), para pior caso.
P pr-processado:
algoritmo seqencial;
padro conhecido anteriormente
permitindo seu pr-processamento.
complexidade de tempo O(n) e de espao
O(m + c), no pior caso.
ex.: programas para edio de textos.
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1 4
Categorias de Algoritmos
P e T so pr-processados:
algoritmo constri ndice.
complexidade de tempo O(log n) e de
espao O(n).
tempo para obter o ndice grande, O(n)
ou O(n log n).
compensado por muitas operaes de
pesquisa no texto.
Tipos de ndices mais conhecidos:
Arquivos invertidos
rvores trie e rvores Patricia
Arranjos de sufixos
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1 5
Exemplos: P e T so pr-processados
exe mplo 6
exe rcem 44
fas cnio 52
pal avras 25 35
tem 21
tex to 0 15
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1 7
Casamento Exato
Dois enfoques:
As cadeias de caracteres T e P so
representadas por meio da classe String.
package cap8;
public class CasamentoExato {
private static final int maxChar = 256;
/ / Assinatura dos mtodos para casamento exato considerados
public static void forcaBruta ( String T, int n, String P, int m)
public static void shiftAndExato ( String T, int n, String P, int m)
public static void bmh ( String T, int n, String P, int m)
public static void bmhs ( String T, int n, String P, int m)
}
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.1 13
Pior caso: Cn = m n.
Caso esperado:
c 1
Cn = c1 1 cm (n m + 1) + O(1)
Autmatos
Tipos de Autmatos
Exemplo de Autmatos
a c
1 2
b
a c
1 2
b
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.1 18
a c
1 2
b
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.1 19
Transies Vazias
Estados Ativos
Ciclos em Autmatos
a c a c
1 2 1 2
b b
b 0 1
b
a
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.1 22
Knuth-Morris-Pratt (KMP)
KMP - 2DPDA
Controle c n Pilha
c n1
...
c 1
#
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.1 25
Controle c n Pilha
c n1
...
c 1
KMP - Algoritmo
Shift-And
Shift-And - Princpio de
Funcionamento
Shift-And - Algoritmo
Shift-And - Pr-processamento
0 1 2 3 4
M[t] 1 0 0 1 0
M[e] 0 1 0 0 1
M[s] 0 0 1 0 0
Shift-And - Pesquisa
Exemplo de funcionamento do
Shif-And
Shift-And - Implementao
void Shift-And ( P = p0 p1 . . . pm1 , T = t0 t1 . . . tn1 )
/ / Pr-processamento
for ( c ) M [c] = 0m ;
for ( j = 0; j < m; j ++) M [pj ] = M [pj ] | 0j 10mj1 ;
/ / Pesquisa
R = 0m ;
for ( i = 0; i < n ; i ++)
R = ((R >> 1) | 10m1 ) & M [T [i]] ;
i f ( R & 0m1 1 6= 0m ) "Casamento na posicao i m + 1" ;
Boyer-Moore-Horspool (BMH)
Funcionamento do BM e BMH
BM - Heurstica Ocorrncia
Alinha a posio no texto que causou a
coliso com o primeiro caractere no padro
que casa com ele;
Ex.: P ={cacbac}, T ={aabcaccacbac}.
012345678901
cacbac
aabcac cacbac
cacbac
cacbac
cacbac
cacbac
BM - Heurstica Casamento
012345678901
cacbac
aabcaccacbac
cacbac
cacbac
Escolha da Heurstica
Algoritmo Boyer-Moore-Horspool
(BMH)
BMH - Implementao
public static void bmh ( String T, int n, String P, int m) {
/ / Pr-processamento do padro
int d[ ] = new int [maxChar] ;
for ( int j = 0; j < maxChar; j ++) d[ j ] = m;
for ( int j = 0; j < (m1); j ++) d[ ( int )P. charAt ( j ) ] = m j 1;
int i = m 1;
while ( i < n ) { / / Pesquisa
int k = i ; int j = m 1;
while ( ( j >= 0) && (T. charAt ( k) == P. charAt ( j ) ) ) { j ; k; }
i f ( j < 0)
System. out . println ( "Casamento na posicao : " + (k + 1));
i = i + d[ ( int )T. charAt ( i ) ] ;
}
}
Algoritmo BMHS -
Boyer-Moore-Horspool-Sunday
Sunday (1990) apresentou outra simplificao
importante para o algoritmo BM, ficando
conhecida como BMHS.
Variante do BMH: enderear a tabela com o
caractere no texto correspondente ao prximo
caractere aps o ltimo caractere do padro,
em vez de deslocar o padro usando o ltimo
caractere como no algoritmo BMH.
Para pr-computar o padro, o valor inicial de
todas as entradas na tabela de
deslocamentos feito igual a m + 1.
A seguir, os m primeiros caracteres do padro
so usados para obter os outros valores da
tabela.
Formalmente d[x] = min{j tal que j =
m | (1 j m & P [m j] = x)}.
Para o padro P = teste, os valores de d
so d[t] = 2, d[e] = 1, d[s] = 3, e todos os
outros valores so iguais ao valor de |P | + 1.
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.1 44
BMHS - Implementao
BH - Anlise
BMH - Anlise
BMHS - Anlise
Casamento Aproximado
tes te
testa
este
os testes testam estes alunos . . .
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.1.2 49
Distncia de Edio
Casamento Aproximado
(a)
e s t e
1 2 3 4 5
t e s t e
0 1 2 3 4 5
(b)
e s t e
1 2 3 4 5
t e s t e
0 1 2 3 4 5
(c)
e s t e
1 2 3 4 5
e s t e
1 2 3 4 5
t e s t e
0 1 2 3 4 5
t e s t e
0 1 2 3 4 5
t e s t e
0 1 2 3 4 5
Compresso - Motivao
Razo de Compresso
Velocidade de compresso e de
descompresso.
c) 4 2 d) 4 2
2 rosa 2 uma 4 rosa uma
0 1 0 1 0 1
para cada , 2 2
0 1 0 1
para cada ,
e) 4 f) 10
6 rosa 0 1
0 1
rosa 6
uma 4 0 1
0 1
uma 4
2 2 0 1
0 1 0 1
2 2
para cada ,
0 1 0 1
para cada ,
rvore de Huffman
rvore de Huffman
O Algoritmo
Freqncias
1 2 3 n
c) ...
Exemplo de processamento da
primeira fase
Prox
1 2 n
b) ... ...
1 2 n
c) ...
1 2 n
a) ...
Prox Raiz
1 n
b) ... ... ...
1 n
c) ...
Cdigo Cannico
Propriedades:
1. Os comprimentos dos cdigos obedecem
ao algoritmo de Huffman.
2. Cdigos de mesmo comprimento so
inteiros consecutivos.
A partir dos comprimentos obtidos, o clculo
dos cdigos propriamente dito trivial: o
primeiro cdigo composto apenas por zeros
e, para os demais, adiciona-se 1 ao cdigo
anterior e faz-se um deslocamento
esquerda para obter-se o comprimento
adequado quando necessrio.
Codificao Cannica Obtida:
c base[c] offset[c]
1 0 1
2 2 2
3 6 2
4 12 3
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.2.3 86
Obteno do cdigo:
Exemplo de Codificao
Exemplo de Decodificao
Decodificao da seqncia de bits 1101:
c LeBit Codigo Codigo << 1 Base[c + 1]
1 1 1 - -
2 1 10 or 1 = 11 10 10
3 0 110 or 0 = 110 110 110
4 1 1100 or 1 = 1101 1100 1100
Exemplo:
Cdigo pleno para a palavra uma com 3
bytes 47 81 8.
Cdigo com marcao para a palavra
uma com 3 bytes 175 81 8
Note que o primeiro byte 175 = 47 + 128.
a) rvore ineficiente
...
... ...
254 ns vazios
256 elementos 256 elementos
b) rvore tima
...
... ...
254 elementos
256 elementos 2 elementos 254 ns vazios
Classe HuffmanByte
package cap8;
import java . io .;
import cap5.endaberto.TabelaHash;
import cap4. ordenacaointerna .Ordenacao;
public class HuffmanByte {
private int baseNum;
private int base [ ] , offset [ ] ;
private RandomAccessFile arqComp; / / Arquivo comprimido
private String nomeArqTxt; / / Nome do arquivo texto a ser comprimido
private String nomeArqDelim; / / Nome do arquivo que contm os delimita-
dores
private TabelaHash vocabulario ;
private static class Codigo {
int codigo ; int c ; / / Comprimento do cdigo
}
public HuffmanByte ( String nomeArqDelim, int baseNum, int m,
int maxTamChave) throws Exception {
this .baseNum = baseNum; this .base = null ; this . offset = null ;
this .nomeArqTxt = null ; this .nomeArqDelim = nomeArqDelim;
this . vocabulario = new TabelaHash (m, maxTamChave) ;
}
public void compressao ( String nomeArqTxt,
String nomeArqComp) throws Exception {
public void descompressao ( String nomeArqTxt,
String nomeArqComp) throws Exception {
}
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.2.4 98
Mudanas em Relao ao
Pseudocdigo Apresentado
Alteraes:
Mtodo escreve
Resultados Experimentais
Resultados Experimentais -
Comparao das tcnicas de
compresso sobre o arquivo WSJ
Dados sobre a coleo usada nos experimentos:
Casamento Exato
Algoritmo:
Buscar a palavra no vocabulrio, podendo
usar busca binria nesta fase:
Se a palavra for localizada no vocabulrio,
ento o cdigo de Huffman com marcao
obtido.
Seno a palavra no existe no texto
comprimido.
A seguir, o cdigo pesquisado no texto
comprimido usando qualquer algoritmo para
casamento exato de padro.
Para pesquisar um padro contendo mais de
uma palavra, o primeiro passo verificar a
existncia de cada palavra do padro no
vocabulrio e obter o seu cdigo:
Se qualquer das palavras do padro no
existir no vocabulrio, ento o padro no
existir no texto comprimido.
Seno basta coletar todos os cdigos
obtidos e realizar a pesquisa no texto
comprimido.
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.2.5 126
Casamento Aproximado
Algoritmo:
Casamento Aproximado
Algoritmo (Continuao):
ama
puma
uma
umas
Projeto de Algoritmos Cap.8 Processamento de Cadeias de Caracteres Seo 8.2.5 133
Pr-Processamento:
rosa 011
roupa 010 XXX
azul 000
Introduo
Problemas intratveis ou difceis so comuns
na natureza e nas reas do conhecimento.
Problemas fceis: resolvidos por algoritmos
polinomiais.
Problemas difceis: somente possuem
algoritmos exponenciais para resolv-los.
A complexidade de tempo da maioria dos
problemas polinomial ou exponencial.
Polinomial: funo de complexidade
O(p(n)), em que p(n) um polinmio.
Ex.: algoritmos com pesquisa binria
(O(log n)), pesquisa sequencial (O(n)),
ordenao por insero (O(n2 )), e
multiplicao de matrizes (O(n3 )).
Exponencial: funo de complexidade
O(cn ), c > 1.
Ex.: problema do caixeiro-viajante
(PCV) (O(n!)).
Mesmo problemas de tamanho pequeno a
moderado no podem ser resolvidos por
algoritmos no-polinomiais.
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1 2
Problemas N P-Completo
Caminho em um Grafo
2 7 9 10 13
11 5 1
3 2 8 3
i 7 3
Colorao de um Grafo
Ciclo de Hamilton
3 2
Cobertura de Arestas
Uma cobertura de arestas de um grafo
G = (V, A) um subconjunto A0 A de k
arestas tal que todo v V parte de pelo
menos uma aresta de A0 .
O conjunto resposta para k = 4
A0 = {(0, 3), (2, 3), (4, 6), (1, 5)}.
0 1
3 4 5
2 6
Algoritmos No-Deterministas
Funo escolhe(C)
Em contrapartida, um algoritmo
no-determinista termina sem sucesso se e
somente se no h um conjunto de escolhas
que indique sucesso.
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.1 13
Mquina No-Determinista
Pesquisa No-Determinista
void pesquisaND ( x , A, 1 , n) {
j escolhe (A, 1 , n) ;
i f (A[ j ] == x ) sucesso ; else insucesso ;
}
Ordenao No-Determinista
Problema da Satisfabilidade
A expresso E2 = x1 x1 no satisfatvel.
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.1 18
Problema da Satisfabilidade
NP
N P P ou N P = P? - Conseqncias
Transformao Polinomial
Transformao Algoritmo A 2
Transformao
Polinomial Polinomial
0 1
3 4 5
2 6
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.2 24
Clique de um grafo
0 1
3 4 5
2 6
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.2 26
Transformao Polinomial
Transformao Polinomial
A relao transitiva (1 2 e
2 3 1 3 ).
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.2 29
Dois problemas 1 e 2 so
polinomialmente equivalentes se e
somente se 1 2 e 2 1 .
Teorema de Cook
Existe algum problema em N P tal que se ele
for mostrado estar em P, implicaria P = N P?
Teorema de Cook: Satisfabilidade (SAT) est
em P se e somente se P = N P.
Ou seja, se existisse um algoritmo polinomial
determinista para satisfabilidade, ento todos
os problemas em N P poderiam ser
resolvidos em tempo polinomial.
A prova considera os dois sentidos:
1. SAT est em N P (basta apresentar um
algoritmo no-determinista que execute
em tempo polinomial). Logo, se P = N P,
ento SAT est em P.
2. Se SAT est em P, ento P = N P. A
prova descreve como obter de qualquer
algoritmo polinomial no determinista de
deciso A, com entrada E, uma frmula
Q(A, E) de modo que Q satisfatvel se e
somente se A termina com sucesso para
E. O tempo necessrio para construir Q
O(p3 (n) log(n)), em que n o tamanho de
E e p(n) a complexidade de A.
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.2 33
void PCVND ( ) {
i = 1;
for ( int t = 1; t <= v ; t ++) {
j escolhe( i , lista_adj ( i ) ) ;
antecessor [ j ] = i ;
}
}
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.1.2 36
2 2
1 1
1 2 1 2
1 1
1 1
1 5 1 5 2
1 1
1 1
4 3 4 3
1 1
Classe N P-Intermediria
NP
NPC
NPI
P
Membros Potenciais de N PI
Problemas Exponenciais
desejvel resolver instncias grandes de
problemas de otimizao em tempo razovel.
Os melhores algoritmos para problemas
N P-completo tm comportamento de pior
caso exponencial no tamanho da entrada.
Para um algoritmo que execute em tempo
proporcional a 2N , no garantido obter
resposta para todos os problemas de
tamanho N 100.
Independente da velocidade do computador,
ningum poderia esperar por um algoritmo
que leva 2100 passos para terminar sua tarefa.
Um supercomputador poderia resolver um
problema de tamanho N = 50 em 1 hora, ou
N = 51 em 2 horas, ou N = 59 em um ano.
Mesmo um computador paralelo contendo um
milho de processadores, (sendo cada
processador um milho de vezes mais rpido
que o melhor processador que possa existir)
no seria suficiente para chegar a N = 100.
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.2 41
package cap9;
import cap7. matrizadj .Grafo;
public class BuscaEmProfundidade {
private int d [ ] ;
private Grafo grafo ;
public BuscaEmProfundidade ( Grafo grafo ) {
this . grafo = grafo ; int n = this . grafo .numVertices ( ) ;
d = new int [n ] ; }
private int visita ( int u, int tempo) {
this .d[u] = ++tempo;
i f ( ! this . grafo . listaAdjVazia (u ) ) {
Grafo. Aresta a = this . grafo . primeiroListaAdj (u) ;
while (a ! = null ) {
int v = a.v2 ( ) ;
i f ( this .d[ v] == 0) tempo = this . visita ( v , tempo) ;
a = this . grafo . proxAdj (u) ; }
}
return tempo;
}
public void buscaEmProfundidade ( ) {
int tempo = 0;
for ( int u = 0; u < grafo .numVertices ( ) ; u++)
this .d[u] = 0;
this . visita ( 0 , tempo) ;
}
}
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.2.1 44
1 2 3 4 5 6
0
2 6 0 1 2 6
1
1 1 2 4
1 3 2 1
5 1 2 6 2 4
2 4
4 3 2 1
2 1
4 4 2 1
5
Para o grafo
0
2 6
1
1 3 2 1
5 1 2 6
2 4
4
2 1
4
A rvore de caminhamento :
1 5 6
2 3 4 3 4 4
4 4 5 2 3 5 6 1 4 1 2 3 6 1 2 3 5
3 5 6 2 5 6 4 5 3 2 4 1 2 6 2 3 1 1 2 3 1 1 5 3
5 3 2 6 4 2 6 2 1 3 2 5 3 2 1
6 5 2
0 0
5 6
3 4 4
4 2 3 6 2 3 5
2 6 1 1 5 3
1 3 3
0
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.2.1 48
0 1 2 3 4 5
0 3 10 11 7 25
5 1
1 8 12 9 26
2 9 4 20
4 2 3 5 15
3 4 18
S(I)
RA (I) = ,
S (I)
0 0
2 6 2
1 1
1 3 2 1 1 3 1
5 1 2 6 5 1 2 6
2 4 2
4
2 1 1
4 4
Projeto de Algoritmos Cap.9 Problemas N P -Completo e Algoritmos Aproximados Seo 9.2.3 60
Verifica-se que:
o algoritmo visita todos os vrtices.
nenhuma aresta visitada mais do que
duas vezes.
Passos do algoritmo:
Suponha uma AGM que tenha cidades do
PCV como vrtices.
Dobre suas arestas para obter um grafo
Euleriano.
Encontre um caminho Euleriano para esse
grafo.
Converta-o em um caminho do
caixeiro-viajante usando curto-circuitos.
(a) (b)
(c) (d)
timo PVC
1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1
AGM 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1
timo 1
1 1 1 1