Você está na página 1de 102

INSTITUTO

DE

ALGORITMOS

Maria

das

CIÊNCIAS

MATEMÁTICAS

DE

BUSCA

EM

Graças

Volpe

TEXTO

Nunes

UNIVERSIDADE

DE

SÃO

CARLOS

SÃO

-

BRASIL

SÃO

PAULO

DE

GsPl

o

PÓS-GRADUAÇÃO:

SÃO

CARLOS

PAULO

q

TETRA EA RES AS Ero

EINE DA SAFE VENTA

e 1 MSC

1

ni

3 Ud

ATER o

a

-

ALGORITMOS

Marcia

das

DE

Graças

Orientadora:

Dissertação

de Ciências

los,

ra

a

da

Carolina.

Monard

ao

de

Instituto

São

Car-

de

São Paulo,

do Título de Mestre

pa-

em

Computação e Estatística

BUSCA EM

Volpe

TEXTO

Nunes

Proga.

Dra.

Mamxcia

apresentada

Matemáticas

Universidade

obtenção

de

Ciências

São Carlos

1984

À

meus

país

Guilherme

e

Ernesta,

('Tn

Memonian')

Ão

Wagnen,

Aos

meus

Dedico

irmaos,

este trabalho.

Resumo

Este trabalho tem por objetivo apresentar e

anali-

sar os

algoritmos

que

realizam buscas

de

textos, bem como identificar,

entre eles,

dos para determinadas

circunstâncias

sob

cadeias

de

caracteres em

os

algoritmos

apropria

as quais

este

procedi-

mento se fizer necessário. Os métodos de busca em texto podem ser divididos em

se

dois

nal;

da cadeia procurada são utilizadas para a busca.

no primeiro,

a busca

é

feita sobre o texto

origi-

e

grupos:

no segundo,

uma versão

prê-processada

do texto original

Do primeiro

Aho

é

analisamos

o

de

grupo,

apresentamos

e

o algo

Boyer

ritmo

Simples,

e

O

de

o algoritmo de Knuth,

Corasick.

Morris e Pratt,

e

lo

to e à cadeia procurada para encontrar a primeira ou todas

ocorrências de uma cadeia no texto.

Moore

O segundo grupo ê

assinaturas

representado

pe

Metodo

de Harrison que

utiliza

associadas

ao tex-

as

Experiências

foram realizadas

dos e a análise dos resultados

obtidos é

com os

algoritmos cita

apresentada.

Abstract

In this work we describe and analyse some algorithms

for text

searching. Text searching can be divided in two groups: without

pre-processing and with pre-processing of the original text

well as the search string.

as

On the

first group we

analyse the naive

algorithm,

the Knuth-Morris-Pratt algorithm, the Boyer-Moore algorithm and

the

Aho-Corasick

pattern matching

machines.

On the second group we describe Harrison's method

Several signature functions are

wich uses signature discussed.

functions.

in different

Experimental results

for the

behavior of the

algorithms

alphabets

and in which circunstances the algorithms

should be used

conclude

our

work.

Tndíice

ar

cl

DR RNA. 01

aaa

04

04

Introdução

Capítulo

1

c.ccc

1.0 - Introdução

1.1

1.1

1.3

-

Altgonrnitmo

ceara

CSSea

Simples

rea.e 06

(KMP)

(ol.

08

c.cc00.0

ra.

eaea 12

- Algoritmo Menor Frequência

-

Atgormitmo

1.3.1.

-

1.3.2 -

2

de

Knuth-Mornis-Pratt

o

oca

da

Tabela prox

Exemplo

Construçao

Capítulo

2.1 -

ea

Atgonitmo

de

Boyexr-Moore

(BM)

2.1.1 Exemplo

-

2.1.2 Construção

-

cceaaa.

das

Tabetas

deltal

e delta2

Aa.

16

20

23

2.1.3 Atgornitmo

-

(BMS)

de

Boyer-Moore

Simpeigicado.

Locaaaa.

AAA.

27

Tee 30

Capítulo 3 ea. Vereerae.

Capítulo

4

cio

de

AAA

41

472

Ne aa 46

cccce

ll

ao.

53

54

PN

i

4,0

-

Introdução

4.1

-

Atgomitmo

de

4.1.1 -

4.1.2 -

4.1.3

-

4.1.4 -

ccccc0.o

Aho-Comasiek

i

o.

das

e de

aaa.

Funções

Transição,

Saída

dos

ALgormeutmos

LL

Função

de

Falha

ExempLo

Construção

de

Falha

Complexidade

Eliminação

da

Capítulo

5

5.0 Tntrodução

-

5.1 -

O

Metodo de

coco

HaRAison

Lo

rea

ico

ss

60

eee. 261]

5.1.1

5.1.2

-

-

5.1,3 -

À

À

Escolha

Escolha

Resultados

dos

da

Parxametros

Função

Hash

Experimentais

w

h

e

R

cccv.c.oo

e

voce,

cccccc

v

ao.

apítulto

6

Concldus 00s

e

e

*.

e.e.oo

s.

+

e

e

ee

eo

oe

o

o

eo

os

e

eos.

*

*

+

e

AAA

ADLLOGRABÃA

Pendice

venue aaa

VARA.

AAA.

coca

65

65

68

74

63

86

.

Introdução

O problema de detetar

a

(não)

ocorrência

de uma

ou

várias cadeias de caracteres num texto caracteriza uma parte im--

portante

de muitos

tos

como edição de

problemas

relacionados

a

processamento

de tex

textos,

recuperação de informações,

manipula-

ção de símbolos e pesquisa bibliográfica,

Desde

que

o texto pes-

quisado pode

ser extremamente

grande - talvez centenas

de

milha

res de caracteres - torna-se essencial

utilizar técnicas eficien

tes para localizar

rapidamente

a primeira ou todas as

Oocorrên-

cias das

cadeias

desejadas

no texto.

Dividimos os

métodos

conhecidos

em dois grupos

que

se distinguem principalmente

to pesquisado. Num primeiro grupo, colocamos os algoritmos que

realizam à busca sobre o texto original. Ainda dentro deste gru-

pela maneira de se considerar o tex

po, pode-se diferenciar os

algoritmos que

fazem a busca

comparan

do os caracteres do texto com os da cadeia, da esquerda para a

direita, .a partir do primeiro caractere da cadeia,

daqueles

esta pesquisa é feita da direita para a esquerda,

a partir

. timo caractere

da cadeia. Entre os

primeiramente

citados

em que

do

Gl

encon-

tramese: o algoritmo

casos

Simples,

ê

procedimento

o

mais

natural

eficiente

que

e

O

para a solução do problema

na maioria dos

mostrou-se

de

Knuth,

menos

e o algoritmo

Morris

e Pratt (KMP)

que elimina todo oO retrocesso inerente ao algoritmo

seja,

vez.

O algoritmo

do das comparações entre

um caractere

Símples,

ou

uma

do texto não é inspecionado mais do que

de Boyer

e Moore

cadeia e

texto e

(BM)

inverte o

senti-

com isso diminue o nú-

mero de

comparações

entre

caracteres

necessárias.

Um estudo sobre os

algoritmos

deste primeiro

grupo

revela a superioridade do algoritmo BM

sobre os

demais

além

da

pequena vantagem do algoritmo KMP sobre o algoritmo

Simples.

Enquanto

os

algoritmos

citados procuram a

primeira

todas as

e

ocorrências

[(MRC)

de uma única cadeia no texto,

simultaneamente

numa

máquina

ocorrências

ou

Aho

o método

de

Corasick

realiza

baseado

esta tarefa para um

finito

que

conjunto de cadeias,

deteta

de estado

no texto todas

de cada cadeia do conjunto.

Num

segundo

grupo

destacamos os algoritmos que rea-

liz

tex

ra

ram prê-processamento do texto original,

transformando-o

to

compactado

sobre

o qual

a busca

é

realizada

de

uma

num

manei-

mais

rápida e

determinística.

O Método

de Harrison é represen

tante deste grupo é utiliza O conceito de assinaturas

associa-

das

ao texto e à cadeia procurada para compactar e pesquisar

o

texto.

Duas

funções

distintas que determinam a assinatura

adota-

da

são

amplamente

testadas e os resultados obtidos são apresenta

dos.

 

Nos quatro

primeiros

capítulos,

apresentamos

os

al-

goritmos

pertencentes

ao primeiro grupo de métodos.

 

No Capítulo | introduzimos os algoritmos Simples e

uma versão modificada que utiliza informações sobre caracteres no

texto e o algoritmo

Destacamos no Capítulo 2, devido a sua importante

KMP,

inovação

no sentido das

comparações

efetuadas,

o algoritmo BM

e

uma! versão simplificada,

BMS.

No Capítulo

3

fazemos

um estudo

comparativo

dos al-

goritmos

acima citados,

através de análises

de resultados experi

mentais, Tomamos

como

medida

de eficiência o número de

compara-

çõe S

realizadas entre

caracteres

do texto e da cadeia. Tarbêém ana

-

02

-

SC

lisamos

escrito,

a influencia realizando os

do

guês e Centenário.

A máquina

tamanho

do

experimentos

alfabeto

sob

sobre textos

o qual

o

Binário,

reconhecedora

de cadeia de Aho

e

texto é

Portu-

Corasick

ê

apresentada

no Capítulo

4,

Harrison,

bêm são

O

Capítulo

5

é

dedicado

ao es tudo

do

representante do segundo grupo de métodos,

Método

onde

analisados

os resultados

experimentais obtidos.

de

tam-

Finalmente,

clusoes finais.

no Capítulo 6, apresentamos nossas con-

Apêndice.

Os

algoritmos

programados

em Pascal encontram-se no

A notação

adotada neste trabalho . segue

o seguinte

critério:

texto

pesquisado e n>0

é

é

o vetor de caracteres que representa o

texto

seu

comprimento;

cad é a subcadeia que deseja

mos

encontrar e m>0 é

seu comprimento.

S

j]

para representar uma subcadeia

S[L+1],

,

SD].

