Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. Dfinição Motivação Procssamnto d Cadias d Caractrs Última altração: d Maio d 00 Cadia d caractrs: sqüência d lmntos dnominados caractrs. Os caractrs são scolhidos d um conjunto dnominado alfabto. Ex.: m uma cadia d bits o alfabto é {0, }. Casamnto d cadias d caractrs ou casamnto d padrão: ncontrar todas as ocorrências d um padrão m um txto. Exmplos d aplicação: dição d txto; rcupração d informação; studo d sqüências d DNA m biologia computacional. Transparências laboradas por Fabiano Cuprtino Botlho, Charls Ornlas Almida Nivio Ziviani Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. Notação Txto: arranjo T [..n] d tamanho n; Padrão: arranjo P [..m] d tamanho m n. Os lmntos d P T são scolhidos d um alfabto finito d tamanho c. Ex.: = {0, } ou = {a, b,..., z}. Casamnto d cadias ou casamnto d padrão: dados duas cadias P (padrão) d comprimnto P = m T (txto) d comprimnto T = n, ond n m, dsja-s sabr as ocorrências d P m T. Catgorias d Algoritmos P T não são pré-procssados: algoritmo sqüncial, on-lin d tmpo-ral; padrão txto não são conhcidos a priori. complxidad d tmpo O(mn) d spaço O(), para pior caso. P pré-procssado: algoritmo sqüncial; padrão conhcido antriormnt prmitindo su pré-procssamnto. complxidad d tmpo O(n) d spaço O(m + c), no pior caso. x.: programas para dição d txtos.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 5 Catgorias d Algoritmos P T são pré-procssados: algoritmo constrói índic. complxidad d tmpo O(log n) d spaço é O(n). tmpo para obtr o índic é grand, O(n) ou O(n log n). compnsado por muitas opraçõs d psquisa no txto. Tipos d índics mais conhcidos: Arquivos invrtidos Árvors tri árvors Patricia Arranjos d sufixos Exmplos: P T são pré-procssados Divrsos tipos d índics: arquivos invrtidos, árvors tri Patricia, arranjos d sufixos. Um arquivo invrtido possui duas parts: vocabulário ocorrências. O vocabulário é o conjunto d todas as palavras distintas no txto. Para cada palavra distinta, uma lista d posiçõs ond la ocorr no txto é armaznada. O conjunto das listas é chamado d ocorrências. As posiçõs podm rfrir-s a palavras ou caractrs. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 7 Exmplo d Arquivo Invrtido 7 6 6 Txto xmplo. Txto tm palavras. 6 5 5 Palavras xrcm fascínio. xmplo 7 xrcm 5 fascínio5 palavras6 6 tm txto 6 Arquivo Invrtido - Tamanho O vocabulário ocupa pouco spaço. A prvisão sobr o crscimnto do tamanho do vocabulário é dada pla li d Haps. Li d Haps: o vocabulário d um txto m linguagm natural contndo n palavras tm tamanho V = Kn β = O(n β ), ond K β dpndm das caractrísticas d cada txto. K gralmnt assum valors ntr 0 00, β é uma constant ntr 0, na prática ficando ntr 0, 0,6. O vocabulário crsc sublinarmnt com o tamanho do txto, m uma proporção prto d sua raiz quadrada. As ocorrências ocupam muito mais spaço. Como cada palavra é rfrnciada uma vz na lista d ocorrências, o spaço ncssário é O(n). Na prática, o spaço para a lista d ocorrências fica ntr 0% 0% do tamanho do txto.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 9 Arquivo Invrtido - Psquisa A psquisa tm gralmnt três passos: Psquisa no vocabulário: palavras padrõs da consulta são isoladas psquisadas no vocabulário. Rcupração das ocorrências: as listas d ocorrências das palavras ncontradas no vocabulário são rcupradas. Manipulação das ocorrências: as listas d ocorrências são procssadas para tratar frass, proximidad, ou opraçõs boolanas. Como a psquisa m um arquivo invrtido smpr comça plo vocabulário, é intrssant mantê-lo m um arquivo sparado. Na maioria das vzs, ss arquivo cab na mmória principal. Arquivo Invrtido - Psquisa A psquisa d palavras simpls pod sr ralizada usando qualqur strutura d dados qu torn a busca ficint, como hashing, árvor tri ou árvor B. As duas primiras têm custo O(m), ond m é o tamanho da consulta (indpndntmnt do tamanho do txto). Guardar as palavras na ordm lxicográfica é barato m trmos d spaço comptitivo m dsmpnho, já qu a psquisa binária pod sr mprgada com custo O(log n). A psquisa por frass usando índics é mais difícil d rsolvr. Cada lmnto da fras tm d sr psquisado sparadamnt suas listas d ocorrências rcupradas. A sguir, as listas têm d sr prcorridas d forma sicronizada para ncontrar as posiçõs nas quais todas as palavras aparcm m sqüência. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Arquivo Invrtido Usando Tri Arquivo invrtido usando uma árvor tri para o txto: Txto xmplo. Txto tm palavras. Palavras xrcm fascínio. x f fascínio: 5 p palavras: 6,6 t m x m r tm: txto:, 6 xmplo: 7 xrcm: 5 O vocabulário lido até o momnto é colocado m uma árvor tri, armaznando uma lista d ocorrências para cada palavra. Cada nova palavra lida é psquisada na tri: S a psquisa é sm sucsso, ntão a palavra é insrida na árvor uma lista d ocorrências é inicializada com a posição da nova palavra no txto. Snão, uma vz qu a palavra já s ncontra na árvor, a nova posição é insrida ao final da lista d ocorrências. Casamnto Exato Consist m obtr todas as ocorrências xatas do padrão no txto. Ex.: ocorrência xata do padrão tst. tst os tsts tstam sts alunos... Dois nfoqus:. litura dos caractrs do txto um a um: algoritmos força bruta, Knuth-Morris-Pratt Shift-And.. psquisa d P m uma janla qu dsliza ao longo d T, psquisando por um sufixo da janla qu casa com um sufixo d P, por comparaçõs da dirita para a squrda: algoritmos Boyr-Moor-Horspool Boyr-Moor.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Força Bruta - Implmntação É o algoritmo mais simpls para casamnto d cadias. A idéia é tntar casar qualqur subcadia no txto d comprimnto m com o padrão. procdur ForcaBruta (var T: TipoTxto ; var n: intgr; { Psquisa P[..m] m T[..n] } var i, j, k : Intgr; for i := to n m + do k := i ; j := ; whil T[k] = P[ j ] do j := j + ; var P: TipoPadrao; var m: intgr ); k := k + ; if j>m thn writln ( Casamnto na posicao, i :); Força Bruta - Anális Pior caso: C n = m n. O pior caso ocorr, por xmplo, quando P = aab T =aaaaaaaaaa. Caso sprado: C n = c c ( c m ) (n m + ) + O() O caso sprado é muito mlhor do qu o pior caso. Em xprimnto com txto randômico alfabto d tamanho c =, o númro sprado d comparaçõs é aproximadamnt igual a,. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Autômatos Um autômato é um modlo d computação muito simpls. Um autômato finito é dfinido por uma tupla (Q, I, F,, T ), ond Q é um conjunto finito d stados, ntr os quais xist um stado inicial I Q, alguns são stados finais ou stados d término F Q. Transiçõs ntr stados são rotuladas por lmntos d {ɛ}, ond é o alfabto finito d ntrada ɛ é a transição vazia. As transiçõs são formalmnt dfinidas por uma função d transição T. T associa a cada stado q Q um conjunto {q, q,..., q k } d stados d Q para cada α {ɛ}. Tipos d Autômatos Autômato finito não-dtrminista: Quando T é tal qu xist um stado q associado a um dado caractr α para mais d um stado, digamos T (q, α) = {q, q,..., q k }, k >, ou xist alguma transição rotulada por ɛ. Nst caso, a função d transição T é dfinida plo conjunto d triplas = {(q, α, q ), ond q Q, α {ɛ}, q T (q, α). Autômato finito dtrminista: Quando a função d transição T é dfinida pla função δ = Q ɛ Q. Nst caso, s T (q, α) = {q }, ntão δ(q, α) = q.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Exmplo d Autômatos Autômato finito não-dtrminista. A partir do stado 0, através do caractr d transição a é possívl atingir os stados. 0 a a b Autômato finito dtrminista. Para cada caractr d transição todos os stados lvam a um único stado. 0 d c Rconhcimnto por Autômato Uma cadia é rconhcida por (Q, I, F,, ) ou (Q, I, F,, δ) s qualqur um dos autômatos rotula um caminho qu vai d um stado inicial até um stado final. A linguagm rconhcida por um autômato é o conjunto d cadias qu o autômato é capaz d rconhr. Ex.: a linguagm rconhcida plo autômato abaixo é o conjunto d cadias {a} {abc} no stado. 0 a a b c a b c Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Transiçõs Vazias São transiçõs rotulada com uma cadia vazia ɛ, também chamadas d transiçõs-ɛ, m autômatos não-dtrministas Não há ncssidad d s lr um caractr para caminhar através d uma transição vazia. Simplificam a construção do autômato. Smpr xist um autômato quivalnt qu rconhc a msma linguagm sm transiçõs-ɛ. Estados Ativos S uma cadia x rotula um caminho d I até um stado q ntão o stado q é considrado ativo dpois d lr x. Um autômato finito dtrminista tm no máximo um stado ativo m um dtrminado instant. Um autômato finito não-dtrminista pod tr vários stados ativos. Casamnto aproximado d cadias pod sr rsolvido por mio d autômatos finitos não-dtrministas.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Ciclos m Autômatos Os autômatos abaixo são acíclicos pois as transiçõs não formam ciclos. 0 a a b c 0 a d b Autômatos finitos cíclicos, dtrministas ou não-dtrministas, são útis para casamnto d xprssõs rgulars A linguagm rconhcida por um autômato cíclico pod sr infinita. Ex: o autômato abaixo rconhc ba, bba, bbba, bbbba, assim por diant. a b 0 b a c Exmplo d Uso d Autômato O autômato abaixo rconhc P ={aabc}. c 0 b a b,c c b a b c a A psquisa d P sobr um txto T com alfabto ={a, b, c} pod sr vista como a simulação do autômato na psquisa d P sobr T. No início, o stado inicial ativa o stado. Para cada caractr lido do txto, a arsta corrspondnt é sguida, ativando o stado dstino. S o stado stivr ativo um caractr c é lido o stado final s torna ativo, rsultando m um casamnto d aabc com o txto. Como cada caractr do txto é lido uma vz, a complxidad d tmpo é O(n), d spaço é m + para vértics m para arstas. a Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Knuth-Morris-Pratt (KMP) O KMP é o primiro algoritmo (977) cujo pior caso tm complxidad d tmpo linar no tamanho do txto, O(n). É um dos algoritmos mais famosos para rsolvr o problma d casamnto d cadias. Tm implmntação complicada na prática prd m ficiência para o Shift-And o Boyr-Moor-Horspool. Até 97, o limit infrior conhcido para busca xata d padrõs ra O(mn). KMP - DPDA Em 97, Cook provou qu qualqur problma qu pudr sr rsolvido por um autômato dtrminista d dois caminhos com mmória d pilha (Two-way Dtrministic Pushdown Stor Automaton, DPDA) pod sr rsolvido m tmpo linar por uma máquina RAM. O DPDA é constituído d: uma fita apnas para litura; uma pilha d dados (mmória tmporária); um control d stado qu prmit movr a fita para squrda ou dirita, mpilhar ou dsmpilhar símbolos, mudar d stado. # c c c n $ p p p m φ Cabça d litura Control c n c n c # Pilha
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 KMP - Casamnto d cadias no DPDA # c c c n $ p p Control c n c n c # p m φ Cabça d litura Pilha No autômato da acima, a ntrada é constituída da cadia #c c c n $p p p m φ. A partir d # todos os caractrs são mpilhados até ncontrar o caractr $. A litura cotinua até ncontrar o caractr φ. A sguir a litura é ralizada no sntido contrário, iniciando por p n, comparado-o com o último caractr mpilhado, no caso c n. KMP - Algoritmo Primira vrsão do KMP é uma simulação linar do DPDA O algoritmo computa o sufixo mais longo no txto qu é também o prfixo d P. Quando o comprimnto do sufixo no txto é igual a P ocorr um casamnto. O pré-procssamnto d P prmit qu nnhum caractr sja rxaminado. O apontador para o txto nunca é dcrmntado. O pré-procssamnto d P pod sr visto como a construção conômica d um autômato dtrminista qu dpois é usado para psquisar plo padrão no txto. Esta opração é rptida para os caractrs sguints, s o caractr $ for atingido ntão as duas cadias são iguais. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Shift-And O Shift-And é vzs mais rápido muito mais simpls do qu o KMP. Pod sr stndido para prmitir casamnto aproximado d cadias d caractrs. Usa o concito d parallismo d bit: técnica qu tira provito do parallismo intrínsco das opraçõs sobr bits dntro d uma palavra d computador. É possívl mpacotar muitos valors m uma única palavra atualizar todos ls m uma única opração. Tirando provito do parallismo d bit, o númro d opraçõs qu um algoritmo raliza pod sr rduzido por um fator d até w, ond w é o númro d bits da palavra do computador. Shift-And - Notação para Opraçõs Usando Parallismo d bit Para dnotar rptição d bit é usado xponnciação: 0 = 0. Uma sqüência d bits b... b c é chamada d máscara d bits d comprimnto c, é armaznada m alguma posição d uma palavra w do computador. Opraçõs sobr os bits da palavra do computador: : opração or; & : opração and; : complmnta todos os bits; >> : mov os bits para a dirita ntra com zros à squrda (por xmplo, b, b,..., b c, b c >> = 00b,..., b c ).
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Shift-And - Princípio d Funcionamnto Mantém um conjunto d todos os prfixos d P qu casam com o txto já lido. Utiliza o parallismo d bit para atualizar o conjunto a cada caractr lido do txto. Est conjunto é rprsntado por uma máscara d bits R = (b, b,..., b m ). O algoritmo Shift-And pod sr visto como a simulação d um autômato qu psquisa plo padrão no txto (não-dtrminista para simular o parallismo d bit). Ex.: Autômato não-dtrminista qu rconhc todos os prfixos d P ={tst} 0 t s t 5 Shift-And - Algoritmo O valor é colocado na j-ésima posição d R = (b, b,..., b m ) s somnt s p... p j é um sufixo d t... t i, ond i corrspond à posição corrnt no txto. A j-ésima posição d R é dita star ativa. b m ativo significa um casamnto. R, o novo valor do conjunto R, é calculado na litura do próximo caractr t i+. A posição j + m R ficará ativa s somnt s a posição j stava ativa m R (p... p j ra sufixo d t... t i t i+ casa com p j+ ). Com o uso d parallismo d bit é possívl computar o novo conjunto com custo O(). Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Shift-And - Pré-procssamnto O primiro passo é a construção d uma tabla M para armaznar uma máscara d bits b..., b m para cada caractr. Ex.: máscaras d bits para os caractrs prsnts m P ={tst}. 5 M[t] 0 0 0 M[] 0 0 0 M[s] 0 0 0 0 A máscara m M[t] é 000, pois o caractr t aparc nas posiçõs d P. Shift-And - Psquisa O valor do conjunto é inicializado como R = 0 m (0 m significa 0 rptido m vzs). Para cada novo caractr t i+ lido do txto o valor do conjunto R é atualizado: R = ((R >> ) 0 m ) & M[T [i]]. A opração >> dsloca todas as posiçõs para a dirita no passo i + para marcar quais posiçõs d P ram sufixos no passo i. A cadia vazia ɛ também é marcada como um sufixo, prmitindo um casamnto na posição corrnt do txto (slf-loop no início do autômato). 0 t s t 5 Do conjunto obtido até o momnto, são mantidas apnas as posiçõs qu t i+ casa com p j+, obtido com a opração and dss conjunto d posiçõs com o conjunto M[t i+ ] d posiçõs d t i+ m P.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Exmplo d funcionamnto do Shif-And Psquisa do padrão P ={tst} no txto T ={os tsts }. Txto (R >> ) 0 m R o 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Shift-And - Implmntação Shift-And (P = p p... p m, T = t t... t n ); { Pré procssamnto } for c do M[c] := 0 m ; for j := to m do M[p j ] := M[p j ] 0 j 0 m j ; { Psquisa } R := 0 m ; for i := to n do R = ((R >> ) 0 m ) & M[T [i]]; if R & 0 m 0 m thn Casamnto na posicao i m + ; As opraçõs and, or, dslocamnto à dirita complmnto a srm ralizadas sobr o conjunto R, não podm sr ralizadas com ficiência na linguagm Pascal padrão, o qu compromt o concito d parallismo d bit. Anális: O custo do algoritmo Shift-And é O(n), dsd qu as opraçõs possam sr ralizadas m O() o padrão caiba m umas poucas palavras do computador. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Boyr-Moor-Horspool (BMH) Em 977, foi publicado o algoritmo Boyr-Moor (BM). A idéia é psquisar no padrão no sntido da dirita para a squrda, o qu torna o algoritmo muito rápido. Em 980, Horspool aprsntou uma simplificação no algoritmo original, tão ficint quanto o algoritmo original, ficando conhcida como Boyr-Moor-Horspool (BMH). Pla xtrma simplicidad d implmntação comprovada ficiência, o BMH dv sr scolhido m aplicaçõs d uso gral qu ncssitam ralizar casamnto xato d cadias. Funcionamnto do BM BMH O BM BMH psquisa o padrão P m uma janla qu dsliza ao longo do txto T. Para cada posição dsta janla, o algoritmo psquisa por um sufixo da janla qu casa com um sufixo d P, com comparaçõs ralizadas no sntido da dirita para a squrda. S não ocorrr uma dsigualdad, ntão uma ocorrência d P m T ocorru. Snão, o algoritmo calcula um dslocamnto qu o padrão dv sr dslizado para a dirita ants qu uma nova tntativa d casamnto s inici. O BM original propõ duas hurísticas para calcular o dslocamnto: ocorrência casamnto.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 BM - Hurística Ocorrência Alinha a posição no txto qu causou a colisão com o primiro caractr no padrão qu casa com l; Ex.: P ={cacbac}, T ={aabcaccacbac}. 5 6 7 8 9 0 c a c b a c a a b c a c c a c b a c c a c b a c c a c b a c c a c b a c c a c b a c A partir da posição 6, da dirita para a squrda, xist uma colisão na posição d T, ntr b do padrão c do txto. Logo, o padrão dv sr dslocado para a dirita até o primiro caractr no padrão qu casa com c. O procsso é rptido até ncontrar um casamnto a partir da posição 7 d T. BM - Hurística Casamnto Ao movr o padrão para a dirita, faça-o casar com o pdaço do txto antriormnt casado. Ex.: P ={cacbac} no txto T ={aabcaccacbac}. 5 6 7 8 9 0 c a c b a c a a b c a c c a c b a c c a c b a c c a c b a c Novamnt, a partir da posição 6, da dirita para a squrda, xist uma colisão na posição d T, ntr o b do padrão o c do txto. Nst caso, o padrão dv sr dslocado para a dirita até casar com o pdaço do txto antriormnt casado, no caso ac, dslocando o padrão posiçõs à dirita. O procsso é rptido mais uma vz o casamnto ntr P T ocorr. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Escolha da Hurística O algoritmo BM scolh a hurística qu provoca o maior dslocamnto do padrão. Esta scolha implica m ralizar uma comparação ntr dois intiros para cada caractr lido do txto, pnalizando o dsmpnho do algoritmo com rlação a tmpo d procssamnto. Várias propostas d simplificação ocorrram ao longo dos anos. As qu produzm os mlhors rsultados são as qu considram apnas a hurística ocorrência. Algoritmo Boyr-Moor-Horspool (BMH) A simplificação mais important é dvida a Horspool m 980. Excuta mais rápido do qu o algoritmo BM original. Part da obsrvação d qu qualqur caractr já lido do txto a partir do último dslocamnto pod sr usado para ndrçar a tabla d dslocamntos. Endrça a tabla com o caractr no txto corrspondnt ao último caractr do padrão.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. BMH - Tabla d Dslocamntos Para pré-computar o padrão o valor inicial d todas as ntradas na tabla d dslocamntos é fito igual a m. A sguir, apnas para os m primiros caractrs do padrão são usados para obtr os outros valors da tabla. Formalmnt, d[x] = min{jtalquj = m ( j < m&p [m j] = x)}. Ex.: Para o padrão P ={tst}, os valors d d são d[t] =, d[] =, d[s] =, todos os outros valors são iguais ao valor d P, nss caso m = 5. BMH - Implmntação procdur BMH (var T: TipoTxto ; var n: intgr; var P: TipoPadrao; var m: intgr ); { Psquisa P[..m] m T[..n] } var i, j, k : Intgr; d: array[0..maxtamalfabto] of intgr; { Pr procssamnto do padrao } for j := 0 to MaxTamAlfabto do d[ j ] : = m; for j := to m do d[ord(p[ j ] ) ] : = m j ; i := m; whil i <= n do { Psquisa } k := i ; j := m; whil (T[k] = P[ j ] ) and ( j >0) do k := k ; j := j ; if j = 0 thn writln( Casamnto na posicao :,k+:); i := i + d[ord(t[ i ] ) ] ; d[ord(t[i])] quival ao ndrço na tabla d do caractr qu stá na i-ésima posição no txto, a qual corrspond à posição do último caractr d P. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Algoritmo BMHS - Boyr-Moor-Horspool-Sunday Sunday (990) aprsntou outra simplificação important para o algoritmo BM, ficando conhcida como BMHS. Variant do BMH: ndrçar a tabla com o caractr no txto corrspondnt ao próximo caractr após o último caractr do padrão, m vz d dslocar o padrão usando o último caractr como no algoritmo BMH. Para pré-computar o padrão, o valor inicial d todas as ntradas na tabla d dslocamntos é fito igual a m +. A sguir, os m primiros caractrs do padrão são usados para obtr os outros valors da tabla. Formalmnt d[x] = min{j tal qu j = m ( j m & P [m + j] = x)}. Para o padrão P = tst, os valors d d são d[t] =, d[] =, d[s] =, todos os outros valors são iguais ao valor d P +. BMHS - Implmntação O pré-procssamnto do padrão ocorr nas duas primiras linhas do código. A fas d psquisa é constituída por um anl m qu i varia d m até n, com incrmntos d[ord(t[i+])], o qu quival ao ndrço na tabla d do caractr qu stá na i + -ésima posição no txto, a qual corrspond à posição do último caractr d P. procdur BMHS (var T: TipoTxto ; var n: intgr; var i, j, k : Intgr; var P: TipoPadrao; var m: intgr ); d: array[0..maxchar] of intgr; { Pr procssamnto do padrao } for j := 0 to MaxChar do d[ j ] : = m+; for j := to m do d[ord(p[ j ] ) ] : = m + j ; i := m; whil i <= n do { Psquisa } k := i ; j := m; whil (T[k] = P[ j ] ) and ( j >0) do k := k ; j := j ; if j = 0 thn writln( Casamnto na posicao :, k+:); i := i + d[ord(t[ i +])];
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 BH - Anális Os dois tipos d dslocamnto (ocorrência casamnto) podm sr pré-computados com bas apnas no padrão no alfabto. Assim, a complxidad d tmpo d spaço para sta fas é O(m + c). O pior caso do algoritmo é O(n + rm), ond r é igual ao númro total d casamntos, o qu torna o algoritmo inficnt quando o númro d casamntos é grand. BMH - Anális O dslocamnto ocorrência também pod sr pré-computado com bas apnas no padrão no alfabto. A complxidad d tmpo d spaço para ssa fas é O(c). Para a fas d psquisa, o pior caso do algoritmo é O(nm), o mlhor caso é O(n/m) o caso sprado é O(n/m), s c não é pquno m não é muito grand. O mlhor caso o caso médio para o algoritmo é O(n/m), um rsultado xclnt pois xcuta m tmpo sublinar. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 BMHS - Anális Na variant BMHS, su comportamnto assintótico é igual ao do algoritmo BMH. Entrtanto, os dslocamntos são mais longos (podndo sr iguais a m + ), lvando a saltos rlativamnt maiors para padrõs curtos. Por xmplo, para um padrão d tamanho m =, o dslocamnto é igual a m quando não há casamnto. Casamnto Aproximado O casamnto aproximado d cadias prmit opraçõs d insrção, substituição rtirada d caractrs do padrão. Ex.: Três ocorrências do padrão tst m qu os casos d insrção, substituição, rtirada d caractrs no padrão acontcm:. um spaço é insrido ntr o trciro quarto caractrs do padrão;. o último caractr do padrão é substituído plo caractr a;. o primiro caractr do padrão é rtirado. ts t tsta st os tsts tstam sts alunos...
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Distância d Edição É númro k d opraçõs d insrção, substituição rtirada d caractrs ncssário para transformar uma cadia x m outra cadia y. d(p, P ): distância d dição ntr duas cadias P P ; é o mnor númro d opraçõs ncssárias para convrtr P m P, ou vic vrsa. Ex.: d(tst, stnd) =, valor obtido por mio d uma rtirada do primiro t d P a insrção dos caractrs nd ao final d P. O problma do casamnto aproximado d cadias é o d ncontrar todas as ocorrências m T d cada P qu satisfaz d(p, P ) k. Casamnto Aproximado A busca aproximada só faz sntido para 0 < k < m, pois para k = m toda subcadia d comprimnto m pod sr convrtida m P por mio da substituição d m caractrs. O caso m qu k = 0 corrspond ao casamnto xato d cadias. O nívl d rro α = k/m, fornc uma mdida da fração do padrão qu pod sr altrado. Em gral α < / para a maioria dos casos d intrss. Casamnto aproximado d cadias, ou casamnto d cadias prmitindo rros: um númro limitado k d opraçõs (rros) d insrção, d substituição d rtirada é prmitido ntr P suas ocorrências m T. A psquisa com casamnto aproximado é modlado por autômato não-dtrminista. O algoritmo d casamnto aproximado d cadias usa o parallismo d bit. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 50 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Exmplo d Autômato para Casamnto Aproximado P ={tst} k = : (a)insrção; (b)substituição (c)rtirada. (a) (b) (c) t s t 0 5 t s t 0 5 t s t 0 s ε s ε ε ε ε Casamnto d caractr é rprsntado por uma arsta horizontal. Avançamos m P T. O slf-loop prmit qu uma ocorrência s inici m qualqur posição m T. s t t t 5 5 5 5 Exmplo d Autômato para Casamnto Aproximado Uma arsta vrtical insr um caractr no padrão. Avançamos m T mas não m P. t s t 0 5 Uma arsta diagonal sólida substitui um caractr. Avançamos m T P. s t s t 0 5 s t 5 Uma arsta diagonal tracjada rtira um caractr. Avançamos m P mas não m T (transição-ɛ) t s t 0 ε ε ε ε ε s t t 5 5 5
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Exmplo d Autômato para Casamnto Aproximado Shift-And para Casamnto Aproximado P ={tst} K =. As três opraçõs d distância d dição stão juntas m um único autômato: Linha : casamnto xato (k = 0); Linha : casamnto aproximado prmitindo um rro (k = ); Linha : casamnto aproximado prmitindo dois rros (k = ). 0 0 0 t s t ε ε ε ε ε t s t ε ε ε ε ε t Uma vz qu um stado no autômato stá ativo, todos os stados nas linhas sguints na msma coluna também stão ativos. s t 5 5 5 Utiliza parallismo d bit. Simula um autômato não-dtrminista. Empacota cada linha j (0 < j k) do autômato não-dtrminista m uma palavra R j difrnt do computador. Para cada novo caractr lido do txto todas as transiçõs do autômato são simuladas usando opraçõs ntr as k + máscaras d bits. Todas as k + máscaras d bits têm a msma strutura assim o msmo bit é alinhado com a msma posição no txto. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 55 Shift-And para Casamnto Aproximado Na posição i do txto, os novos valors R j, 0 < j k, são obtidos a partir dos valors corrnts R j : R 0 = ((R 0 >> ) 0 m ) & M[T [i]] R j = ((R j >> ) & M[T [i]]) R j (R j >> ) (R j >> ), ond M é a tabla do algoritmo Shift-And para casamnto xato. A psquisa inicia com R j = j 0 m j. R 0 quival ao algoritmo Shift-And para casamnto xato. As outras linhas R j rcbm s (stados ativos) também d linhas antriors. Considrando um automato para casamnto aproximado, a fórmula para R xprssa: arstas horizontais indicando casamnto; vrticais indicando insrção; diagonais chias indicando substituição; diagonais tracjadas indicando rtirada. Shif-And para Casamnto Aproximado - Implmntação Shift-And-Aproximado (P = p p... p m, T = t t... t n, k ); { Pré procssamnto } for c do M[c] := 0 m ; for j := to m do M[p j ] := M[p j ] 0 j 0 m j ; { Psquisa } for j := 0 to k do R j := j 0 m j ; for i := to n do Rant := R 0 ; Rnovo := ((Rant >> ) 0 m ) & M[T [i]]; R 0 := Rnovo; for j := to k do Rnovo := ((R j >> & M[T [i]]) Rant ((Rant Rnovo) >> ); Rant := R j ; R j := Rnovo; if Rnovo & 0 m 0 m thn Casamnto na posicao i ; As opraçõs and, or, dslocamnto à dirita complmnto, a srm ralizadas sobr o conjunto R, não podm sr ralizadas com ficiência na linguagm Pascal padrão, o qu compromt o concito d parallismo d bit.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 56 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 57 Shif-And p/ Casam. Aprox. - Exmplo Padrão: tst. Txto: os tsts tstam. Prmitindo um rro (k = ) d insrção). R 0 = (R 0 >> ) 0 m &M[T [i]] R = (R >> ) 0 m &M[T [i]] R 0 Uma ocorrência xata na posição 8 ( ) duas, prmitindo uma insrção, nas posiçõs 9 ( s, rspctivamnt). Txto (R 0 >> ) 0 m R 0 (R >> ) 0 m R o 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 a 0 0 0 0 0 0 0 0 0 0 0 m 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Shif-And p/ Casam. Aprox. - Exmplo Padrão: tst. Txto: os tsts tstam. Prmitindo um rro d insrção, um d rtirada um d substituição. R 0 = (R 0 >> ) 0 m &M[T [i]]. R = (R >> ) 0 m &M[T [i]] R 0 (R 0 >> ) (R 0 >> ). Uma ocorrência xata na posição 8 ( ) cinco, prmitindo um rro, nas posiçõs 7, 9,, 5 ( t, s,, t a, rspc.). Txto (R 0 >> ) 0 m R 0 (R >> ) 0 m R o 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s 0 0 0 0 0 0 0 0 0 0 t 0 0 0 0 0 0 0 a 0 0 0 0 0 0 0 0 m 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 58 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8. 59 Comprssão - Motivação Explosão d informação txtual disponívl on-lin: Bibliotcas digitais. Sistmas d automação d scritórios. Bancos d dados d documntos. World-Wid Wb. Somnt a Wb tm hoj bilhõs d páginas státicas disponívis. Cada bilhão d páginas ocupando aproximadamnt 0 trabyts d txto corrido. Em stmbro d 00, a máquina d busca Googl (www.googl.com.br) dizia tr mais d,5 bilhõs d páginas státicas m su banco d dados. Caractrísticas ncssárias para sistmas d rcupração d informação Métodos rcnts d comprssão têm prmitido:. Psquisar dirtamnt o txto comprimido mais rapidamnt do qu o txto original.. Obtr maior comprssão m rlação a métodos tradicionais, grando maior conomia d spaço.. Acssar dirtamnt qualqur part do txto comprimido sm ncssidad d dscomprimir todo o txto dsd o início (Moura, Navarro, Ziviani Baza-Yats, 000; Ziviani, Moura, Navarro Baza-Yats, 000). Compromisso spaço X tmpo: vncr-vncr.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 60 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Porqu Usar Comprssão Comprssão d txto - maniras d rprsntar o txto original m mnos spaço: Substituir os símbolos do txto por outros qu possam sr rprsntados usando um númro mnor d bits ou byts. Ganho obtido: o txto comprimido ocupa mnos spaço d armaznamnto mnos tmpo para sr lido do disco ou sr transmitido por um canal d comunicação para sr psquisado. Prço a pagar: custo computacional para codificar dcodificar o txto. Avanço da tcnologia: D acordo com Pattrson Hnnssy (995), m 0 anos, o tmpo d acsso a discos magnéticos tm s mantido praticamnt constant, nquanto a vlocidad d procssamnto aumntou aproximadamnt mil vzs mlhor invstir mais podr d computação m comprssão m troca d mnos spaço m disco ou mnor tmpo d transmissão. Razão d Comprssão Dfinida pla porcntagm qu o arquivo comprimido rprsnta m rlação ao tamanho do arquivo não comprimido. Exmplo: s o arquivo não comprimido possui 00 byts o arquivo comprimido rsultant possui 0 byts, ntão a razão d comprssão é d 0%. Utilizada para mdir O ganho m spaço obtido por um método d comprssão. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Outros Importants Aspctos a Considrar Além da conomia d spaço, dv-s considrar: Vlocidad d comprssão d dscomprssão. Possibilidad d ralizar casamnto d cadias dirtamnt no txto comprimido. Prmitir acsso dirto a qualqur part do txto comprimido iniciar a dscomprssão a partir da part acssada: Um sistma d rcupração d informação para grands colçõs d documntos qu stjam comprimidos ncssitam acsso dirto a qualqur ponto do txto comprimido. Comprssão d Txtos m Linguagm Natural Um dos métodos d codificação mais conhcidos é o d Huffman (95): A idéia do método é atribuir códigos mais curtos a símbolos com frqüências altas. Um código único, d tamanho variávl, é atribuído a cada símbolo difrnt do txto. As implmntaçõs tradicionais do método d Huffman considram caractrs como símbolos. Para aliar as ncssidads dos algoritmos d comprssão às ncssidads dos sistmas d rcupração d informação apontadas acima, dv-s considrar palavras como símbolos a srm codificados. Métodos d Huffman basados m caractrs comprimm o txto para aproximadamnt 60%. Métodos d Huffman basados m palavras comprimm o txto para valors pouco acima d 5%.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 65 Vantagns dos Métodos d Huffman Basados m Palavras Prmitm acsso randômico a palavras dntro do txto comprimido. Considrar palavras como símbolos significa qu a tabla d símbolos do codificador é xatamnt o vocabulário do txto. Isso prmit uma intgração natural ntr o método d comprssão o arquivo invrtido. Prmitm acssar dirtamnt qualqur part do txto comprimido sm ncssidad d dscomprimir todo o txto dsd o início. Família d Métodos d Comprssão Ziv-Lmpl Substitui uma sqüência d símbolos por um apontador para uma ocorrência antrior daqula sqüência. A comprssão é obtida porqu os apontadors ocupam mnos spaço do qu a sqüência d símbolos qu ls substitum. Os métodos Ziv-Lmpl são populars pla sua vlocidad, conomia d mmória gnralidad. Já o método d Huffman basado m palavras é muito bom quando a cadia d caractrs constitui txto m linguagm natural. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 66 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 67 Dsvantagns dos Métodos d Ziv-Lmpl para Ambint d Rcupração d Informação É ncssário iniciar a dcodificação dsd o início do arquivo comprimido Acsso randômico muito caro. É muito difícil psquisar no arquivo comprimido sm dscomprimir. Uma possívl vantagm do método Ziv-Lmpl é o fato d não sr ncsário armaznar a tabla d símbolos da manira com qu o método d Huffman prcisa. No ntanto, isso tm pouca importância m um ambint d rcupração d informação, já qu s ncssita o vocabulário do txto para criar o índic prmitir a psquisa ficint. Comprssão d Huffman Usando Palavras Técnica d comprssão mais ficaz para txtos m linguagm natural. O método considra cada palavra difrnt do txto como um símbolo. Conta suas frqüências gra um código d Huffman para as palavras. A sguir, comprim o txto substituindo cada palavra plo su código. Assim, a comprssão é ralizada m duas passadas sobr o txto:. Obtnção da frqüência d cada palavra difrnt.. Ralização da comprssão.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 68 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 69 Forma Eficint d Lidar com Palavras Sparadors Um txto m linguagm natural é constituído d palavras d sparadors. Sparadors são caractrs qu aparcm ntr palavras: spaço, vírgula, ponto, ponto vírgula, intrrogação, assim por diant. Uma forma ficint d lidar com palavras sparadors é rprsntar o spaço simpls d forma implícita no txto comprimido. Nss modlo, s uma palavra é sguida d um spaço, ntão, somnt a palavra é codificada. Snão, a palavra o sparador são codificados sparadamnt. No momnto da dcodificação, supõ-s qu um spaço simpls sgu cada palavra, a não sr qu o próximo símbolo corrsponda a um sparador. Comprssão usando codificação d Huffman Exmplo: para cada rosa rosa, uma rosa é uma rosa a) para cada rosa, c) rosa 0 0 para cada, é uma uma é b) 0 para d) cada 0 rosa 0 0, rosa para cada, é ) f) 0 6 rosa 0 0 rosa 6 uma 0 0 uma 0 0 0 para cada, é 0 0 uma uma para cada, é OBS: O algoritmo d Huffman é uma abordagm gulosa. é Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 70 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Árvor d Huffman O método d Huffman produz a árvor d codificação qu minimiza o comprimnto do arquivo comprimido. Existm divrsas árvors qu produzm a msma comprssão. Por xmplo, trocar o filho à squrda d um nó por um filho à dirita lva a uma árvor d codificação altrnativa com a msma razão d comprssão. Entrtanto, a scolha prfrncial para a maioria das aplicaçõs é a árvor canônica. Árvor d Huffman A rprsntação do código na forma d árvor facilita a visualização. Sugr métodos d codificação dcodificação triviais: Codificação: a árvor é prcorrida mitindo bits ao longo d suas arstas. Dcodificação: os bits d ntrada são usados para slcionar as arstas. Essa abordagm é inficint tanto m trmos d spaço quanto m trmos d tmpo. Uma árvor d Huffman é canônica quando a altura da subárvor à dirita d qualqur nó nunca é mnor qu a altura da subárvor à squrda.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Algoritmo Basado na Codificação Canônica com Comportamnto Linar m Tmpo Espaço O algoritmo é atribuído a Moffat Katajainn (995). Calcula os comprimntos dos códigos m lugar dos códigos propriamnt ditos. A comprssão atingida é a msma, indpndntmnt dos códigos utilizados. Após o cálculo dos comprimntos, há uma forma lgant ficint para a codificação a dcodificação. O Algoritmo A ntrada do algoritmo é um vtor A contndo as frqüências das palavras m ordm não-crscnt. Frqüências rlativas à fras xmplo: para cada rosa rosa, uma rosa é uma rosa Durant sua xcução, são utilizados divrsos vtors logicamnt distintos, mas capazs d coxistirm no msmo vtor das frqüências. O algoritmo divid-s m três fass:. Combinação dos nós.. Convrsão do vtor no conjunto das profundidads dos nós intrnos.. Calculo das profundidads dos nós folhas. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 75 Primira Fas - Combinação dos nós a) b) c) n Frqüências dos nós folhas Pso da árvor Folha Posiçõs disponívis Frqüências Prox Psos dos nós intrnos Índics pais nós intrnos Índics pais nós intrnos n Raiz A primira fas é basada m duas obsrvaçõs:. A frqüência d um nó só prcisa sr mantida até qu l sja procssado.. Não é prciso mantr apontadors para os pais dos nós folhas, pois ls podm sr infridos. Exmplo: nós intrnos nas profundidads [0,,,, ] triam nós folhas nas profundidads [,,,,, ]. n Psudocódigo para a Primira Fas function PrimiraFas (A, n); Raiz := n; Folha := n; for Prox := n downto do { Procura Posicao } if ( (nao xist Folha) or ( ( Raiz > Prox) and (A[Raiz] <= A[Folha ] ) ) ) thn { No intrno } A[Prox] : = A[Raiz ] ; A[Raiz] : = Prox; Raiz:= Raiz ; nd ls { No folha } A[Prox] : = A[Folha ] ; Folha := Folha ; { Atualiza Frquncias } if ( (nao xist Folha) or ( ( Raiz > Prox) and (A[Raiz] <= A[Folha ] ) ) ) thn { No intrno } A[Prox] : = A[Prox] + A[Raiz ] ; A[Raiz] : = Prox; Raiz := Raiz ; nd ls { No folha } A[Prox] : = A[Prox] + A[Folha ] ; Folha := Folha ;
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 76 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 77 Exmplo d procssamnto da primira fas a) b) c) d) ) f) g) h) i) j) k) 5 6 Prox Raiz Folha 6 6 0 6 6 5 5 6 6 6 6 6 5 6 5 0 0 Sgunda Fas - Convrsão do vtor no conjunto das profundidads dos nós intrnos a) b) c) Pso da árvor Índics pais nós intrnos Prox Profundidad Índics pais dos nós intrnos nós intrnos Profundidad dos nós intrnos n n n Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 78 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 79 Psudocódigo para a Sgunda Fas function SgundaFas (A, n); A[] := 0; for Prox := to n do A[Prox] : = A[A[Prox]] + ; Trcira Fas - Calculo das profundidads dos nós folhas a) n Profundidad dos nós intrnos Profundidads dos nós intrnos obtida com a sgunda fas tndo como ntrada o vtor xibido na ltra k) da transparência 65: 0 b) c) Comprimnto dos códigos Prox Posiçõs disponívis Raiz Comprimnto dos códigos n Profundidad dos nós intrnos n
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 80 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Psudocódigo para a Trcira Fas function TrciraFas (A, n); Disp := ; u := 0; h := 0; Raiz := ; Prox := ; whil Disp > 0 do whil (Raiz <= n) and (A[Raiz] = h) do u := u + ; Raiz := Raiz + whil Disp > u do A[Prox] : = h; Prox := Prox + ; Disp := Disp ; Disp := u; h := h + ; u := 0; Cálculo do comprimnto dos códigos a partir d um vrtor d frqüências function CalculaCompCodigo (A, n); A := PrimiraFas (A, n); A := SgundaFas (A, n); A := TrciraFas (A, n); Aplicando-s a Trcira Fas sobr: 0 Os comprimntos dos códigos m númro d bits são obtidos: Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Código Canônico Propridads:. Os comprimntos dos códigos obdcm ao algoritmo d Huffman.. Códigos d msmo comprimnto são intiros conscutivos. A partir dos comprimntos obtidos, o cálculo dos códigos propriamnt dito é trivial: o primiro código é composto apnas por zros, para os dmais, adiciona-s ao código antrior faz-s um dslocamnto à squrda para obtr-s o comprimnto adquado quando ncssário. Elaboração d Algoritmos Eficints para a Codificação para a Dcodificação Os algoritmos são basados na sguint obsrvação: Códigos d msmo comprimnto são intiros conscutivos. Os algoritmos são basados no uso d dois vtors com MaxCompCod lmntos,sndo MaxCompCod o comprimnto do maior código. Codificação Canônica Obtida: i Símbolo Código Canônico rosa 0 uma 0 para 00 cada 0 5, 0 6 é
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 85 Vtors Bas Offst Vtor Bas: indica, para um dado comprimnto c, o valor intiro do primiro código com ss comprimnto. O vtor Bas é calculado pla rlação: 0 s c =, Bas[c] = (Bas[c ] + w c ) caso contrário, sndo w c o númro d códigos com comprimnto c. Offst: indica o índic no vocabulário da primira palavra d cada comprimnto d código c. Vtors Bas Offst para a tabla da transparência 7: c Bas[c] Offst[c] 0 6 Psudocódigo para codificação function Codifica (Bas, Offst, i, MaxCompCod); c := ; whil ( i >= Offst [c + ] ) and (c + <= MaxCompCod ) do c := c + ; Codigo := i Offst [c] + Bas[c ] ; Obtnção do código: Parâmtros: vtors Bas Offst, índic i do símbolo (Tabla da transparência 7) a sr codificado o comprimnto MaxCompCod dos vtors Bas Offst. No anl whil é fito o cálculo do comprimnto c d código a sr utilizado. A sguir, basta sabr qual a ordm do código para o comprimnto c (i Offst[c]) somar ss valor à Bas[c]. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 86 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 87 Exmplo d Codificação Para a palavra i = ( cada ):. Vrifica-s qu é um código d comprimnto.. Vrifica-s também qu é o sgundo código com ss comprimnto.. Assim, su código é ( Offst[] + Bas[]), o qu corrspond a 0 m binário. Psudocódigo para dcodificação function Dcodifica (Bas, Offst, ArqComprimido, MaxCompCod); c := ; Codigo := LBit (ArqComprimido); whil ( Codigo << ) >= Bas[c + ]) and ( c + <= MaxCompCod ) do Codigo := (Codigo << ) or LBit (ArqComprimido); c := c + ; i := Codigo Bas[c] + Offst [c ] ; Parâmtros: vtors Bas Offst, o arquivo comprimido o comprimnto MaxCompCod dos vtors Bas Offst. Na dcodificação, o arquivo d ntrada é lido bit-a-bit, adicionando-s os bits lidos ao código comparando-o com o vtor Bas. O anl whil mostra como idntificar o código a partir d uma posição do arquivo comprimido.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 88 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 89 Exmplo d Dcodificação Dcodificação da sqüência d bits 0 : c LBit Codigo Codigo << Bas[c + ] - - 0 or = 0 0 0 0 or 0 = 0 0 0 00 or = 0 00 00 A primira linha da tabla rprsnta o stado inicial do anl whil quando já foi lido o primiro bit da sqüência, o qual foi atribuído à variávl Codigo. A linha dois sguints rprsntam a situação do anl whil após cada rspctiva itração. No caso da linha dois da tabla, o sgundo bit da sqüência foi lido (bit ) a variávl Codigo rcb o código antrior dslocado à squrda d um bit sguido da opração or com o bit lido. D poss do código, Bas Offst são usados para idntificar qual o índic i da palavra no vocabulário, sndo i = Codigo Bas[c] + Offst[c]. Psudocódigo para ralizar a comprssão function Comprssao (ArqTxto, ArqComprimido); { Primira tapa } whil not Eof (ArqTxto) do Palavra := ExtraiProximaPalavra (ArqTxto); Pos := Psquisa ( Palavra, Vocabulario ); if Pos é uma posicao valida thn Vocabulario[Pos]. Frq := Vocabulario[Pos]. Frq + ls Insr ( Palavra, Vocabulario ); { Sgunda tapa } Vocabulario := OrdnaPorFrquncia ( Vocabulario ); Vocabulario := CalculaCompCodigo ( Vocabulario, n); ConstroiVtors (Bas, Offst, ArqComprimido); Grava ( Vocabulario, ArqComprimido); LVocabulario ( Vocabulario, ArqComprimido); { Trcira tapa } PosicionaPrimiraPosicao (ArqTxto); whil not Eof (ArqTxto) do Palavra := ExtraiProximaPalavra (ArqTxto); Pos := Psquisa ( Palavra, Vocabulario ); Codigo := Codifica(Bas, Offst,Vocabulario[Pos].Ordm, MaxCompCod); Escrv (ArqComprimido, Codigo); Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 90 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Psudocódigo para ralizar a dscomprssão function Dscomprssao (ArqTxto, ArqComprimido); LrVtors (Bas, Offst, ArqComprimido); LVocabulario ( Vocabulario, ArqComprimido); whil not Eof (ArqComprimido) do i := Dcodifica (Bas, Offst, ArqComprimido, MaxCompCod); Grava ( Vocabulario[ i ], ArqTxto); Codificação d Huffman Usando Byts O método original proposto por Huffman (95) tm sido usado como um código binário. Moura, Navarro, Ziviani Baza-Yats (000) modificaram a atribuição d códigos d tal forma qu uma sqüência d byts é associada a cada palavra do txto. Consqüntmnt, o grau d cada nó passa d para 56. Essa vrsão é chamada d código d Huffman plno. Outra possibilidad é utilizar apnas 7 dos 8 bits d cada byt para a codificação, a árvor passa ntão a tr grau 8. Nss caso, o oitavo bit é usado para marcar o primiro byt do código da palavra, sndo chamado d código d Huffman com marcação.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Exmplo d Códigos Plnos com Marcação O código d Huffman com marcação ajuda na psquisa sobr o txto comprimido. Exmplo: Código plno para a palavra uma com byts 7 8 8. Código com marcação para a palavra uma com byts 75 8 8 Not qu o primiro byt é 75 = 7 + 8. Assim, no código com marcação o oitavo bit é quando o byt é o primiro do código, snão l é 0. Árvor d Huffman orintada a byts A construção da árvor d Huffman orintada a byts pod ocasionar o aparcimnto d nós intrnos não totalmnt prnchidos quando a árvor não é binária: a) Árvor inficint 56 lmntos b) Árvor ótima 5 nós vazios 56 lmntos lmntos 5 nós vazios 56 lmntos 5 lmntos Na Figura, o alfabto possui 5 símbolos (nós folhas), todos com a msma frqüência d ocorrência. O sgundo nívl tm 5 spaços vazios qu podriam sr ocupados com símbolos, mudando o comprimnto d sus códigos d para byt. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 95 Movndo Nós Vazios para Nívis mais Profundos Um mio d assgurar qu nós vazios smpr ocupm o nívl mais baixo da árvor é combiná-los com os nós d mnors frqüências. O objtivo é movê-los para o nívl mais profundo da árvor. Para isso, dvmos slcionar o númro d símbolos qu srão combinados com os nós vazios. Essa slção é dada pla quação + ((n BasNum) mod (BasNum )) No caso da Figura da transparência 8 é igual a + ((5 56) mod 55) =. Gnralização do Cálculo dos Comprimntos dos Códigos procdur CalculaCompCodigo (var A: TipoDicionario ; n: intgr ); var u, { Nos intrnos usados } h, { Altura da arvor } NoInt, { Numro d nos intrnos } Prox, Raiz, Folha, Disp, x, Rsto: intgr; if n > (BasNum ) thn Rsto := + ((n BasNum) mod (BasNum )) ls Rsto := n ; NoInt := + ((n Rsto) div (BasNum )); if Rsto < thn Rsto := BasNum; for x := (n ) downto (n Rsto + ) do A[n].Frq := { Primira Fas } A[n].Frq + A[x ].Frq; Raiz := n; Folha := n Rsto; for Prox := n downto (n NoInt + ) do { Procura Posicao } if ( ( Folha<) or ( ( Raiz>Prox) and (A[Raiz ]. Frq<=A[Folha ]. Frq))) thn { No intrno } A[Prox].Frq := A[Raiz ].Frq; A[Raiz ].Frq := Prox; Raiz := Raiz ; nd ls { No folha } A[Prox].Frq := A[Folha ].Frq; Folha := Folha ;
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 96 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 97 Gnralização do Cálculo dos Comprimntos dos Códigos Gnralização do Cálculo dos Comprimntos dos Códigos { Atualiza Frquncias } for x := to (BasNum ) do if ( (Folha<) or ( (Raiz>Prox) and (A[Raiz ]. Frq<=A[Folha ]. Frq))) thn { No intrno } A[Prox].Frq := A[Prox].Frq + A[Raiz ].Frq; A[Raiz ].Frq := Prox; Raiz := Raiz ; nd ls { No folha } A[Prox]. Frq := A[Prox]. Frq+A[Folha ]. Frq; Folha := Folha ; { Sgunda Fas } A[Prox].Frq := 0; Raiz := Prox; for Prox := Raiz + to n do A[Prox].Frq := A[A[Prox].Frq].Frq + ; { Trcira Fas } Disp := ; u := 0; h := 0; Prox := ; whil Disp > 0 do whil (Raiz <= n) and (A[Raiz ].Frq = h) do u := u + ; Raiz := Raiz + whil Disp > u do A[Prox].Frq := h; Prox := Prox + ; Disp := Disp ; if Prox > n thn u := 0; brak nd Disp := BasNum u; h := h + ; u := 0; OBS: A constant BasNum pod sr usada para trabalharmos com quaisqur bass numéricas mnors ou iguais a um byt. Por xmplo, para a codificação plna o valor é 56 para a codificação com marcação o valor é 8. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 98 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 99 Mudanças m Rlação ao Psudocódigo Aprsntado A mais snsívl stá no código insrido ants da primira fas, o qual tm como função liminar o problma causado por nós intrnos da árvor não totalmnt prnchidos. Na primira fas, as BasNum árvors d mnor custo são combinadas a cada passo, m vz d duas como no caso da codificação binária: Isso é fito plo anl for introduzido na part qu atualiza frqüências na primira fas. Codificação orintada a byts function Codifica (var VtorsBasOffst : TipoVtorsBO; Ordm: intgr; c := ; var c : intgr ; MaxCompCod: intgr ) : intgr; whil (Ordm >= VtorsBasOffst[c + ]. Offst ) and (c + <= MaxCompCod) do c := c + ; Codifica := Ordm VtorsBasOffst[c ]. Offst + VtorsBasOffst[c ].Bas; OBS: a codificação orintada a byts não rqur nnhuma altração m rlação à codificação usando bits A sgunda fas não sofr altraçõs. A trcira fas é altrada para indicar quantos nós stão disponívis m cada nívl, o qu é rprsntado pla variávl Disp.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 00 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Dcodificação orintada a byts function Dcodifica (var VtorsBasOffst : TipoVtorsBO; var ArqComprimido: TipoArqRsult; MaxCompCod: intgr ) : intgr; var c, Codigo, CodigoTmp, LogBas: intgr; LogBas := Round (Ln(BasNum)/Ln()); c := ; rad(arqcomprimido, Codigo); Codigo := Codigo 8; { rmov o bit d marcacao } whil ( ( c + ) <= MaxCompCod) and ((Codigo shl LogBas) >= VtorsBasOffst[c+].Bas) do rad(arqcomprimido, CodigoTmp); Codigo := (Codigo shl LogBas) or CodigoTmp; c := c + ; Dcodifica := Codigo VtorsBasOffst[c ].Bas + VtorsBasOffst[c ]. Offst Cálculo dos Vtors Bas Offst O cálculo do vtor Offst não rqur altração alguma. Para gnralizar o cálculo do vtor Bas, basta substituir o fator por BasNum, como na rlação abaixo: 0 s c =, Bas[c] = BasNum (Bas[c ] + w c ) caso contrário. Altraçõs:. Prmitir a litura byt a byt do arquivo comprimido, m vz d bit a bit.. O númro d bits qu dvm sr dslocados à squrda para s ncontrar o comprimnto c do código, o qual indxa os vtors Bas Offst, é dado por: log BasNum Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Construção dos vtors Bas Offst function ConstroiVtors (var VtorsBasOffst : TipoVtorsBO; var Vocabulario : TipoDicionario ; n: intgr; var ArqComprimido: TipoArqRsult ) : intgr; var Wcs: array[..maxtamvtorsbo] of intgr; i, MaxCompCod: intgr; MaxCompCod := Vocabulario[n]. Frq; for i := to MaxCompCod do Wcs[ i ] := 0; for i := to n do Wcs[Vocabulario[ i ]. Frq] : = Wcs[Vocabulario[ i ]. Frq] + ; VtorsBasOffst[Vocabulario[ i ]. Frq]. Offst := i Wcs[Vocabulario[ i ]. Frq] + ; VtorsBasOffst[].Bas := 0; for i := to MaxCompCod do VtorsBasOffst[ i ].Bas := BasNum (VtorsBasOffst[ i ].Bas + Wcs[ i ]); if VtorsBasOffst[ i ]. Offst = 0 thn VtorsBasOffst[ i ]. Offst := VtorsBasOffst[ i ].Offst { Salvar as tablas m disco } GravaNumInt (ArqComprimido, MaxCompCod); for i := to MaxCompCod do GravaNumInt(ArqComprimido, VtorsBasOffst[ i ].Bas); GravaNumInt(ArqComprimido, VtorsBasOffst[ i ]. Offst ); ConstroiVtors := MaxCompCod; Procdimntos para lr para scrvr númros intiros m um arquivo d byts function LNumInt (var ArqComprimido: TipoArqRsult ) : intgr; var i, Num, NumRsp: intgr; NumRsp := 0; for i := sizof ( intgr) downto 0 do rad (ArqComprimido, Num) ; Num := Num shl ( i 8); NumRsp := NumRsp or Num; LNumInt := NumRsp; procdur GravaNumInt (var ArqComprimido: TipoArqRsult ; Num: intgr ); var i : intgr; for i := sizof ( intgr) downto 0 do writ (ArqComprimido, Num shr ( i 8)); O procdimnto GravaNumInt grava no disco cada byt (da squrda para a dirita) do númro intiro passado como parâmtro. O procdimnto LNumInt lê do disco cada byt d um númro intiro o rcompõ.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 05 O Por Quê da Existência d LNumInt GravaNumInt São ncssários m razão d a variávl ArqComprimido, passada como parâmtro, tr sido dclarada no programa principal como um arquivo d byts. Isso faz com qu o procdimnto writ (rad) do Pascal scrva (lia) do disco o byt mais à dirita do númro. Por xmplo, considr o númro 00 rprsntado m byts, como mostrado na Figura abaixo. Caso foss utilizado o procdimnto writ, sria gravado o númro m disco, qu é o númro rprsntado no byt mais à dirita. Um problma análogo ocorr ao s utlizar o procdimnto rad para lr do disco um númro intiro rprsntado m mais d um byt. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Byt 0 Byt Byt Byt Extração do próximo símbolo a sr codificado procdur DfinAlfabto (var Alfabto : TipoAlfabto ; var Simbolos: String [MaxAlfabto] ; i : intgr; var ArqAlf : txt ); { Os Simbolos dvm star juntos m uma linha no arquivo } for i := 0 to MaxAlfabto do Alfabto [ i ] : = fals ; radln(arqalf, Simbolos); for i := to lngth(simbolos) do Alfabto [ord(simbolos[ i ])+7] := tru; Alfabto [0] := fals ; { caractr d codigo zro : sparador } OBS: O procdimnto DfinAlfabto lê d um arquivo alfabto.txt todos o caractrs qu srão utilizados para compor palavras. function ExtraiProximaPalavra (var Indic : intgr; var FimPalavra, Aux: boolan; FimPalavra := Fals; Aux := Fals; Rsult := ; if Indic = Lngth(Linha) thn var Linha : String ; var ArqTxt : txt ; var Alfabto : TipoAlfabto ): TipoPalavra; Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 06 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 07 Extração do próximo símbolo a sr codificado if of(arqtxt) thn Linha := char (0); FimPalavra := Tru nd ls radln ( ArqTxt, Linha); { Coloca o caractr d fim d linha m Linha } Linha := Linha + char(0) + char(0); Indic := whil ( Indic <= lngth ( Linha ) ) and not FimPalavra do if Alfabto [ord ( Linha[ Indic]) + 7] thn Rsult := Rsult + Linha[ Indic ] ; Aux := tru; nd ls if Aux thn if Linha[ Indic]<>char(0) thn Indic:=Indic nd ls Rsult := Rsult + Linha[ Indic ] ; FimPalavra := Tru; Indic := Indic + ; Código para Fazr a Comprssão O Código para fazr a comprssão é dividio m três tapas:. Na primira, as palavras são xtraídas do txto a sr comprimido suas rspctivas frqüências são contabilizadas.. Na sgunda, são grados os vtors Bas Offst, os quais são gravados no arquivo comprimido sguidamnt do vocabulário. Para dlimitar os símbolos do vocabulário no disco, cada um dls é sparado plo caractr zro.. Na trcira, o arquivo txto é prcorrido pla sgunda vz, sndo sus símbolos novamnt xtraídos, codificados gravados no arquivo comprimido.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 08 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 09 Código para Fazr a Comprssão Primira tapa da comprssão procdur Comprssao (var ArqTxt, ArqAlf : txt ; var ArqComprimido: TipoArqRsult); var Alfabto : TipoAlfabto ; Palavra, Linha : TipoPalavra; Ind, MaxCompCod: intgr ; Vocabulario : TipoDicionario ; p: TipoPsos; VtorsBasOffst : TipoVtorsBO; { L alfabto dfinido m arquivo } DfinAlfabto(Alfabto, ArqAlf ); Ind := 0; Linha := ; { Inicializacao do Vocabulario } Inicializa ( Vocabulario ); GraPsos (p); { Inicio da Comprssao } PrimiraEtapa ( ArqTxt, Alfabto, Ind, Palavra, Linha, Vocabulario, p); MaxCompCod := SgundaEtapa ( Vocabulario, VtorsBasOffst, p, ArqComprimido); { Coloca o cursor d litura no inicio do arquivo} Sk (ArqTxt, 0); Ind := 0; Linha := ; TrciraEtapa ( ArqTxt, Alfabto, Ind, Palavra, Linha, Vocabulario, p, VtorsBasOffst, ArqComprimido, MaxCompCod); procdur PrimiraEtapa (var ArqTxt : txt ;var Alfabto : TipoAlfabto ; var Indic : intgr ; var Palavra, Linha: String ; var Vocabulario : TipoDicionario ; p: TipoPsos); var Elmnto: TipoItm; i : intgr; rpat Palavra := ExtraiProximaPalavra ( Indic,Linha,ArqTxt, Alfabto ); Elmnto.Chav := Palavra + char(0); Elmnto.Frq := ; if Palavra <> thn i := Psquisa (Elmnto.Chav, p, Vocabulario ); if i < M thn Vocabulario[ i ].Frq := Vocabulario[ i ].Frq + ls Insr (Elmnto, p, Vocabulario ); rpat Palavra:=ExtraiProximaPalavra ( Indic,Linha,ArqTxt, Alfabto ); Elmnto.Chav := Palavra + char(0); { O primiro spaco dpois da palavra nao codificado } if (Trim ( Palavra) <> ) and (Trim ( Palavra) <> char(0)) thn i := Psquisa (Elmnto.Chav, p, Vocabulario ); if i < M thn Vocabulario[ i ].Frq := Vocabulario[ i ].Frq + ls Insr (Elmnto, p, Vocabulario ); nd until Trim ( Palavra) = ; nd until Palavra = ; Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Sgunda tapa da comprssão Sgunda tapa da comprssão function SgundaEtapa (var Vocabulario : TipoDicionario ; var VtorsBasOffst : TipoVtorsBO; var p: TipoPsos; var ArqComprimido: TipoArqRsult ) : intgr; var i, j, NumNodosFolhas, PosArq: intgr ; Ch: Char; Elmnto: TipoItm ; Palavra : TipoPalavra; NumNodosFolhas := OrdnaPorFrquncia ( Vocabulario ); CalculaCompCodigo ( Vocabulario, NumNodosFolhas); SgundaEtapa := ConstroiVtors (VtorsBasOffst, Vocabulario, NumNodosFolhas, ArqComprimido); { Grava Vocabulario } GravaNumInt (ArqComprimido, NumNodosFolhas); PosArq := FilPos(ArqComprimido); for i := to NumNodosFolhas do j := ; whil Vocabulario[ i ].Chav[ j ] <> char(0) do writ(arqcomprimido, Byt(Vocabulario[ i ].Chav[ j ] ) ) ; j := j + ; writ(arqcomprimido, Byt(char(0))); { L rconstroi a condicao d hash no vtor contndo vocabulario } Sk(ArqComprimido, PosArq) ; Inicializa ( Vocabulario ); for i := to NumNodosFolhas do Palavra := ; rpat rad(arqcomprimido, Byt(Ch) ) ; if Ch <> char(0) thn Palavra := Palavra + Ch; until Ch = char(0); Elmnto.Chav := Palavra + char(0); Elmnto.Ordm := i ; j := Psquisa (Elmnto.Chav, p, Vocabulario ); if j >= M thn Insr (Elmnto, p, Vocabulario );
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Função para ordnar o vocabulário por frqüência O objtivo dssa função é ordnar in situ o vtor Vocabulario, utilizando a própria tabla hash. Para isso, os símbolos do vtor Vocabulario são copiados para as posiçõs d a n no próprio vtor (n é o númro d símbolos prsnts no vocabulário) ordnados d forma não crscnt por suas rspctivas frqüências d ocorrência. O algoritmo d ordnação usado foi o Quicksort altrado para:. Rcbr como parâmtro uma variávl dfinida como TipoDicionario.. Mudar a condição d ordnação para não crscnt.. Fazr com qu a chav d ordnação sja o campo qu rprsnta as frqüências dos símbolos no arquivo txto. Função para ordnar o vocabulário por frqüência function OrdnaPorFrquncia(var Vocabulario: TipoDicionario ): Indic ; var i, n: Indic ; Itm : TipoItm; n := ; Itm := Vocabulario[]; for i := 0 to M do if Vocabulario[ i ].Chav <> Vazio thn if i <> thn Vocabulario[n] : = Vocabulario[ i ] ; n := n + ; if Itm.Chav <> Vazio thn Vocabulario[n] : = Itm ls n := n ; Quicksort ( Vocabulario, n); OrdnaPorFrquncia := n; A função OrdnaPorFrquncia rtorna o númro d símbolos prsnts no vocabulário. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 5 Trcira tapa da comprssão Procdimnto Escrv procdur TrciraEtapa(var ArqTxt : txt ; var Alfabto : TipoAlfabto ; var Indic : intgr ; var Palavra,Linha : String ; var Vocabulario: TipoDicionario ;var p:tipopsos; var VtorsBasOffst : TipoVtorsBO; var ArqComprimido: TipoArqRsult; MaxCompCod: intgr ); var Pos: Apontador; Chav: TipoChav; Codigo, c : intgr; rpat Palavra := ExtraiProximaPalavra ( Indic,Linha,ArqTxt, Alfabto ); Chav := Palavra + char(0); if Palavra <> thn Pos := Psquisa (Chav, p, Vocabulario ); Codigo := Codifica (VtorsBasOffst, Vocabulario[Pos].Ordm, c, MaxCompCod); Escrv(ArqComprimido, Codigo, c); rpat Palavra:=ExtraiProximaPalavra(Indic,Linha,ArqTxt, Alfabto ); { O primiro spaco dpois da palavra nao codificado } if (Trim ( Palavra) <> ) and (Trim ( Palavra) <> char(0)) thn Chav := Palavra + char(0); Pos := Psquisa (Chav, p, Vocabulario ); Codigo:=Codifica(VtorsBasOffst, Vocabulario[Pos].Ordm,c, MaxCompCod); Escrv(ArqComprimido, Codigo, c); until Trim ( Palavra) = ; nd until Palavra = ; O procdimnto Escrv rcb o código su comprimnto c. O código é rprsntado por um intiro, o qu limita su comprimnto a, no máximo, byts m um compilador qu usa byts para rprsntar intiros. Primiramnt, o procdimnto Escrv xtrai o primiro byt coloca a marcação no oitavo bit fazndo uma opração or do byt com a constant 8 (qu m hxadcimal é 80.) Ess byt é ntão colocado na primira posição do vtor Saida. No anl whil, caso o comprimnto c do código sja maior do qu um, os dmais byts são xtraídos armaznados m Saida[i], m qu i c. Por fim, o vtor d byts Saida é gravado m disco no anl for.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 7 Implmntação do Procdimnto Escrv Dscrição do Código para Fazr a Dscomprssão procdur Escrv (var ArqComprimido: TipoArqRsult; var Codigo, c : intgr ); var Saida: array[..maxtamvtorsbo] of byt; i, ctmp: intgr; i := ; ctmp := c; Saida[ i ] : = (Codigo shr ( 8 (c ) c + )) or $80; i := i + ; c := c ; whil c > 0 do Saida[ i ] : = Codigo shr ( 8 (c ) c + ); i := i + ; c := c ; for i := to ctmp do writ(arqcomprimido, Saida[ i ] ) ; O primiro passo é rcuprar o modlo usado na comprssão. Para isso, lê o alfabto, o vtor Bas, o vtor Offst o vtor Vocabulario. Em sguida, inicia a dcodificação, tomando o cuidado d adicionar um spaço m branco ntr dois símbolos qu sjam palavras. O procsso d dcodificação trmina quando o arquivo comprimido é totalmnt prcorrido. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 9 Código para Fazr a Dscomprssão procdur Dscomprssao (var ArqComprimido: TipoArqRsult; var Alfabto : TipoAlfabto ; Ind, MaxCompCod: intgr; Vocabulario : TipoVtorPalavra; VtorsBasOffst : TipoVtorsBO; PalavraAnt : TipoPalavra; var ArqTxt, ArqAlf : txt ); DfinAlfabto ( Alfabto, ArqAlf ) ; { L alfabto m arquivo } MaxCompCod := LVtors (ArqComprimido, VtorsBasOffst); LVocabulario (ArqComprimido, Vocabulario ); Ind := Dcodifica (VtorsBasOffst, ArqComprimido, MaxCompCod); writ ( ArqTxt, Vocabulario[ Ind ] ) ; whil not Eof (ArqComprimido) do Ind := Dcodifica (VtorsBasOffst, ArqComprimido, MaxCompCod); if ( Alfabto [Ord(Vocabulario [ Ind][]) + 7]) and (PalavraAnt[] <> char(0)) thn writ (ArqTxt, ); PalavraAnt := Vocabulario [ Ind ] ; writ ( ArqTxt, Vocabulario[ Ind ] ) ; OBS: Obsrv qu na dscomprssão, o vocabuário é rprsntado por um vtor d símbolos do tipo TipoVtorPalavra. Procdimntos auxiliars da dscomprssão function LVtors (var ArqComprimido: TipoArqRsult; var MaxCompCod, i : intgr; var VtorsBasOffst : TipoVtorsBO) : intgr; MaxCompCod := LNumInt (ArqComprimido); for i := to MaxCompCod do VtorsBasOffst[ i ].Bas := LNumInt (ArqComprimido); VtorsBasOffst[ i ]. Offst := LNumInt (ArqComprimido); LVtors := MaxCompCod; function LVocabulario (var ArqComprimido: TipoArqRsult; var Vocabulario : TipoVtorPalavra ) : intgr; var NumNodosFolhas, i : intgr ; Palavra : TipoPalavra ; Ch: Char; NumNodosFolhas := LNumInt (ArqComprimido); for i := to NumNodosFolhas do Palavra := ; rpat rad(arqcomprimido, Byt (Ch) ) ; if Ch <> char(0) { As palavras stao sparadas plo caratr 0 } thn Palavra := Palavra + Ch; until Ch = char(0); Vocabulario[ i ] : = Palavra; LVocabulario := NumNodosFolhas;
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8.. Rsultados Exprimntais Mostram qu não xist grand dgradação na razão d comprssão na utilização d byts m vz d bits na codificação das palavras d um vocabulário. Por outro lado, tanto a dscomprssão quanto a psquisa são muito mais rápidas com uma codificação d Huffman usando byts do qu uma codificação d Huffman usando bits, isso porqu dslocamntos d bits opraçõs usando máscaras não são ncssárias. Rsultados Exprimntais - Comparação das técnicas d comprssão sobr o arquivo WSJ Método Razão d Tmpo (min) d Tmpo (min) d Comprssão Comprssão Dscomprssão Huffman binário 7, 8,77,08 Huffman plno 0,60 8,67,95 Huffman com marcação,70 8,90,0 Gzip 7,5 5,,68 Comprss,9 7,60 6,78 Dados sobr a colção usada nos xprimntos: Txto Vocabulário Vocab./Txto Tam (byts) #Palavras Tam (byts) #Palavras Tamanho #Palavras 6.757.55.70.50.59. 08.005 0,59% 0,8% Os xprimntos foram ralizados m uma máquina PC Pntium d 00 MHz com 8 mgabyts d RAM. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Psquisa m Txto Comprimido Uma das propridads mais atrants do método d Huffman usando byts m vz d bits é qu o txto comprimido pod sr psquisado xatamnt como qualqur txto não comprimido. Basta comprimir o padrão ralizar uma psquisa dirtamnt no arquivo comprimido. Isso é possívl porqu o código d Huffman usa byts m vz d bits; d outra manira, o método sria complicado ou msmo impossívl d sr implmntado. Casamnto Exato Algoritmo: Buscar a palavra no vocabulário, podndo usar busca binária nsta fas: S a palavra for localizada no vocabulário, ntão o código d Huffman com marcação é obtido. Snão a palavra não xist no txto comprimido. A sguir, o código é psquisado no txto comprimido usando qualqur algoritmo para casamnto xato d padrão. Para psquisar um padrão contndo mais d uma palavra, o primiro passo é vrificar a xistência d cada palavra do padrão no vocabulário obtr o su código: S qualqur das palavras do padrão não xistir no vocabulário, ntão o padrão não xistirá no txto comprimido. Snão basta coltar todos os códigos obtidos ralizar a psquisa no txto comprimido.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 5 Procdimnto para ralizar busca no arquivo comprimido Procdimnto para atribuir o código ao padrão procdur Busca (var ArqComprimido: TipoArqRsult ; var ArqAlf : txt ); var Alfabto : TipoAlfabto ; Vocabulario : TipoVtorPalavra; VtorsBasOffst : TipoVtorsBO; PalavraAnt, p: TipoPalavra; T: TipoTxto ; Padrao: TipoPadrao; Ind, Codigo, MaxCompCod, c, Ord, NumNodosFolhas, n: intgr; {L o alfabto dfinido m arquivo} DfinAlfabto ( Alfabto, ArqAlf ); MaxCompCod := LVtors (ArqComprimido, VtorsBasOffst); NumNodosFolhas := LVocabulario (ArqComprimido, Vocabulario ); n := ; whil not Eof (ArqComprimido) do rad(arqcomprimido, Byt(T[n ] ) ) ; n := n + rpat writ( Padrao: ) ; radln(p); for Ind := to NumNodosFolhas do if Vocabulario [ Ind ] = p thn Ord := Ind ; Codigo := Codifica (VtorsBasOffst, Ord, c, MaxCompCod); Atribui (Padrao, Codigo, c); BMH (T, n, Padrao, c); until p = s ; procdur Atribui (var P: TipoPadrao; Codigo, c : intgr ); var i, ctmp: intgr; i := ; ctmp := c; P[ i ] : = Char((Codigo shr ( 8 (c ) c + )) or $80); i := i + ; c := c ; whil c > 0 do P[ i ] : = Char(Codigo shr ( 8 (c ) c + )); i := i + ; c := c ; Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 6 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 7 Programa para tst dos algoritmos d comprssão, dscomprssão busca xata m txto comprimido Programa para tst dos algoritmos d comprssão, dscomprssão busca xata m txto comprimido program huffman; { Entram aqui os tipos do Programa 5.6 } { Entram aqui os tipos do Programa 8. } const BasNum = 8; { Bas numrica qu o algoritmo trabalha } MaxAlfabto = 55; { Constant utilizada m ExtraiProximaPalavra } MaxTamVtorsBO = 0; typ TipoAlfabto = array [ 0..MaxAlfabto] of boolan; TipoBasOffst = rcord Bas : intgr; Offst : intgr; TipoVtorsBO = array [..MaxTamVtorsBO] of TipoBasOffst; TipoArqRsult = Fil of Byt; TipoPalavra = String[55]; TipoVtorPalavra= array[..m] of TipoPalavra; { Entra aqui o procdimnto GraPso do Programa 5. } { Entra aqui a função d transformação do Programa 5. } { Entram aqui os opradors aprsntados no Programa 5.7 } { Entram aqui os procdimntos Particao } { Quicksort dos Programas.6.7 } var ArqTxt, ArqAlf : txt ; ArqComprimido: TipoArqRsult; NomArqTxt, Opcao, NomArqComp: TipoPalavra; writln ( ); writln ( Opcos ); writln ( ); writln ( (c) Comprssao ); writln ( (d) Dscomprssao ); writln ( (p) Psquisa no txto comprimido ); writln ( ); writ ( Opcao: ) ; radln (Opcao); Assign ( ArqAlf, alfabto. txt ) ; rst ( ArqAlf );
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 8 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 9 Programa para tst dos algoritmos d comprssão, dscomprssão busca xata m txto comprimido nd. if Opcao = c thn writ ( Arquivo txto a sr comprimido: ) ; radln (NomArqTxt); writ ( Arquivo comprimido a sr grado: );radln (NomArqComp); Assign ( ArqTxt, NomArqTxt);Assign (ArqComprimido, NomArqComp); rst ( ArqTxt ) ; Rwrit (ArqComprimido); Comprssao ( ArqTxt, ArqAlf, ArqComprimido); clos ( ArqTxt ) ; clos (ArqComprimido); nd ls if Opcao = d thn writ ( Arquivo comprimido a sr dscomprimido: ); radln (NomArqComp); writ ( Arquivo txto a sr grado: ); radln (NomArqTxt) ; Assign ( ArqTxt, NomArqTxt); Assign (ArqComprimido, NomArqComp) ; Rwrit ( ArqTxt); Rst (ArqComprimido); Dscomprssao (ArqComprimido, ArqTxt, ArqAlf ); clos ( ArqTxt ) ; clos (ArqComprimido); nd ls if Opcao = p clos ( ArqAlf ); thn writ ( Arquivo comprimido para sr psquisado: ); radln (NomArqComp); Assign (ArqComprimido, NomArqComp); rst (ArqComprimido) ; Busca (ArqComprimido, ArqAlf ); clos (ArqComprimido); Casamnto Aproximado Algoritmo: Psquisar o padrão no vocabulário. Nst caso, podmos tr: Casamnto xato, o qual pod sr uma psquisa binária no vocabulário, uma vz qu a palavra tnha sido ncontrada a folha corrspondnt na árvor d Huffman é marcada. Casamnto aproximado, o qual pod sr ralizado por mio d psquisa sqüncial no vocabulário, usando o algoritmo Shift-And. Nst caso, várias palavras do vocabulário podm sr ncontradas a folha corrspondnt a cada uma na árvor d Huffman é marcada. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 0 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Casamnto Aproximado Algoritmo (Continuação): A sguir, o arquivo comprimido é lido byt a byt, ao msmo tmpo qu a árvor d dcodificação d Huffman é prcorrida sincronizadamnt. Ao atingir uma folha da árvor: s la stivr marcada, ntão xist casamnto com a palavra do padrão. Esquma gral d psquisa para a palavra uma prmitindo rro ama puma uma umas Sja uma folha marcada ou não, o caminhamnto na árvor volta à raiz ao msmo tmpo qu a litura do txto comprimido continua.
Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Casamnto Aproximado Usando uma Fras como Padrão Fras: sqüência d padrõs (palavras), m qu cada padrão pod sr dsd uma palavra simpls até uma xprssão rgular complxa prmitindo rros. Pré-Procssamnto: S uma fras tm j palavras, ntão uma máscara d j bits é colocada junto a cada palavra do vocabulário (folha da árvor d Huffman). Para uma palavra x da fras, o i-ésimo bit da máscara é fito igual a s x é a i-ésima palavra da fras. Assim, cada palavra i da fras é psquisada no vocabulário a i-ésima posição da máscara é marcada quando a palavra é ncontrada no vocabulário. Casamnto Aproximado Usando uma Fras como Padrão Litura do Txto Comprimido: O stado da psquisa é controlado por um autômato finito não-dtrminista d j + stados. O autômato prmit movr do stado i para o stado i + smpr qu a i-ésima palavra da fras é rconhcida. O stado zro stá smpr ativo uma ocorrência é rlatada quando o stado j é ativado. Os byts do txto comprimido são lidos a árvor d Huffman é prcorrida como ants. Cada vz qu uma folha da árvor é atingida, sua máscara d bits é nviada para o autômato. Um stado ativo i irá ativar o stado i apnas s o i-ésimo bit da máscara stivr ativo. Consqüntmnt, o autômato raliza uma transição para cada palavra do txto. Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 Projto d Algoritmos Cap.8 Procssamnto d Cadias d Caractrs Sção 8..5 5 Esquma gral d psquisa para a fras uma ro* rosa Tmpos d psquisa (m sgundos) para o arquivo WSJ, com intrvalo d confiança d 99% rosa 0 roupa 00 azul 000 uma 00 XXX XX XX XX Algoritmo k = 0 k = k = k = Agrp,8 ± 0,8 7,9 ± 0, 6, ± 0, 7,6 ± 0,6 Psquisa dirta, ± 0,8 5,0 ± 0, 7,0 ± 0,7,7 ±, Psquisa com autômato, ± 0,09, ± 0,,7 ± 0, 5,0 ± 0,9 rosas 0 O autômato pod sr implmntado ficintmnt por mio do algoritmo Shift-And Sparadors podm sr ignorados na psquisa d frass. Da msma manira, os artigos, prposiçõs tc., também podm sr ignorados s for convnint. Nst caso, basta ignorar as folhas corrspondnts na árvor d Huffman quando a psquisa chga a las. Esta possibilidad é raro ncontrar m sistmas d psquisa on-lin.