Escolar Documentos
Profissional Documentos
Cultura Documentos
(Casamento de padres)
Estrutura de Dados II
Jairo Francisco de Souza
2
Strings
Tipo de dado importante para diversas
aplicaes!
"#ordaremos algumas $uestes relacionadas
com Strings nos seguintes t%picos
& 'usca em Strings (String matc(ing)
& Codi)ica*o
& Compress*o
+
'usca em Cadeias de Caracteres
Dados a ser processados nem sempre se
decompem logicamente em registros
independentes com pe$uenas partes
identi)ic,veis
Este tipo de dados - caracterizado apenas pelo
)ato de $ue pode ser escrito como uma cadeia
.ma cadeia - uma se$/0ncia linear de
caracteres1 tipicamente podendo ser muito longa
2
'usca em Cadeias de Caracteres
Cadeias s*o centrais em sistemas de
processamento de te3tos1 recupera*o de
in)orma*o1 estudo de se$u0ncias de D4" em
#iologia computacional1 etc!
Esses o#5etos podem ser #em grandes e
algoritmos e)icientes s*o necess,rios para
manipul,6los
T 7 8"'"C""'"CC"'"C"'""''9
: 7 8"'"C"'9
>
b
B
c
D
b
E
a
H
e
<=
b
<<
c
<2
b
<
b
2
c
+
b
2
a
< 2 + 2 = < 2 + = = < =
P
<+
a
2
q <2
b
<>
c
<B
b
> B D
a
E
=
Prefix
@utro e3emploQ
22
Caso importante
Considere o e3emplo a#ai3oQ
Uual o valor para :re)i3(<=)W
:re)i3(H)72! Aas P(2)YP(<=)!
:odemos concluir $ue :re)i3(<=)7=W
4*o1 n*o podemos!
>
a
B
g
D
c
E
g
H
c
<=
g c
< 2
g
+
c
2
g
P
i =
c
0 0 1 ! " # 0 1 0
Prefix
2>
Caso importante
E3iste um pre)i3o mais curto com taman(o
2 $ue - igual a um su)i3o de :(=1H)1 e
:(<=)7:(2)!
:odemos concluir $ue :re)i3(<=)72G<7+!
>
a
B
g
D
c
E
g
H
c
<=
g c
< 2
g
+
c
2
g
P
i =
c
0 0 1 ! " # 0 1 0
Prefix
2B
E3emplo
2D
"lgoritmo KA:
pu#lic static int KA:matc((String te3t1 String pattern) Z
int n 7 te3t!lengt(()[
int m 7 pattern!lengt(()[
int;? )ail 7 pre)i3Function(pattern)[
int i 7 =[
int 5 7 =[
\(ile (i ] n) Z
i) (pattern!c(ar"t(5) 77 te3t!c(ar"t(i)) Z
i) (5 77 m 6 <)
return i 6 m G <[ ^^ matc(
iGG[
5GG[
_
else i) (5 ` =)
5 7 )ail;5 6 <?[
else
iGG[
_
return 6<[ ^^ no matc(
_
pu#lic static int;? pre)i3Function(String pattern) Z
int;? )ail 7 ne\ int;pattern!lengt(()?[
)ail;=? 7 =[
int m 7 pattern!lengt(()[
int 5 7 =[
int i 7 <[
\(ile (i ] m) Z
i) (pattern!c(ar"t(5) 77 pattern!c(ar"t(i)) Z
)ail;i? 7 5 G <[
iGG[
5GG[
_
else i) (5 ` =) ^^ 5 )ollo\s a matc(ing pre)i3
5 7 )ail;5 6 <?[
else Z ^^ no matc(
)ail;i? 7 =[
iGG[
_
_
return )ail[
_
2E
"lgoritmo KA:
Como s*o evitadas comparaes em :1 o
algoritmo - e3ecutado em tempo
polinomial!
T )eito um pr-6processamento em :
& @(n)
T )eito um processamento em T
& @(m)
:rocessamento totalQ @(n G m)
2H
E3ercScio
Considere o te3to a#ai3oQ
"'"C""'"CC"'"C"'""''
:es$uise o padr*o "'"C"' utilizando o
m-todo KA:!
Diga $uantas comparaes o m-todo )az!
+=
"lgoritmo 'AF
Formalmente1
d;3? 7 min Z 5 tal $ue 5 7 m V (< e 5 ] m f : ;m d 5? 7 3) _!
E3!Q
&
:ara o padr*o : 7Zteste_1 os valores de d s*o d;t? 7 <1 d;e? 7 +1 d;s? 7 21
e todos os outros valores s*o iguais ao valor de V:V1 nesse caso m 7 >!
&
:ara o padr*o :7Z#ola_1 os valores de d s*o d;#? 7 +1 d;o? 7 21 d;l? 7 <1
d;a? 7 2!
+H
"lgoritmo 'AF
2=
"lgoritmo 'AF
;e?
2<
"lgoritmo 'AF
Z O C " T C O C " O " O " O T " T " C " O T " C O _
22
"lgoritmo 'AF
ac(oug
2+
"lgoritmo 'AF
22
Implementa*o
procedure BMH ( var T: TipoTexto ; var n : integer ;
var P: TipoPadrao ; var m: integer ) ;
{ Pesquisa P[ 1 m! em T[ 1 n! "
var i # $ # % : &nteger ;
d : arra' [ ( MaxTam)*+a,eto! o+ integer ;
,egin
{ Pre processamento do padrao"
+or $ :- ( to MaxTam)*+a,eto do d[ $ ! : - m;
+or $ :- ( to m./ do d[ ord(P[ $ ! ) ! : - m.$.1 ;
i : - m;
01i*e i 2- n do { Pesquisa"
,egin
% :- i ; $ : - m;
01i*e (T[ % ! - P[ $ ! ) and ( $ 3() do
,egin % : - %1; $ : - $ 1; end;
i+ $ - ( t1en 0rite*n ( 4 5asamento na posicao : 4 #%61:7);
i : - i 6 d[ ord(T[ i ! ) ! ;
end;
end;
2>
E3ercScio
Considere o te3to a#ai3oQ
"'"C""'"CC"'"C"'""''
:es$uise o padr*o "'"C"' utilizando o
m-todo 'AF!
Diga $uantas comparaes o m-todo )az!
2B
"lgoritmo 'FAS
E3emploQ
&
:ara o padr*o : 7 teste1 os valores de d s*o d;t? 7 21 d;e? 7 <1 d;s? 7 +1
e todos os outros valores s*o iguais ao valor de V:V G <!
2D
Implementa*o
procedure BMH8 ( var T: TipoTexto ; var n : integer ;
var P: TipoPadrao ; var m: integer ) ;
var i # $ # % : &nteger ;
d : arra' [ ( Max51ar! o+ integer ;
,egin
{ Pre processamento do padrao"
+or $ :- ( to Max51ar do d[ $ ! : - m61;
+or $ :- ( to m.1 do d[ ord(P[ $ ! ) ! : - m $ ;
i : - m;
01i*e i 2- n do { Pesquisa"
,egin
% :- i ; $ : - m;
01i*e (T[ % ! - P[ $ ! ) and ( $ 3() do
,egin % : - % 1; $ : - $ 1; end;
i+ $ - ( t1en 0rite*n ( 45asamento na posicao : 4 # %61:7);
i : - i 6 d[ ord(T[ i 61!)!;
end;
end;
2E
Implementa*o
@ pr-6processamento do padr*o ocorre
nas duas primeiras lin(as do c%digo!
" )ase de pes$uisa - constituSda por um
lao em $ue i varia de m at- n1 com
incrementos d;ord(T;iG<?)?1 o $ue e$uivale
ao endereo na ta#ela d do caractere $ue
est, na i G <6-sima posi*o no te3to1 a
$ual corresponde b posi*o do Pltimo
caractere de : !
2H
E3emplo
2 + 2 <
[e]
+ > 2 2 < > > >
> > > > > > > >
>=
E3emplo
S(i)t para ;c? 7 2
S(i)t para ;c? 7 2
matc(g
><
"lgoritmo 'AFS
Em#ora normalmente utiliza6se a compara*o do
padr*o seguindo da direita1 ao contr,rio dos
algoritmos de 'A e 'AF1 o algoritmo de SundaM
pode comparar o padr*o de )orma ar#itr,ria!
Caso sai#a6se $ual o caracter menos comum no
padr*o1 ele pode ser utilizado primeiro na
compara*o
>2
E3ercScio
Considere o te3to a#ai3oQ
"'"C""'"CC"'"C"'""''
:es$uise o padr*o "'"C"' utilizando o
m-todo 'AFS!
Diga $uantas comparaes o m-todo )az!
>+
'A 6 "n,lise
Te3to 7 8"'C""'"C9