teres Si],

Usamos

ainda,

constituída

aa

notação

pelos carac-

-

03

-

Capítulo

1

1.0

-

Introdução

Os

algoritmos que procuram a vrimeira

ocorrência

uma cadeia num texto não

dois grupos.

pré-processado,

podem ser divididos

de

em

A característica que os distingue é o sentido adota

do para a sequência de

comparações

entre

àa

um grupo estão os querda da cadeia,

a partir

seguem à direita fazendo

algoritmos

que,

cadeia e o texto.

do caractere

comparações

mais

com

à

Em

es

os

correspondentes

mos

inspecionam

caracteres do texto.

Devido a isso, tais algorit

cada caractere

do texto: (até

o ponto

onde

foi en-

contrada a cadeia) pelo menos uma vez. O segundo grupo caracteri za-se por adotar um sentido inverso na sequência de comparações, ou

seja,

estas são feitas

da direita para à esquerda

Neste

capítulo,

destacamos os

algoritmos

Menorfreq,

KMP - pertencentes ao primeiro grupo.

1.1

-

Algoritmo

SimpLes

-

Simples,

Este

algoritmo é, provavelmente, O procedimento

imediato que nos Ocorre ao resolvermos

um problema de busca

mais

em

texto.

Inicialmente, alinhamos o caractere mais à esquerda da ca-

