Ca C ap pí í t t u u lo l o 2 2 : : Co C on n co c o rd r d ân â n ci c i a a de d e Mo M o d d el e l os o s
(p(peessqquuiissaa dede papadrdrõeõess))(p(paatttteernrn mamattcchihinngg))
•
• (PJUDQGHSDUWHGRVFDVRVGHSHVTXLVDRTXHVHSUHWHQGHHQFRQWUDUQmRp XPHOHPHQWRVLPSOHVPDVVLPXPDGHWHUPLQDGDVHTXrQFLD
❒❒
3U 3 UR R EO E O HP H P D D
1XPDFDGHLDGHFDUDFWHUHVSURFXUDURFRUUrQFLDV FRQFRUGkQFLDVGHXPGDGRSDGUmRPRGHOR
p r o c u r a r o m o d e l o c a s o e x i s t a
XPDFRQFRUGkQFLDRFRUUHDSDUWLUGHL
$$SSOOLLFFDDoo}H}HVV 7RGRRWLSRGHSHVTXLVDVHPHVWUXWXUDVVHTXHQFLDLV SDODYUDVRXIUDVHVHPWH[WRV
VXEOLVWDVHPOLVWDV
SURFHVVDGRUHVGHWH[WRPRWRUHVGHEXVFD
ELRORJLDPROHFXODUELEOLRWHFDVGLJLWDLVFULPLQRORJLD
ILOWURVGHVSDP LPDJHQVGLJLWDLV
❒❒
(V ( VS SH HF FL LI IL L F F D D om o mR R
'D'DGGRRVV FDGHLD s[1..n]
SDGUmR p[1..m] ( onde n >> m ) 5H5HVVXXOOWWDDGGRR ORFDOL]DomRGRLQtFLRGRSDGUmRQDFDGHLD
{ i ± [1..n] : k ±[1..m] Á s[i + k – 1] = p[k] }
❒❒
6R 6 RO OX Xo om m R R 7 7 UL U L YL Y L D D O O
,UGHVORFDQGRRPRGHORDRORQJRGDFDGHLDFRPSDUDQGRFDUDFWHUDFDUDFWHU
L Q
… a b c a b c a b d a b c …
IDOKRXSDUDN
IDOKRXSDUDN IDOKRXSDUDN FRQFRUGkQFLD
&&RRPPSOSOHH[[LLGGDDGGHH GDGD 6R6ROOXXoomRmR 77ULULYYLLDDOO
•
• 1RSLRUFDVRVmRUHDOL]DGDVP l Q FRPSDUDo}HV •
• 4XDODLQVWkQFLDTXHJHUDRSLRUFDVR"
•• 4XDLVVmRRVPRGHORV³GLItFHLV´"
•
• 1HFHVVLGDGHGHXPDOJRULWPROLQHDUHPQ
N P
a b c a b d a b c
a b c a b d a b c
a b c a b d a b c
a b c a b d a b c
{ solução trivial }
SURFHGXUH PesquisarModelo ( s, p : cadeia; m, n : integer;
YDU indice : integer; YDU achou : boolean);
YDU i, j, k : integer;
iguais : boolean;
EHJLQ i := 0;
achou:= IDOVH;
ZKLOH QRW achou DQG ( i < n–m+1) GR
EHJLQ { QmR começa em [1..i–1] H achou = (começa em i) } { QmR começa em [1..i] }
{ avançar modelo na cadeia } i = i + 1;
k := 0;
iguais := WUXH;
ZKLOH iguais DQG ( k < m ) GR
EHJLQ { concordância até k–1
Higuais = (s[i + k – 1] = p[k]) } { concordância até k }
{ avançar no modelo } k := k + 1 ;
iguais := s[i + k –1] = p[k]
{ concordância até k–1
Higuais = (s[i + k – 1] = p[k]) } HQG;
{ QmR iguais RX (k P} { iguais = (s[i + k – 1] = p[k]) } achou := iguais
{ QmR começa em [1..i–1] Hachou = (começa em i) } HQG;
{ achouRX (i n–m+1) } { achou = (começa em i) }
{ achou = ( i± [1..n] : k± [1..m] Á s[i + k – 1] = p[k]) } LI achou
WKHQ indice := i { indice ± [1..n] : k± [1..m] Á s[indice + k – 1] = p[k]) } HOVH indice := 0 { indice ² [1..n] }
HQG
❒❒ $O
$
OJJRRULU
LWWPPRR GHG
H .Q.
QXXWW
KK
±±
0R0
RUUUULLVV ±±
33
UDU
DWWWW ..0033 $$ LGLGHHLLDD
•• $QDOLVHPRVXPH[HPSORGRSLRUFDVR
Q
V a a a a a a a a a a a a a a a a a a a a b S a a a a a b
a a a a a b
P
•• 6HULDPHIHFWXDGDVQ±Pl P FRPSDUDo}HV $SyVDFRPSDUDomRV>@S>@
RDOJRULWPRWULYLDODYDQoDULDRSDGUmRHYROWDULDDFRPSDUDU
V>@ S>@V>@ S>@V>@ S>@V>@ S>@V>@ S>@
'HYHULDFRPSDUDUDSHQDVV>@ S>@
•
• 3UHWHQGHPRVXPDOJRULWPRRQGHFRQFRUGkQFLDVDQWHULRUHVQmR YROWHPDVHUWHVWDGDV6yDVVLPSRGHUiVHUOLQHDUHPQ
•
• 2VFDVRV³PDXV´VmRSURYRFDGRVSRUFRQFRUGkQFLDVSDUFLDLV •
• $VFRQFRUGkQFLDVSDUFLDLVVmRSURYRFDGDVSRUUHSHWLo}HV GHQWURGRPRGHOR
•
• 3UHWHQGHPRVXPDOJRULWPRTXH³FRQKHoD´DVUHSHWLo}HV H[LVWHQWHVQRPRGHOR
•• &RPRUHJLVWDUDVUHSHWLo}HV"
•• 9ROWDQGRDRSULPHLURH[HPSOR
L
V ... a b c a b c a b d a b c ...
S a b c a b d a b c
N
$SyVDFRPSDUDomRV>L@S>@RDOJRULWPR GHYHULDFRPSDUDU V>L@ S>@
3RUTXHQRSDGUmRH[LVWHPDVUHSHWLo}HVS>@ S>@HS>@ S>@
•
• $V5HSHWLo}HVHPSYmRVHUUHJLVWDGDVQXPYHFWRUDX[LOLDU
S
D E F D E G D E F
5
0 0 0 1 2 0 1 2 3
S>@ S>@Á 5>@
S>@ S>@Á 5>@
S>@S>@Á 5>@
S>@ S>@Á 5>@
S>@ S>@Á 5>@
S>@ S>@Á 5>@
S
D D D D D E
5
0 1 2 3 4 0
S>@ S>@ S>@ S>@ S>@
$$OOJJRRUULWLWPPRR SDSDUUDD DD FRFRQVQVWWUUXXoommRR GRGR YHYHFFWWRRUU 55
R[1]
0 k
1
para i = 2 .. m
se p[i] = p [k]
então R[i]
k k
k + 1 senão R[i]
0
k
1
SURFHGXUH construirR ( p : cadeia; m : integer; YDU R : vector);
YDU i, k : integer;
EHJLQ IRUi := 1 WR m GR
R[i] := 0;
k := 1;
IRUi := 2 WR m GR
LIp[i] = p[k]
WKHQEHJLQ R[i] := k;
k := k + 1
HQG
HOVH k := 1
HQG; { construirR }
22 DODOJJRRUULLWPWPRR .0.033
•• 6HIRLYHULILFDGDXPDGHVLJXDOGDGHSDUDN
L
... D E F D E F D E G D E F ...
S
D E F D E G D E F
R PRGHORDYDQoDQDFDGHLDFRQWLQXDQGRNi
i + 1
•• &RPRFRQWLQXDURSURFHVVRDSyVXPDFRQFRUGkQFLDSDUFLDO"
•
• 6HIRLYHULILFDGDXPDLJXDOGDGH
s[i] = p[k]
FRPRSDUDN... D E F D E F D E G D E F ...
S
D E F D E G D E F
GHYHUmRVHUFRPSDUDGRVRVGRLVFDUDFWHUHVVHJXLQWHV
i
i + 1
k
k + 1
•• 6HIRLYHULILFDGDXPDGHVLJXDOGDGH
s[i]
S>N@ WDOFRPRSDUD NS
D E F D E G D E F
5
0 0 0 1 2 0 1 2 3
N
e QHFHVViULRUHJUHVVDUDRFDUDFWHU³FRUUHVSRQGHQWH´QRVXE SDGUmRDQWHULRU2XVHMD
k
R[k-1] + 1
•• ( SURFHVVRFRQWLQXDULDSDUDRPHVPRL YROWDQGRDFRPSDUDU V>L@FRPS>N@
•• 3DUDRRXWURH[HPSOR
S
D D D D D E
5
0 1 2 3 4 0
N
•• ( PDLVXPH[HPSOR
L
... D F E D F E D F E ...
S
D E D E F G
5
0 0 1 2 0 0
N
V>L@S>@ N 5>N@ 5>@
V>L@S>@ L L
•• 2 L DYDQoDTXDQGRDGHVLJXDOGDGHpYHULILFDGDSDUDN
•• 3RUWDQWR
se k = 1
então i
i + 1
senão k
R[k-1] + 1
•• ( DSyVXPDFRQFRUGkQFLDWRWDO"
L
... D E F D E F D E F ...
S
D E F D E F
5
0 0 0 1 2 3
N
V>L@ S>@ L L
N N
N !P GHWHFWDGDXPDFRQFRUGkQFLD p QHFHVViULRUHFXDUQRPRGHOR
XWLOL]DQGRDPHVPDIyUPXOD
•• 1RWHVHTXHQHVWHFDVRH[LVWHPGXDVFRQFRUGkQFLDVWRWDLV
•• 3DUDXPDFDGHLDGHFRPSULPHQWRQ RDOJRULWPR.03QXQFD HIHFWXDPDLVGHGXDVFRPSDUDo}HVSRUHOHPHQWR$VVLPR Q~PHURWRWDOGHFRPSDUDo}HVYDULDHQWUHQHQVHQGR SRUWDQWRXPDOJRULWPROLQHDU
{ Algoritmo KMP }
SURFHGXUH ContarConcordancias ( s, p : cadeia; m, n : integer;
YDU R : vector; YDU conc : integer );
YDU i, k : integer;
EHJLQ construirR(p, m, R);
conc := 0;
i := 1;
k := 1;
ZKLOH i <= n GR LI s[i] = p[k]
WKHQEHJLQ { concordância parcial } i := i + 1;
k := k + 1;
LI k > m
WKHQ{ concordância total } EHJLQ conc := conc + 1;
k := R[k-1] + 1 HQG HQG
HOVH{ desigualdade } LI k = 1
WKHQ i := i + 1
HOVH k := R[k-1] + 1 HQG; { ContarConcordancias }
H[HUFtFLR $GDSWDUHVWHPyGXORSDUDDXWLOL]DomRHPILFKHLURVGH WH[WR3RUH[HPSORSURFXUDUXPDIUDVHFRQWDUDV RFRUUrQFLDVGHXPDSDODYUD
❒❒
2 2 0R 0 RG GH HO OR R 0D 0 DW WH HP Pi iW WL LF FR R GR G R $O $ O JR J R UL U LW WP PR R .0 . 03 3
'HILQLomR 8P$XWyPDWR)LQLWR'HWHUPLQLVWD$)' pXP TXtQWXSORRUGHQDGR
$ 4È G T )
RQGH
•
• 4 p XPFRQMXQWRILQLWRQmRYD]LRGHHVWDGRV
•• È p XPFRQMXQWRILQLWRDOIDEHWR GHVtPERORVGH HQWUDGD
•
• G 4 È| 4 p DIXQomRSDUFLDOGHWUDQVLomRRX GHPXGDQoDGHHVWDGR
•
• T ± 4 p RHVWDGRLQLFLDO
•• ) ° 4 p RFRQMXQWRGRVHVWDGRVILQDLVRXGH DFHLWDomR
LQSXW
HVWDGR ( DFHLWD/ UHMHLWD )
•• 3DUDFDGDPRGHORDSHVTXLVDURDOJRULWPR.03FRQVLVWHQD FRQVWUXomRGHXP$)'HQDVLPXODomRGRVHXIXQFLRQDPHQWR DRORQJRGDFDGHLDLQSXW GHSHVTXLVD
•
• 8PHVWDGRGHDFHLWDomRGRDXWyPDWRFRUUHVSRQGHDXPD FRQFRUGkQFLDWRWDO
•• $ FDGDPRGHORFRUUHVSRQGHXP$)'FXMDIXQomRGHWUDQVLomR IRLUHSUHVHQWDGDSHORYHFWRU5
3RUH[HPSOR
S
D E F D E F
5 RXQDUHSUHVHQWDomRKDELWXDOGHDXWyPDWRV
G (q
5,
F) = q
6 SRUH[HPSORR[5] = 2 ¾
G (q
5, x) = q
2, x
F•
• 3DUWLQGRGRHVWDGRLQLFLDO
0
DOHLWXUDGDVHTXrQFLDDEFDEF FRQGX]DRHVWDGRGHDFHLWDomR6)
•
• $SyVXPDGHVLJXDOGDGHRXXPDFRQFRUGkQFLDWRWDOR DXWyPDWRUHJUHVVDDXPGRVHVWDGRVDQWHULRUHV
•• (VVH³UHJUHVVR´HUDUHSUHVHQWDGRSHODIyUPXOD
k := R[k-1] + 1
❒❒
8P 8 PD D YD Y DU UL LD DQ Q W W H H GR G R $O $ OJ JR RU UL LW WP P R R .0 . 03 3
•• 1RDOJRULWPR.03EDVHRYHFWRU5pVHPSUHXWLOL]DGRDWUDYpVGD IyUPXOD
k := R[k-1] + 1
•
• 8PDDOWHUDomRVLPSOHVSDUDHYLWDUDVXEWUDFomRHDVRPD FRQVLVWHHPUHJLVWDUQXPYHFWRU6RUHVXOWDGRGHVVDIyUPXOD 3RUH[HPSOR
S
D E F D E F
5 6
8WLOL]DomRGHPDLVXPHOHPHQWRN P SDUDRFDVRGDFRQFRUGkQFLDWRWDO
SURFHGXUH construirS ( p : cadeia; m : integer; YDU S : vector);
YDU i, k : integer;
EHJLQS[1] := 1;
k := 1;
IRUi := 2 WR m GR
EHJLQS[i] := k;
LIp[i] = p[k]
WKHQk := k + 1 HOVHk := 1 HQG;
S[m+1] := k
HQG
•• 1RH[HPSORVHJXLQWHpXWLOL]DGDXPDIXQomR
$ SHVTXLVDpUHDOL]DGDQXPILFKHLUR)GHWH[WRFRQVLGHUDGR JOREDOjIXQomRHRYHFWRU6pORFDO
IXQFWLRQ concordancias ( p : cadeia; m : integer ) : integer;
YDU k, c : integer;
car : char;
S : vector;
EHJLQ construirS(p, m, S);
c := 0;
k := 1;
reset(F);
read(F, car);
ZKLOH QRW eof(F) GR LI car = p[k]
WKHQEHJLQ { concordância parcial } read(F, car);
k := k + 1;
LI k > m
WKHQ{ concordância total } EHJLQ c := c + 1;
k := S[k]
HQG HQG
HOVH{ desigualdade } LI k = 1
WKHQ read(F, car) HOVH k := S[k];
close(F);
concordancias := c
HQG
❒❒
3H 3 HV VT TX XL LV V D D QX Q XP P D D /L / LV VW WD D /L / LQ QH HD DU U / / LJ L JD DG GD D
•
• &RQVLGHUHPRVDJRUDTXHRGRPtQLRGHSHVTXLVDpXPDOLVWDOLQHDU OLJDGDGHILQLGDSRU
W\SH lista = ^elemento;
elemento = UHFRUG letra : char;
prox : lista HQG;
IXQFWLRQ concordancias ( ponta : lista; p : cadeia; m : integer ) : integer;
YDU k, c : integer;
S : vector;
este : lista;
EHJLQ construirS(p, m, S);
c := 0;
k := 1;
este := ponta;
ZKLOH este <> nil GR LI este^.letra = p[k]
WKHQEHJLQ { concordância parcial } este := este^.prox;
k := k + 1;
LI k > m
WKHQ{ concordância total } EHJLQ c := c + 1;
k := S[k]
HQG HQG
HOVH{ desigualdade } LI k = 1
WKHQ este := este^.prox HOVH k := S[k];
concordancias := c
❒❒
5H 5 HS SU UH HV VH HQ QW WD Do om mR R GR G R 0R 0 R GH G H O O R R SR S R U U XP X PD D / / LV L VW WD D / / LJ L JD D GD G D
•• 3DUDUHSUHVHQWDURPRGHORQXPDIRUPD³VHPHOKDQWH´DXP
$XWyPDWR)LQLWR'HWHUPLQLVWDFRQVLGHUHPRVDVHJXLQWHOLVWD GXSODPHQWHOLJDGD
W\SH modelo = ^elemento;
elemento = UHFRUG letra : char;
SUR[,UHFXD : modelo HQG;
•• 2 SRQWHLURSUR[pXWLOL]DGRQRFDVRGHXPDLJXDOGDGHGH
FDUDFWHUHVN NHQRFDVRGHXPDGHVLJXDOGDGHRSRQWHLUR UHFXDVHJXHDVWUDQVLo}HVGHILQLGDVSHORYHFWRU6N 6>N@
3RUH[HPSORDRPRGHOR
S
D E F D E F
6 FRUUHVSRQGHDOLVWD
•
• 2 GHVORFDPHQWRGHVWDHVWUXWXUDDRORQJRGRGRPtQLRGHSHVTXLVD VLPXODRIXQFLRQDPHQWRGHXP$XWyPDWR)LQLWR'HWHUPLQLVWD
•• $VVXPLQGRTXHHVWDUHSUHVHQWDomRGRPRGHORIRLMiFRQVWUXtGD
IXQFWLRQ concordancias ( ponta : lista; inicio : modelo ) : integer;
YDU c : integer;
este : lista;
p : modelo;
EHJLQ c := 0;
este := ponta;
p := inicio;
ZKLOH este <> nil GR
LI este^.letra = p^.letra
WKHQEHJLQ { concordância parcial } este := este^.prox;
LI p^.prox = nil
WKHQ{ concordância total } EHJLQ c := c + 1;
p := p^. recua HOVHHQGp := p^. prox
HQG
HOVH{ desigualdade } LI p = inicio
WKHQ este := este^.prox HOVH p := p^. recua;
concordancias := c HQG; { concordancias }
❒❒
&R & RQ QV V WU W UX X om o mR R GD G D 5H 5 HS SU UH HV VH HQ QW WD Do om mR R
•• $ SDUWLUGRSDGUmRLQLFLDOHGRYHFWRU6FRPHoDPRVSRUFRQVWUXLU D OLVWDHGHILQLURVFDPSRVOHWUDHSUR[
3RUH[HPSOR
S
D E F D E F
6
•
• 3URFXUHPRVXPDOJRULWPRSDUDDGHILQLomRGRFDPSRUHFXD
$$OOJJRRUULWLWPPRR
YDUp, ant, aux : modelo;
…
p := inicio;
p^.recua := inicio;
ZKLOH p^.prox <> nil GR EHJLQant := p;
p := p^.prox;
aux := ant^.recua;
ZKLOH ( aux^.letra <> ant^.letra ) DQG ( aux <> inicio ) GR aux := aux^.recua;
LI ( aux^.letra = ant^.letra ) DQG (ant <> inicio) WKHQ p^.recua := aux^.prox
HOVH p^.recua := inicio
HQG;
$$OOJJRRUULWLWPPRR
•• &RPEDVHQRDOJRULWPRXWLOL]DGRSDUDDFRQVWUXomRGRYHFWRU6 YDU i, k : integer;
…
S[1] := 1;
k := 1;
IRUi := 2 WR m GR
EHJLQS[i] := k;
LIp[i] = p[k]
WKHQk := k + 1 HOVHk := 1 HQG;
…
H DGDSWDQGRGLUHFWDPHQWH
YDUp, aux : modelo;
…
p := inicio;
aux := inicio;
p^.recua := inicio;
ZKLOH p^.prox <> nil GR EHJLQp := p^.prox;
p^.recua := aux;
LI p^.letra = aux^.letra WKHQ aux := aux^.prox HOVH aux := inicio
HQG;
FRQVWUXomRGDVOLVWDVDVVRFLDGDVDRVPRGHORV
S
D E F D E F
5 6
S
D D D D D E
5 6
S
D D D D E D
5 6