deia - cad[l]

-

Segue-se

então,

com

o

caractere

comparando

os

mais

à esquerda do texto - textoL11.

caracteres

alinhados e

tão

logo

ocorra um insucesso, cad é deslocada de uma posição à

direita,

recomeçando

o processo a partir da nova posição de cad[l).

próxima

postção

de cadl1)

caso haja

insucesso

Algoritmo

|

Entrada

Saida

|

|

:

l.

Algoritmo

cad,

texto,

Stmples

m>0,

n>0.

a localização do primeiro meira ocorrência em texto,

houver insucesso.

caractere

de

cad na

se houver sucesso;

if

car

k/

+

repeat

m>n then return(o); + cadll);

O;

procure em texto[lk+l n-m+l]

a

primeira ocorrência de car;

if

k|/+

car

não foi encontrado then return(0);

posição onde car foi encontrado

unti

return(k);

textoLlk

K+m-1]

=cad;

sua pri-

O

se

Não

é

difícil verificar que Oo pior caso ocorre

inicial de cad em texto,

para toda possivel posição

todo,

com

se,

ex

-

05

-

Do

cessao do

Ultimo caractere

por

de

SN

cad coincidir com o correspondente mel

quando

cad=a

b

e

n

texto=a

,

:

caractere de texto;

exemplo,

com

n>>m.

Neste caso,

O(mn)

comparações

sao necessárias

para

determinar que a cadeia não ocorre no texto.

Como

tal

situação

é relativamente rara, pode-se dizer que O algoritmo

Stímples

em média, praticamente-

linear e.pode ser

bastante aceitável

&,

em

algumas

situações.

Em particular,

nenhum método pode

superá-lo

quando a cadeia possuir apenas um caractere.

1.2

-

Algoritmo

Menor

Frequência

Horspool [

HORSPOOL-80]

observou

que,

se

conhecer.

mos

frequências

podemos

de ocorrência dos símbolos do alfabeto

quanto

ao

ao

tempo

as

no

número

de

texto,

de

melhorar o algori tmo Simples,

feitas e,

consequentemente,

comparações

quanto

execução.

Suponha que procuramos

num texto em Português pela

palavra

'EXTRA';

o algoritmo

cias sucessivas da letra 'E'.

Simples

localiza,

Infelizmente,

'E'

então,

e

uma

ocorrên

das

le-

tras mais frequentes na língua Portuguesa e o algoritmo encon-

traria um 'E' em cada 10 caracteres aproximadamente. Assim, ha-

veria

muitas

cessos apôõs

comparações

entre cad e texto resultando em

cada

'E',

antes

de

se

obter a

correspondência

insu-

dese-

jada.

Português.

cessivas de

rapidamente

zer muitas

Por outro

lado, 'X' é uma das letras menos frequentes

EM

Se usarmos o algoritmo para localizar ocorrências su

'X'

ao invés

de

a busca

ao longo

'E',

do

seremos

capazes

texto,

ou seja,

de

avançar

deixamos

de

mais

fa-

comparações que

resultariam em insucessos.

Assim,

se

leci onando

o

caractere

podemos

Menoxgreq

cia em texto,

O

al goritmo

de

cad

com

a

menor

frequência

de

melhorar

a seguir,

a velocidade do algoritmo

adota este

procedimento.

Ocorrên-

Simples.

Algoritmo

Entrada:

2.

cad,

to.

Algoritmo

Menorgreq

texto,

m>0,

n>0,

frequências

dos

símbolos

no

tex-

Saída

: a localização do primeiro ra ocorrência em texto, insucesso.

caractere

de

cad na sua primei

O

se houver

se houver sucesso;

if

m>n

then return(o);

encontrar j tal que cad[lj]

quência em texto;

car + cad);

k

+ j-1l;

é

Oo

caractere

de

cad com menor

fre-

repeat

procure em

car não

k + posição

if

texto[k+1 n-m+tj]l

a primeira ocorrência de car;

foi encontrado then return(o);

onde

car

foi encontrado

until

textolk-j+l k+m-j3l=cad;

return (k-j3+1);

goritmo

As

informações

podem ser

fornecidas

as dos possíveis caracteres, texto.

sobre

frequência

utilizadas pelo al-

na forma de uma lista de frequênci- de acordo com suas ocorrências

no

Quanto maior a cadeia,

mais

rapidamente

esperamos

-

07

—-

avançar no texto.

Isto ocorre porque em cadeias

longas,

maior

probabilidade de se encontrar um caractere de baixa frequência no texto.

possuem

Além

do pior caso dos Algoritmos

tornam

1

2- Olm) - eles

cer-

e

uma outra propriedade que os

inconvenientes

em

tas aplicações: eles envolvem retrocessos no texto, ou seja, voltam a

comparar um caractere do texto comparado anteriormente. Isto provoca ine

ficiência se todo o texto

ções

com

não estiver disponível na memória e

O

próximo

opera-

algoritmo não pos-

"buffers" forem necessárias.

sui esta propriedade e possui

um pior caso

de apenas

O(m+in).

1,3

-

Atgormitmo

de

Knuth-Monrxis-Pratt

(KMP)

Knuth,

Morris

e Pratt

[KNUTH-77]

construiram um al-

goritmo que pode

ser

informalmente

descrito como:

Inicialmente,

cadeia e texto estão alinhados

curso

de

comparações é

como no algoritmo

Símples

e

quando

feito à direita.

Entretanto,

O

per

ocor-

ré uma não-coincidência

de

caracteres,

a

cadeia é deslocada à di

reita de tal

maneira

que oO processo pode ser reinicializado a

partir

do. ponto de não-coincidência no texto. Assim,

nenhum retrocesso é necessário.

1.3.1

-

Exemplo

Considere a busca da cadeia 'abcabcaca' no. texto

' cabccabcabcaabcabcacaa'. Inicialmente alinhamos o primeiro ca-

ractere da cadeia com o primeiro

do

texto e estamos

prontos a tes

tar o primeiro

caractere

do texto:

abcabcaca

cabccabcabcaabcabcacaa

+

que

dire

'c'

ita

A flecha indica o caracter

atual do texto;

desde

não coincide

e

O

caractere

com 'a',

deslocamos a cadeia uma posição

à

atual

passa a

ser

o

segundo caractere

do tex

abcabcaca

cabccabcabcaabcabcecacaa

+

deia

Vos

Agora houve coincidência,

então não

movemos

à

ca-

enquanto

os

caracteres

do texto

caracteres da cadeia,

coincidirem com os respecti

abcabcaca

cabccabcabcaabcabcacaa

+

já verificamos a ocorrência dos 3 pri-

meiros caracteres da cadeia, mas não do quarto, então sabemos que os 4 últimos caracteres do texto são 'abcx' onde x£f'a' e não temos que lembrar os caracteres verificados anteriormente, desde

Nesse ponto,

nossa posição na cadeia nos fornece suficiente informação pa

rt

Pcriá-los. Neste caso,

independente de quem é x

(uma

vez

que

e 'a'), concluímos que a cadeia pode ser deslocada 4 posi-

é

à direita,

pois uma,

duas

ou três

não levariam a uma

coinci

La.

que

ra

não

ções

dênci

parc! ial,

Desta maneira,

conseguimos

agora

com

uma

falha no oitavo

uma

nova

correspondência

caractere da

cadeia:

abcabcaca

cabccabcabcaabcabcacaa

+

to

são

Agora

'abcabcax',

sabemos

onde

que os oito últimos

caracteres

do tex

x*'c'.,

A cadeia deve então ser deslocada

3 posições à direita:

abcabcaca

cabccabcabcaabcabcacaa

+

falha,

Tentamos

o

novo

caractere

da

movemos

então a cadeia 4 posições

cadeia e

novamente

mais.

Isto produz

este

uma

coincidência e continuamos até encontrar uma nova falha ou então

descobrir a cadeia toda:

abcabcaca

cabccabcabcaabcabcacaa

+

Vemos que esse processo será eficiente

se

tivermos

uma tabela auxiliar que nos informe

exatamente

quantas

posições

devemos

mover a cadeia -

cadQl.

mo caractere

quando

detetamos

Seja prox[3] a posição do

uma falhã no seu

próximo

caractere

da

j-êsi

"

ca-

deia que deve ser testado após ocorrer uma falha em cadl3]; assim,

devemos deslocar cad,

j-proxLj]l

posições à direita.

A tabela prox para a cadeia do exemplo dado

seria

então:

j= 1234567809

cad l=z

abcabcaca

prox[jl= O 11011050

talmente a

Note que,

prox[3]=0

indica que devemos deslocar to-

cadeia,

isto é,

O primeiro

caractere

da cadeia deve ser

=

10

comparado

com o proximo caractere

trução de prox mais

adiante.

do texto. Discutiremos a

teiro do

Em cada passo do processo,

podemos

mover

Ou

O

texto

ou

a

cadeia à direita,

e cada

um destes pode

cons-

pon-

mo-

ver-se no máximo n vezes; então, no máximo 2x passos precisam ser realizados, após a construção da tabela prox. Naturalmente a cadeia não se

movimenta,

Algoritmo

Entrada

Saída

:

:

O

3.

que

fazemos é atualizar O ponteiro 5.

Algoritmo

KMP

cad,

texto,

m>0,

n>0,

à função prox.

a localização do primeiro meira ocorrência em texto, houver insucesso.

caractere

de

cad na

se houver sucesso;

sua pri-

O

se

j+l

while

k+1;

k<sn

begin

while

do

(3>0)

and

(textolk] * cadr31)

if

j=m

j+proxL31;

then return(k-m+1l)

else begin

K+k+1;

j+j+l

end

end;

return(o0);

do

Uma versão mais

eficiente do algoritmo KMP é

-1-

apre-

1

sentada em

[KNUTH-77].,

1.3.2

-

Construção

da

Tabela prox

j>0

e

que

texto[lk]

onde

x

*

os

são

Quando o algoritmo KMP executa

últimos j

j+prox[3],

saberos que

caracteres de texto atê,

e inclusive,

cadL]1]

cad[l3].

O

cad[ji-1]

x

que

queremos

é efetuar o

menor deslocamento

da

cadeia tal que esses caracteres possam, possivelmente, correspon

der aos da cadeia deslocada; isto é, queremos que prox[3] seja o

maior i

jam

menor

que

j

tal que

os

últimos i

caracteres do texto se-

cadll)