SlideShare uma empresa Scribd logo
1 de 12
Baixar para ler offline
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

Algoritmos de Busca de Palavras em Texto
A busca de padrões dentro de um conjunto de informações tem uma grande aplicação em computação.
São muitas as variações deste problema, desde procurar determinadas palavras ou sentenças em um
texto até procurar um determinado objeto dentro de uma sequência de bits que representam uma
imagem.
Todos eles se resumem a procurar certa sequência de bits ou bytes dentro de uma sequência maior de
bits ou bytes.
Vamos considerar a versão de procurar uma sequência de bytes dentro de outra sequencia, ou ainda,
procurar uma palavra dentro de um texto. Palavra deve ser entendida como uma sequência
qualquer de caracteres. Assim, a formulação do problema fica:
Dada uma sequência a de m>0 bytes (a[1],..., a[m] ou a[1..m]) verificar quantas vezes ela
ocorre em uma sequência b de n elementos (b[1], ..., b[n] ou b[1..n]).
O algoritmo tradicional
Nos algoritmos abaixo vamos considerar os índices começando do 1 e não do 0. Os elementos a[0] e
b[0] serão ignorados.
A solução mais trivial deste problema consiste então em comparar:
a[1] com b[1]; a[2] com b[2]; ... a[m] com b[m]
a[1] com b[2]; a[2] com b[3]; ... a[m] com b[m+1]
...
a[1] com b[n-m+1]; a[2] com b[n-m+2]; ... a[m] com b[n]
1

2

3

b

4

5

6

7

8

9

n-1
...

...

...

...

a
a
a

a
a

Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio

n
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

Na primeira comparação em que a[i] diferente de b[j], passa-se para o próximo passo.
Exemplos:
b
a
a
a
a
a

–
–
–
–
–

O alinhamento do pensamento provoca casamento
mento – Ocorre 3 vezes
n – Ocorre 5 vezes
casa – Ocorre 1 vez
ovo – Ocorre 1 vez
prova – Ocorre 0 vezes

b
a
a
a

–
–
–
–

ababababa
bab – Ocorre 3 vezes
abab – Ocorre 3 vezes
bababa – Ocorre 2 vezes

Abaixo esta primeira solução:
int casapadrao1(char a[], int m, char b[], int n) {
int i, j, k, conta=0;
if (m<=0) return 0;
for (k=1; k<=n-m+1; k++) {
for (j=k, i=1; i<=m; j++, i++)
if (a[i] != b[j]) break;
if (i>m) conta++;
}
return conta;
}
Na solução acima, i e j caminham da esquerda para a direita.
Também a se desloca da esquerda para a direita a cada nova tentativa.
j
b
i
a

Podemos ter algumas variações, todas equivalentes:
Procurando a em b da direita para a esquerda:

Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

j
b
i

int casapadrao2(char a[], int m, char b[], int n) {
int i, j, k, conta=0;
if (m<=0) return 0;
for (k=m; k<=n; k++) {
for (j=k, i=m; i>0; j--, i--)
if (a[i] != b[j]) break;
if (i==0) conta++;
}
return conta;
}
Varrendo b da direita para a esquerda e procurando a em b da direita para a esquerda:

j
b
i
a
int casapadrao3(char a[], int m, char b[], int n) {
int i, j, k, conta=0;
if (m<=0) return 0;
for (k=n; k>=m; k--) {
for (j=k, i=m; i>0; j--, i--)
if (a[i] != b[j]) break;
if (i==0) conta++;
}
return conta;
}
Exercícios:
1) Adapte o algoritmo acima, varrendo b da direita para a esquerda e procurando a em b da
esquerda para a direita.
2) Quantas comparações são feitas no mínimo e no máximo? Encontre sequências a e b onde o
mínimo e o máximo ocorrem.
3) Por que a complexidade dos algoritmos acima é O(n2) ?
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

4) Explique porque as versões acima são todas equivalentes.
5) Adapte os algoritmos acima, devolvendo o índice inicial em b da primeira ocorrência de a ou -1
se não encontrar.
Algoritmo de Boyer-Moore – versão 1 [1977]
Esse algoritmo tenta fazer menos comparações usando uma característica do padrão a ser procurado a.
Quando se compara a[1..m] com b[i..k] (k=i+m-1 para i=1,..., n-m+1), isto é, quando
se compara a com um segmento qualquer dentro de b, a próxima comparação não precisa ser com
b[i+1..k+1].
Pode ser com b[i+d..k+d] onde d é calculado de forma que b[k+1] coincida com a última
ocorrência de b[k+1] em a.
Assim, podemos deslocar a comparação com o próximo segmento em mais de um elemento. Não
importa o resultado da comparação anterior.
Exemplo:
Procurar abcd em abacacbabcdcdabd
Veja como podemos fazer a busca avançando no modo proposto:
a
a

b
b

a
c

c
d

a

c

b

a

b

c

d

c

d

a

b

d

a

b

c

d
a

b

c
a

d
b

c

d

d

c

d

a

b

d

a

b

a
a

b

a

Outro exemplo – Procurar aba:
a
a

b
b

a
a

c

a

c

b

a

b
a

a
b

a

b

c

a
a

b

a

O problema então consiste em saber qual a última ocorrência de b[k+1] em a.
Se soubermos todos os valores possíveis de b[k+1], podemos calcular este valor para cada elemento
de a.
Aqui está a particularidade do algoritmo: é necessário conhecer o alfabeto.
Como estamos lidando com caracteres, o alfabeto são todos os caracteres de 0 a 255.
Podemos então previamente calcular qual a última ocorrência de cada um dos caracteres de a.
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

Exemplo – Qual a última ocorrência de cada caractere na sequência abaixo e qual o deslocamento
necessário?
1 2 3 4 5 6 7 8 9
a b c a b e a c d
Caractere
a
b
c
d
e
Todos os demais

Última Ocorrência
7
5
8
9
6
0

Deslocamento
3
5
2
1
4
10

Observe que: Deslocamento = Tamanho - Última Ocorrência + 1
Embora o objetivo seja encontrar o último a[i] que coincida com b[k+1], o algoritmo só depende
de a. No entanto, é necessário conhecer-se o alfabeto de a.
Veja abaixo o algoritmo.
int boyermoore1(unsigned char a[], int m, unsigned char b[], int n) {
int ult[256];
int i, j, k, conta=0;
if (m <= 0) return 0;
/* verifica última ocorrência de cada letra em a */
for (i = 0; i < 256; i++) ult[i] = 0;
for (i = 1; i <= m; i++) ult[a[i]] = i;
/* procura a em b da direita para a esquerda */
for (k = m; k <= n; k = k + m - ult[b[k+1]] + 1) {
for (j = k, i = m; i > 0; j--, i--)
if (a[i] != b[j]) break;
if (i==0) conta++;
/* pode ser que já tenha chegado ao fim de b e neste caso */
/* não dá para usar [b[k+1]] como índice de ult[] */
if (k+1 > n) break;
}
return conta;
}
Este algoritmo é O(n.m).
A fase de pré-processamento é O(m+K), onde K depende do alfabeto.
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

A fase de busca é O(n.m).
Entretanto, no caso geral se comporta melhor que o algoritmo tradicional.
Exercícios:
1) Porque a declaração de a e b tem que ser unsigned char e não char simplesmente?
2) Usando a mesma ideia do algoritmo acima, é possível avançar a comparação mais do que
b[k+1]? E menos?
3) Adapte o algoritmo acima para fazer a busca de a em b da direita para a esquerda, isto é,
comparando com b[n-m+1..n], b[n-m-2..n-1], ..., b[1..m].
4) No algoritmo acima é necessário conhecer o alfabeto, ou os valores possíveis de b[k+1]. Se a
e b fossem do tipo int, como ficaria o algoritmo?
5) Quando b[k+1] não coincide com nenhum de a[1..m] já vimo que o deslocamento será de
m+1. Uma pequena variação é procurar primeiro b[p] (p>k+1) tal que b[p]=a[1]. Ou
seja, vamos aumentar o deslocamento.
Algoritmo de Boyer-Moore – versão 2
A versão 2 do algoritmo é intuitiva, mas tem uma implementação mais engenhosa.
Não é necessário conhecer-se o alfabeto de a.
Também só depende de a.
Neste algoritmo é necessário que a comparação de a com b, seja feita da direita para a esquerda:
Para i=m, m+1, ..., n
Comparar a[m] com b[i]; a[m-1] com b[i-1]; ...; a[1] com b[i-m+1]
A ideia básica é a seguinte:
Suponha que numa das comparações já descobrimos que a[h..m] é igual a b[k-m+h..k], ou seja,
descobrimos que existe um trecho (parcial ou total) no meio de b que é igual a um trecho corresponde
dente de a. Só haverá casamento se a tiver um trecho igual em a[1..m-1]. Se não houver tal trecho
em a, podemos deslocar de m elementos.
Exemplos:
a: B A B
b: A B A B C B A B C
A
B

B
A
B

Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio

A
B
A

B
B

C

B

A

B

C
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

B

A

B
B

A

B

a: A B A B A
b: B C A B A B C C A B A D D A B A B A
B
A

C
B

A
A
A

B
B
B
A

A
A
A
B
A

B

C

C

B
A
B

A
B
A
A

A
B
B

A

A
A
A

B

A

B
B
A

A
A
B

D

D

B
A
A

A
B
B

A

B

A

B

A

B

A

B

A

A
A
A

B
B

A
A
A

B
B

A
A
A

B
B

A
A

B

B

A

Portanto é necessário localizar a última ocorrência de a[h..m] em a[1..m-1].
Vamos chamar essa ocorrência de alcance[h] e vamos defini-la como o último índice onde houve a
coincidência.
Assim, se a[h..m] = a[p..q] (h,p >=1 e q<=m-1) e a[p..q] é a última ocorrência de
a[h..m] em a[1..m-1], então alcance[h] = q.
Um caso particular ocorre quando o início de a coincide com o final. Neste caso temos que considerar
como se houvesse o casamento no restante da cadeia. Veja exemplos:
h
1
a
C
alcance 0

2
B
0

3
A
0

4
B
3

5
A
3

h
1
a
A
alcance 3

2
B
3

3
A
3

4
B
3

5
A
3

h
1
a
A
alcance 2

2
B
2

3
C
2

4
A
2

5
B
2

Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio

6
B
5

7
C
5

8
A
5

9
B
6
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

Veja abaixo outros exemplos de deslocamento:
b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

x

x

x

x

x

x

x

x

Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x
a

x
a

x
a

x
a

x
a

x
a

x
a

x
a

x
a

x
b

x
b

x
b

b
b

x
b

x
b

x
b

x
b

x
a
a

x
a
a

x
b
b

a
a
a

x
a
a

b
b
b

a
a
a

a
a
a

b
b
b

a
a
a

a
a
a

b
b
b

a
a
a

a
a
a

x

x

b

a

x

c
c

x
b

b
b

x
a
a

x

x

b

a

x

x

b

a

x

x

b

a

x

x

b

a

x

x

x

a

x

x

b

c

a
a
a

x

a
a
a
a
a
a

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

b

b

a

x

x

x

x

x

x

x

b

b

a

x

x

x

x

x

x

x

a
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

b
a
deslocamento

x

b
a
deslocamento

x

b
a
deslocamento

x

x

x

x

x

x

x

x

x

x

x
a

x
a

a
a

x
a
a

a
a
a

a
a
a

a
a
a

a
a
a

a
a
a

a
a
a

a
a
a

a
a
a

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

a
x
a
x
a

Da mesma forma que o algoritmo anterior temos que fazer um pré-processamento em a para
determinar o alcance[h]. Determinado alcance[h], ele será usado como deslocamento para a
próxima tentativa de fazer-se o casamento.
A determinação de h é seguinte:
for (h = m; h >= 1; h--) {
mm = m-1;
ii = mm; i = m;
while (ii >= 1 && I >= h)
if (a[ii] == a[i]) {
--ii; --i; /* continua comparando */
}
else {
--mm; /* reduz o candidato a alcance[h] */
ii = mm; i = m; /* reinicia a comparação */
}
alcance[h] = mm;
}
O algoritmo completo com uma versão mais otimizada da determinação de alcance[h] está abaixo:
#define MAXm 100 /* maior valor de m */
int boyermoore2(unsigned char a[], int m, unsigned char b[], int n) {
int alcance[MAXm];
int i, j, k, h, mm, ii, conta=0, d=0;
if (m <= 0) return 0;
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

/* pré-processamento de a - versão mais otimizada */
h = mm = m;
do {
ii = --mm;
i = m;
while (ii >= 1 && a[ii] == a[i]){
ii--; i--;
}
while (h > i) alcance[h--] = mm;
} while (ii >= 1);
while (h >= 1) alcance[h--] = mm;
/* procura a em b */
k = m;
while (k <= n) {
for (i = m, j = k; i >= 1; i--, j--)
if (a[i] != b[j]) break;
if (i < 1) ++conta;
if (i == m) k++; /* desloca apenas 1 */
/* o último que coincidiu foi a[i] */
else k = k + m - alcance[i+1];
}
return conta;
}
Este algoritmo também é O(n.m).
Neste caso, tanto a fase de pré-processamento quanto a fase de busca são O(n.m).
Da mesma forma que a versão 1, no caso geral se comporta melhor que o algoritmo tradicional.
Esse algoritmo se comporta melhor quando há muita repetição de trechos em a, o que pode ocorrer
com maior frequência se m é grande.
Entretanto quando não há coincidência o deslocamento é de apenas 1 enquanto que na versão 1 o
deslocamento é em geral maior.
Versão 1 versus Versão 2
Finalmente, reforçamos que na versão 1 é necessário conhecer o alfabeto enquanto que na versão 2 não
é necessário.
Ambas as versões só dependem de a.
Exercício – versão híbrida
Quando o alfabeto é conhecido, é possível usar as duas versões ao mesmo tempo.
A cada repetição do algoritmo, calcula-se o deslocamento referente a cada versão e usa-se o maior
deles. Fica como exercício.
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

Outra versão (uma pequena variação)
Uma pequena variação das versões 1 e 2. Deslocando-se para o próximo caractere de a diferente
daquele que não houve coincidência. Exemplo:
a
a

b
b

a
b
a

b

a

b

b
a

c

b

b
a

b
b
a

b

b

b
b
a

b
b

a

b

a

b
a

b

b
a

b

b

a

b
a

b
b

b

b

Para isso é necessário construir-se uma tabela ult_dif[i] (i=1,2,..,m) tal que
ult_dif[i]=k onde k é o maior índice menor que i e a[k] é diferente de a[i]. Exemplo:
1 2 3 4 5 6 7
b b c a a b b
i
7
6
5
4
3
2
1

ult_dif
5
5
3
3
2
2
1

Há 2 casos particulares:
1) Quando não há diferentes à esquerda. Neste caso o deslocamento deve ser igual ao índice
do elemento.
2) Quando coincide totalmente. Neste caso o deslocamento deve ser 1
Outros algoritmos
Existem outros algoritmos de complexidade mais baixa que os anteriores.
O mais conhecido é o algoritmo de Knuth-Morris-Pratt [KNUTH D.E., MORRIS (Jr) J.H., PRATT
V.R., 1977, Fast pattern matching in strings, SIAM Journal on Computing 6(1):323-350].
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio
Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio – Revisado 08Nov12

Sua complexidade é O(m) na fase de pré-processamento e de O(m+n) na fase de busca.
Portanto um algoritmo linear.
Outras referências para este assunto:
No site http://www-igm.univ-mlv.fr/~lecroq/string/index.html há informações sobre vários
algoritmos de busca de palavras em texto e também uma simulação do seu funcionamento.

Algoritmos de Busca de Palavras em Texto
MAC 122 – Marcilio

Mais conteúdo relacionado

Mais procurados

โครงการค่ายวิชาการEisปี54
โครงการค่ายวิชาการEisปี54โครงการค่ายวิชาการEisปี54
โครงการค่ายวิชาการEisปี54Lao-puphan Pipatsak
 
Exercicios basicos conjuntos numéricos
Exercicios basicos   conjuntos numéricosExercicios basicos   conjuntos numéricos
Exercicios basicos conjuntos numéricosAndré Luís Nogueira
 
ข้อสอบกลางภาคเรียนที่ 1 ปีการศึกษา 2555 ม.3 พื้นฐาน
ข้อสอบกลางภาคเรียนที่  1   ปีการศึกษา  2555   ม.3 พื้นฐานข้อสอบกลางภาคเรียนที่  1   ปีการศึกษา  2555   ม.3 พื้นฐาน
ข้อสอบกลางภาคเรียนที่ 1 ปีการศึกษา 2555 ม.3 พื้นฐานkurpoo
 
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...Aline Guedes
 
ทฤษฎีบทพีทาโกรัส
ทฤษฎีบทพีทาโกรัสทฤษฎีบทพีทาโกรัส
ทฤษฎีบทพีทาโกรัสmoohhack
 
Numeros Naturais
Numeros NaturaisNumeros Naturais
Numeros NaturaisCANO
 
คณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับ
คณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับคณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับ
คณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับTutor Ferry
 
Introdução ao conceito de equação
Introdução ao conceito de equaçãoIntrodução ao conceito de equação
Introdução ao conceito de equaçãoLidiane_Walendorff
 
แบบทดสอบก่อนเรียนเมทริกซ์
แบบทดสอบก่อนเรียนเมทริกซ์แบบทดสอบก่อนเรียนเมทริกซ์
แบบทดสอบก่อนเรียนเมทริกซ์kruthanapornkodnara
 
Adição e subtração de números inteiros
Adição e subtração de números inteirosAdição e subtração de números inteiros
Adição e subtração de números inteirosmarina_cordova
 
Arranjo e-combinação (1)
Arranjo e-combinação (1)Arranjo e-combinação (1)
Arranjo e-combinação (1)André Ferreira
 
การดำเนินการบนเมทริกซ์
การดำเนินการบนเมทริกซ์การดำเนินการบนเมทริกซ์
การดำเนินการบนเมทริกซ์kroojaja
 
การแก้ระบบสมการเชิงเส้นสองตัวแปร
การแก้ระบบสมการเชิงเส้นสองตัวแปรการแก้ระบบสมการเชิงเส้นสองตัวแปร
การแก้ระบบสมการเชิงเส้นสองตัวแปรพัน พัน
 

Mais procurados (20)

โครงการค่ายวิชาการEisปี54
โครงการค่ายวิชาการEisปี54โครงการค่ายวิชาการEisปี54
โครงการค่ายวิชาการEisปี54
 
Exercicios basicos conjuntos numéricos
Exercicios basicos   conjuntos numéricosExercicios basicos   conjuntos numéricos
Exercicios basicos conjuntos numéricos
 
ข้อสอบกลางภาคเรียนที่ 1 ปีการศึกษา 2555 ม.3 พื้นฐาน
ข้อสอบกลางภาคเรียนที่  1   ปีการศึกษา  2555   ม.3 พื้นฐานข้อสอบกลางภาคเรียนที่  1   ปีการศึกษา  2555   ม.3 พื้นฐาน
ข้อสอบกลางภาคเรียนที่ 1 ปีการศึกษา 2555 ม.3 พื้นฐาน
 
Notacao Cientifica
Notacao CientificaNotacao Cientifica
Notacao Cientifica
 
Notação científica
Notação científicaNotação científica
Notação científica
 
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
 
ทฤษฎีบทพีทาโกรัส
ทฤษฎีบทพีทาโกรัสทฤษฎีบทพีทาโกรัส
ทฤษฎีบทพีทาโกรัส
 
Numeros Naturais
Numeros NaturaisNumeros Naturais
Numeros Naturais
 
คณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับ
คณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับคณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับ
คณิตศาสตร์ ม.1 เรื่องสมบัติของจำนวนนับ
 
Introdução ao conceito de equação
Introdução ao conceito de equaçãoIntrodução ao conceito de equação
Introdução ao conceito de equação
 
26 ทฤษฎีจำนวนเบื้องต้น บทนำ
26 ทฤษฎีจำนวนเบื้องต้น บทนำ26 ทฤษฎีจำนวนเบื้องต้น บทนำ
26 ทฤษฎีจำนวนเบื้องต้น บทนำ
 
Expressões numéricas
Expressões numéricasExpressões numéricas
Expressões numéricas
 
แบบทดสอบก่อนเรียนเมทริกซ์
แบบทดสอบก่อนเรียนเมทริกซ์แบบทดสอบก่อนเรียนเมทริกซ์
แบบทดสอบก่อนเรียนเมทริกซ์
 
Adição e subtração de números inteiros
Adição e subtração de números inteirosAdição e subtração de números inteiros
Adição e subtração de números inteiros
 
เเผนสามเหลี่ยม ม2
เเผนสามเหลี่ยม ม2เเผนสามเหลี่ยม ม2
เเผนสามเหลี่ยม ม2
 
Arranjo e-combinação (1)
Arranjo e-combinação (1)Arranjo e-combinação (1)
Arranjo e-combinação (1)
 
การดำเนินการบนเมทริกซ์
การดำเนินการบนเมทริกซ์การดำเนินการบนเมทริกซ์
การดำเนินการบนเมทริกซ์
 
การแก้ระบบสมการเชิงเส้นสองตัวแปร
การแก้ระบบสมการเชิงเส้นสองตัวแปรการแก้ระบบสมการเชิงเส้นสองตัวแปร
การแก้ระบบสมการเชิงเส้นสองตัวแปร
 
O-NET ม.6-เลขยกกำลัง (และราก)
O-NET ม.6-เลขยกกำลัง (และราก)O-NET ม.6-เลขยกกำลัง (และราก)
O-NET ม.6-เลขยกกำลัง (และราก)
 
อสมการ
อสมการอสมการ
อสมการ
 

Destaque

Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-Mauro Pereira
 
Lista de exercícios em portugol
Lista de exercícios em portugolLista de exercícios em portugol
Lista de exercícios em portugolGabriel Faustino
 
Red de Contenidos Audiovisuales y Multimedia de las Universidades Españolas
Red de Contenidos Audiovisuales y Multimedia de las Universidades EspañolasRed de Contenidos Audiovisuales y Multimedia de las Universidades Españolas
Red de Contenidos Audiovisuales y Multimedia de las Universidades EspañolasVLC/CAMPUS
 
PolionéSi[1].
PolionéSi[1]. PolionéSi[1].
PolionéSi[1]. elicar
 
Портал "Ломоносов"
Портал "Ломоносов"Портал "Ломоносов"
Портал "Ломоносов"Ivan Terikov
 
DESTAK – Lisboa – 10.07.2008
DESTAK – Lisboa – 10.07.2008DESTAK – Lisboa – 10.07.2008
DESTAK – Lisboa – 10.07.2008MANCHETE
 
Presentazione pec
Presentazione pec Presentazione pec
Presentazione pec snap69
 
Brochure frederik van eedenlaan
Brochure frederik van eedenlaanBrochure frederik van eedenlaan
Brochure frederik van eedenlaanWoningadviseurs
 
Apresentação de Márcia Leal
Apresentação de Márcia LealApresentação de Márcia Leal
Apresentação de Márcia LealCartaCapital
 
Certificado Interuniversitario en actualización didùactica UCL KU Leuven
Certificado Interuniversitario en actualización didùactica UCL KU LeuvenCertificado Interuniversitario en actualización didùactica UCL KU Leuven
Certificado Interuniversitario en actualización didùactica UCL KU LeuvenIlv Ucl
 
M 02 imou13_представление тренинга
M 02 imou13_представление тренингаM 02 imou13_представление тренинга
M 02 imou13_представление тренингаYuri Bogachkov
 
narcoestetica y narcocultura en narcolombia
narcoestetica y narcocultura en narcolombianarcoestetica y narcocultura en narcolombia
narcoestetica y narcocultura en narcolombiaXDXD11
 

Destaque (20)

Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 
Lista de exercícios em portugol
Lista de exercícios em portugolLista de exercícios em portugol
Lista de exercícios em portugol
 
Algoritmos em portugol
Algoritmos em portugolAlgoritmos em portugol
Algoritmos em portugol
 
Red de Contenidos Audiovisuales y Multimedia de las Universidades Españolas
Red de Contenidos Audiovisuales y Multimedia de las Universidades EspañolasRed de Contenidos Audiovisuales y Multimedia de las Universidades Españolas
Red de Contenidos Audiovisuales y Multimedia de las Universidades Españolas
 
Inadi guia-para-docentes
Inadi guia-para-docentesInadi guia-para-docentes
Inadi guia-para-docentes
 
PolionéSi[1].
PolionéSi[1]. PolionéSi[1].
PolionéSi[1].
 
Портал "Ломоносов"
Портал "Ломоносов"Портал "Ломоносов"
Портал "Ломоносов"
 
DESTAK – Lisboa – 10.07.2008
DESTAK – Lisboa – 10.07.2008DESTAK – Lisboa – 10.07.2008
DESTAK – Lisboa – 10.07.2008
 
Чемпионат по ТЭК для компаний
Чемпионат по ТЭК для компанийЧемпионат по ТЭК для компаний
Чемпионат по ТЭК для компаний
 
biologia
biologiabiologia
biologia
 
Roberto BeltráN 1
Roberto BeltráN 1Roberto BeltráN 1
Roberto BeltráN 1
 
Presentazione pec
Presentazione pec Presentazione pec
Presentazione pec
 
Brochure frederik van eedenlaan
Brochure frederik van eedenlaanBrochure frederik van eedenlaan
Brochure frederik van eedenlaan
 
Marco
MarcoMarco
Marco
 
Edital DPE-RJ
Edital DPE-RJEdital DPE-RJ
Edital DPE-RJ
 
Carlos Oswald
Carlos OswaldCarlos Oswald
Carlos Oswald
 
Apresentação de Márcia Leal
Apresentação de Márcia LealApresentação de Márcia Leal
Apresentação de Márcia Leal
 
Certificado Interuniversitario en actualización didùactica UCL KU Leuven
Certificado Interuniversitario en actualización didùactica UCL KU LeuvenCertificado Interuniversitario en actualización didùactica UCL KU Leuven
Certificado Interuniversitario en actualización didùactica UCL KU Leuven
 
M 02 imou13_представление тренинга
M 02 imou13_представление тренингаM 02 imou13_представление тренинга
M 02 imou13_представление тренинга
 
narcoestetica y narcocultura en narcolombia
narcoestetica y narcocultura en narcolombianarcoestetica y narcocultura en narcolombia
narcoestetica y narcocultura en narcolombia
 

Semelhante a 18 algoritmos de busca de palavras em texto

Matrices y Sistema de Ecuaciones Lineales ccesa007
Matrices y Sistema de Ecuaciones Lineales  ccesa007Matrices y Sistema de Ecuaciones Lineales  ccesa007
Matrices y Sistema de Ecuaciones Lineales ccesa007Demetrio Ccesa Rayme
 
Matemática aplicada aula01
Matemática aplicada aula01Matemática aplicada aula01
Matemática aplicada aula01Augusto Junior
 
www.CentroApoio.com - Matemática - Logaritmo
www.CentroApoio.com - Matemática - Logaritmowww.CentroApoio.com - Matemática - Logaritmo
www.CentroApoio.com - Matemática - LogaritmoVídeo Aulas Apoio
 
Ala.2016.2 lista1 (1) - Álgebra Linear - Matrizes
Ala.2016.2 lista1 (1) - Álgebra Linear - MatrizesAla.2016.2 lista1 (1) - Álgebra Linear - Matrizes
Ala.2016.2 lista1 (1) - Álgebra Linear - Matrizesvanilsonsertao01
 
Algoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPAlgoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPMarcos Castro
 
Matemática pga1
Matemática pga1Matemática pga1
Matemática pga1takahico
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10PeslPinguim
 
Teoria elementar dos numeros
Teoria elementar dos numerosTeoria elementar dos numeros
Teoria elementar dos numeroslealtran
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmosRicardo Bolanho
 
5 expressoes logicas - operadores - base binaria - operadores de bits
5   expressoes logicas - operadores - base binaria - operadores de bits5   expressoes logicas - operadores - base binaria - operadores de bits
5 expressoes logicas - operadores - base binaria - operadores de bitsRicardo Bolanho
 
Semana 05 - Estruturas Condicionais - Exercícios
Semana 05   - Estruturas Condicionais - ExercíciosSemana 05   - Estruturas Condicionais - Exercícios
Semana 05 - Estruturas Condicionais - ExercíciosEder Samaniego
 
Aritmética - Aula 5 - Algoritmo de Euclides
Aritmética - Aula 5 - Algoritmo de EuclidesAritmética - Aula 5 - Algoritmo de Euclides
Aritmética - Aula 5 - Algoritmo de EuclidesLuciana Martino
 

Semelhante a 18 algoritmos de busca de palavras em texto (20)

Álgebra Booleana
Álgebra BooleanaÁlgebra Booleana
Álgebra Booleana
 
Matrices y Sistema de Ecuaciones Lineales ccesa007
Matrices y Sistema de Ecuaciones Lineales  ccesa007Matrices y Sistema de Ecuaciones Lineales  ccesa007
Matrices y Sistema de Ecuaciones Lineales ccesa007
 
4 groebner danton4 dissertacao
4 groebner danton4 dissertacao4 groebner danton4 dissertacao
4 groebner danton4 dissertacao
 
Matrizes
MatrizesMatrizes
Matrizes
 
Matemática aplicada aula01
Matemática aplicada aula01Matemática aplicada aula01
Matemática aplicada aula01
 
Algop - aula 03
Algop - aula 03Algop - aula 03
Algop - aula 03
 
www.CentroApoio.com - Matemática - Logaritmo
www.CentroApoio.com - Matemática - Logaritmowww.CentroApoio.com - Matemática - Logaritmo
www.CentroApoio.com - Matemática - Logaritmo
 
Ala.2016.2 lista1 (1) - Álgebra Linear - Matrizes
Ala.2016.2 lista1 (1) - Álgebra Linear - MatrizesAla.2016.2 lista1 (1) - Álgebra Linear - Matrizes
Ala.2016.2 lista1 (1) - Álgebra Linear - Matrizes
 
Cadernodequestes ano2009
Cadernodequestes ano2009Cadernodequestes ano2009
Cadernodequestes ano2009
 
Algoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPAlgoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMP
 
Matemática pga1
Matemática pga1Matemática pga1
Matemática pga1
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10
 
Teoria elementar dos numeros
Teoria elementar dos numerosTeoria elementar dos numeros
Teoria elementar dos numeros
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmos
 
Trabalho de mat.pptx
Trabalho de mat.pptxTrabalho de mat.pptx
Trabalho de mat.pptx
 
5 expressoes logicas - operadores - base binaria - operadores de bits
5   expressoes logicas - operadores - base binaria - operadores de bits5   expressoes logicas - operadores - base binaria - operadores de bits
5 expressoes logicas - operadores - base binaria - operadores de bits
 
Semana 05 - Estruturas Condicionais - Exercícios
Semana 05   - Estruturas Condicionais - ExercíciosSemana 05   - Estruturas Condicionais - Exercícios
Semana 05 - Estruturas Condicionais - Exercícios
 
Aritmética - Aula 5 - Algoritmo de Euclides
Aritmética - Aula 5 - Algoritmo de EuclidesAritmética - Aula 5 - Algoritmo de Euclides
Aritmética - Aula 5 - Algoritmo de Euclides
 

Mais de Ricardo Bolanho

19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracaoRicardo Bolanho
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de buscaRicardo Bolanho
 
16 algoritmos de busca em tabelas - hash
16   algoritmos de busca em tabelas - hash16   algoritmos de busca em tabelas - hash
16 algoritmos de busca em tabelas - hashRicardo Bolanho
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binariaRicardo Bolanho
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelasRicardo Bolanho
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivasRicardo Bolanho
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dadosRicardo Bolanho
 
10 alocacao dinamica - listas ligadas
10   alocacao dinamica - listas ligadas10   alocacao dinamica - listas ligadas
10 alocacao dinamica - listas ligadasRicardo Bolanho
 
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoriaRicardo Bolanho
 
7 alocacao sequencial - filas
7   alocacao sequencial - filas7   alocacao sequencial - filas
7 alocacao sequencial - filasRicardo Bolanho
 
6 alocacao sequencial - pilhas
6   alocacao sequencial - pilhas6   alocacao sequencial - pilhas
6 alocacao sequencial - pilhasRicardo Bolanho
 
3 funcoes vetores matrizes
3   funcoes vetores matrizes3   funcoes vetores matrizes
3 funcoes vetores matrizesRicardo Bolanho
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocosRicardo Bolanho
 
Lógica para computação silva-finger-melo
Lógica para computação   silva-finger-meloLógica para computação   silva-finger-melo
Lógica para computação silva-finger-meloRicardo Bolanho
 
00 essential raymond murphy
00 essential raymond murphy00 essential raymond murphy
00 essential raymond murphyRicardo Bolanho
 
Symon,kr.mecanica.3 e,1996pt,341p
Symon,kr.mecanica.3 e,1996pt,341pSymon,kr.mecanica.3 e,1996pt,341p
Symon,kr.mecanica.3 e,1996pt,341pRicardo Bolanho
 

Mais de Ricardo Bolanho (20)

19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracao
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de busca
 
16 algoritmos de busca em tabelas - hash
16   algoritmos de busca em tabelas - hash16   algoritmos de busca em tabelas - hash
16 algoritmos de busca em tabelas - hash
 
15 algoritmos de busca em tabelas - sequencial e binaria
15   algoritmos de busca em tabelas - sequencial e binaria15   algoritmos de busca em tabelas - sequencial e binaria
15 algoritmos de busca em tabelas - sequencial e binaria
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dados
 
10 alocacao dinamica - listas ligadas
10   alocacao dinamica - listas ligadas10   alocacao dinamica - listas ligadas
10 alocacao dinamica - listas ligadas
 
9 structs e ponteiros
9   structs e ponteiros9   structs e ponteiros
9 structs e ponteiros
 
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria8   ponteiros,  ponteiros e vetores e alocacao dinamica de memoria
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
 
7 alocacao sequencial - filas
7   alocacao sequencial - filas7   alocacao sequencial - filas
7 alocacao sequencial - filas
 
6 alocacao sequencial - pilhas
6   alocacao sequencial - pilhas6   alocacao sequencial - pilhas
6 alocacao sequencial - pilhas
 
4 char e strings
4   char e strings4   char e strings
4 char e strings
 
3 funcoes vetores matrizes
3   funcoes vetores matrizes3   funcoes vetores matrizes
3 funcoes vetores matrizes
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 
Lógica para computação silva-finger-melo
Lógica para computação   silva-finger-meloLógica para computação   silva-finger-melo
Lógica para computação silva-finger-melo
 
Projeto 2 aula 5
Projeto 2   aula 5Projeto 2   aula 5
Projeto 2 aula 5
 
Projeto 1 aula 4
Projeto 1   aula 4Projeto 1   aula 4
Projeto 1 aula 4
 
00 essential raymond murphy
00 essential raymond murphy00 essential raymond murphy
00 essential raymond murphy
 
Symon,kr.mecanica.3 e,1996pt,341p
Symon,kr.mecanica.3 e,1996pt,341pSymon,kr.mecanica.3 e,1996pt,341p
Symon,kr.mecanica.3 e,1996pt,341p
 

18 algoritmos de busca de palavras em texto

  • 1. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 Algoritmos de Busca de Palavras em Texto A busca de padrões dentro de um conjunto de informações tem uma grande aplicação em computação. São muitas as variações deste problema, desde procurar determinadas palavras ou sentenças em um texto até procurar um determinado objeto dentro de uma sequência de bits que representam uma imagem. Todos eles se resumem a procurar certa sequência de bits ou bytes dentro de uma sequência maior de bits ou bytes. Vamos considerar a versão de procurar uma sequência de bytes dentro de outra sequencia, ou ainda, procurar uma palavra dentro de um texto. Palavra deve ser entendida como uma sequência qualquer de caracteres. Assim, a formulação do problema fica: Dada uma sequência a de m>0 bytes (a[1],..., a[m] ou a[1..m]) verificar quantas vezes ela ocorre em uma sequência b de n elementos (b[1], ..., b[n] ou b[1..n]). O algoritmo tradicional Nos algoritmos abaixo vamos considerar os índices começando do 1 e não do 0. Os elementos a[0] e b[0] serão ignorados. A solução mais trivial deste problema consiste então em comparar: a[1] com b[1]; a[2] com b[2]; ... a[m] com b[m] a[1] com b[2]; a[2] com b[3]; ... a[m] com b[m+1] ... a[1] com b[n-m+1]; a[2] com b[n-m+2]; ... a[m] com b[n] 1 2 3 b 4 5 6 7 8 9 n-1 ... ... ... ... a a a a a Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio n
  • 2. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 Na primeira comparação em que a[i] diferente de b[j], passa-se para o próximo passo. Exemplos: b a a a a a – – – – – O alinhamento do pensamento provoca casamento mento – Ocorre 3 vezes n – Ocorre 5 vezes casa – Ocorre 1 vez ovo – Ocorre 1 vez prova – Ocorre 0 vezes b a a a – – – – ababababa bab – Ocorre 3 vezes abab – Ocorre 3 vezes bababa – Ocorre 2 vezes Abaixo esta primeira solução: int casapadrao1(char a[], int m, char b[], int n) { int i, j, k, conta=0; if (m<=0) return 0; for (k=1; k<=n-m+1; k++) { for (j=k, i=1; i<=m; j++, i++) if (a[i] != b[j]) break; if (i>m) conta++; } return conta; } Na solução acima, i e j caminham da esquerda para a direita. Também a se desloca da esquerda para a direita a cada nova tentativa. j b i a Podemos ter algumas variações, todas equivalentes: Procurando a em b da direita para a esquerda: Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 3. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 j b i int casapadrao2(char a[], int m, char b[], int n) { int i, j, k, conta=0; if (m<=0) return 0; for (k=m; k<=n; k++) { for (j=k, i=m; i>0; j--, i--) if (a[i] != b[j]) break; if (i==0) conta++; } return conta; } Varrendo b da direita para a esquerda e procurando a em b da direita para a esquerda: j b i a int casapadrao3(char a[], int m, char b[], int n) { int i, j, k, conta=0; if (m<=0) return 0; for (k=n; k>=m; k--) { for (j=k, i=m; i>0; j--, i--) if (a[i] != b[j]) break; if (i==0) conta++; } return conta; } Exercícios: 1) Adapte o algoritmo acima, varrendo b da direita para a esquerda e procurando a em b da esquerda para a direita. 2) Quantas comparações são feitas no mínimo e no máximo? Encontre sequências a e b onde o mínimo e o máximo ocorrem. 3) Por que a complexidade dos algoritmos acima é O(n2) ? Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 4. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 4) Explique porque as versões acima são todas equivalentes. 5) Adapte os algoritmos acima, devolvendo o índice inicial em b da primeira ocorrência de a ou -1 se não encontrar. Algoritmo de Boyer-Moore – versão 1 [1977] Esse algoritmo tenta fazer menos comparações usando uma característica do padrão a ser procurado a. Quando se compara a[1..m] com b[i..k] (k=i+m-1 para i=1,..., n-m+1), isto é, quando se compara a com um segmento qualquer dentro de b, a próxima comparação não precisa ser com b[i+1..k+1]. Pode ser com b[i+d..k+d] onde d é calculado de forma que b[k+1] coincida com a última ocorrência de b[k+1] em a. Assim, podemos deslocar a comparação com o próximo segmento em mais de um elemento. Não importa o resultado da comparação anterior. Exemplo: Procurar abcd em abacacbabcdcdabd Veja como podemos fazer a busca avançando no modo proposto: a a b b a c c d a c b a b c d c d a b d a b c d a b c a d b c d d c d a b d a b a a b a Outro exemplo – Procurar aba: a a b b a a c a c b a b a a b a b c a a b a O problema então consiste em saber qual a última ocorrência de b[k+1] em a. Se soubermos todos os valores possíveis de b[k+1], podemos calcular este valor para cada elemento de a. Aqui está a particularidade do algoritmo: é necessário conhecer o alfabeto. Como estamos lidando com caracteres, o alfabeto são todos os caracteres de 0 a 255. Podemos então previamente calcular qual a última ocorrência de cada um dos caracteres de a. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 5. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 Exemplo – Qual a última ocorrência de cada caractere na sequência abaixo e qual o deslocamento necessário? 1 2 3 4 5 6 7 8 9 a b c a b e a c d Caractere a b c d e Todos os demais Última Ocorrência 7 5 8 9 6 0 Deslocamento 3 5 2 1 4 10 Observe que: Deslocamento = Tamanho - Última Ocorrência + 1 Embora o objetivo seja encontrar o último a[i] que coincida com b[k+1], o algoritmo só depende de a. No entanto, é necessário conhecer-se o alfabeto de a. Veja abaixo o algoritmo. int boyermoore1(unsigned char a[], int m, unsigned char b[], int n) { int ult[256]; int i, j, k, conta=0; if (m <= 0) return 0; /* verifica última ocorrência de cada letra em a */ for (i = 0; i < 256; i++) ult[i] = 0; for (i = 1; i <= m; i++) ult[a[i]] = i; /* procura a em b da direita para a esquerda */ for (k = m; k <= n; k = k + m - ult[b[k+1]] + 1) { for (j = k, i = m; i > 0; j--, i--) if (a[i] != b[j]) break; if (i==0) conta++; /* pode ser que já tenha chegado ao fim de b e neste caso */ /* não dá para usar [b[k+1]] como índice de ult[] */ if (k+1 > n) break; } return conta; } Este algoritmo é O(n.m). A fase de pré-processamento é O(m+K), onde K depende do alfabeto. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 6. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 A fase de busca é O(n.m). Entretanto, no caso geral se comporta melhor que o algoritmo tradicional. Exercícios: 1) Porque a declaração de a e b tem que ser unsigned char e não char simplesmente? 2) Usando a mesma ideia do algoritmo acima, é possível avançar a comparação mais do que b[k+1]? E menos? 3) Adapte o algoritmo acima para fazer a busca de a em b da direita para a esquerda, isto é, comparando com b[n-m+1..n], b[n-m-2..n-1], ..., b[1..m]. 4) No algoritmo acima é necessário conhecer o alfabeto, ou os valores possíveis de b[k+1]. Se a e b fossem do tipo int, como ficaria o algoritmo? 5) Quando b[k+1] não coincide com nenhum de a[1..m] já vimo que o deslocamento será de m+1. Uma pequena variação é procurar primeiro b[p] (p>k+1) tal que b[p]=a[1]. Ou seja, vamos aumentar o deslocamento. Algoritmo de Boyer-Moore – versão 2 A versão 2 do algoritmo é intuitiva, mas tem uma implementação mais engenhosa. Não é necessário conhecer-se o alfabeto de a. Também só depende de a. Neste algoritmo é necessário que a comparação de a com b, seja feita da direita para a esquerda: Para i=m, m+1, ..., n Comparar a[m] com b[i]; a[m-1] com b[i-1]; ...; a[1] com b[i-m+1] A ideia básica é a seguinte: Suponha que numa das comparações já descobrimos que a[h..m] é igual a b[k-m+h..k], ou seja, descobrimos que existe um trecho (parcial ou total) no meio de b que é igual a um trecho corresponde dente de a. Só haverá casamento se a tiver um trecho igual em a[1..m-1]. Se não houver tal trecho em a, podemos deslocar de m elementos. Exemplos: a: B A B b: A B A B C B A B C A B B A B Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio A B A B B C B A B C
  • 7. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 B A B B A B a: A B A B A b: B C A B A B C C A B A D D A B A B A B A C B A A A B B B A A A A B A B C C B A B A B A A A B B A A A A B A B B A A A B D D B A A A B B A B A B A B A B A A A A B B A A A B B A A A B B A A B B A Portanto é necessário localizar a última ocorrência de a[h..m] em a[1..m-1]. Vamos chamar essa ocorrência de alcance[h] e vamos defini-la como o último índice onde houve a coincidência. Assim, se a[h..m] = a[p..q] (h,p >=1 e q<=m-1) e a[p..q] é a última ocorrência de a[h..m] em a[1..m-1], então alcance[h] = q. Um caso particular ocorre quando o início de a coincide com o final. Neste caso temos que considerar como se houvesse o casamento no restante da cadeia. Veja exemplos: h 1 a C alcance 0 2 B 0 3 A 0 4 B 3 5 A 3 h 1 a A alcance 3 2 B 3 3 A 3 4 B 3 5 A 3 h 1 a A alcance 2 2 B 2 3 C 2 4 A 2 5 B 2 Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio 6 B 5 7 C 5 8 A 5 9 B 6
  • 8. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 Veja abaixo outros exemplos de deslocamento: b a deslocamento x b a deslocamento x b a deslocamento x b a deslocamento x b a deslocamento x b a deslocamento x b a deslocamento x b a deslocamento x b a deslocamento x x x x x x x x x Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio x x x x x x x x x x x x x x x x x x a x a x a x a x a x a x a x a x a x b x b x b b b x b x b x b x b x a a x a a x b b a a a x a a b b b a a a a a a b b b a a a a a a b b b a a a a a a x x b a x c c x b b b x a a x x b a x x b a x x b a x x b a x x x a x x b c a a a x a a a a a a x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x b b a x x x x x x x b b a x x x x x x x a
  • 9. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 b a deslocamento x b a deslocamento x b a deslocamento x x x x x x x x x x x a x a a a x a a a a a a a a a a a a a a a a a a a a a a a a a a x x x x x x x x x x x x x x x x x x x a x a x a Da mesma forma que o algoritmo anterior temos que fazer um pré-processamento em a para determinar o alcance[h]. Determinado alcance[h], ele será usado como deslocamento para a próxima tentativa de fazer-se o casamento. A determinação de h é seguinte: for (h = m; h >= 1; h--) { mm = m-1; ii = mm; i = m; while (ii >= 1 && I >= h) if (a[ii] == a[i]) { --ii; --i; /* continua comparando */ } else { --mm; /* reduz o candidato a alcance[h] */ ii = mm; i = m; /* reinicia a comparação */ } alcance[h] = mm; } O algoritmo completo com uma versão mais otimizada da determinação de alcance[h] está abaixo: #define MAXm 100 /* maior valor de m */ int boyermoore2(unsigned char a[], int m, unsigned char b[], int n) { int alcance[MAXm]; int i, j, k, h, mm, ii, conta=0, d=0; if (m <= 0) return 0; Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 10. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 /* pré-processamento de a - versão mais otimizada */ h = mm = m; do { ii = --mm; i = m; while (ii >= 1 && a[ii] == a[i]){ ii--; i--; } while (h > i) alcance[h--] = mm; } while (ii >= 1); while (h >= 1) alcance[h--] = mm; /* procura a em b */ k = m; while (k <= n) { for (i = m, j = k; i >= 1; i--, j--) if (a[i] != b[j]) break; if (i < 1) ++conta; if (i == m) k++; /* desloca apenas 1 */ /* o último que coincidiu foi a[i] */ else k = k + m - alcance[i+1]; } return conta; } Este algoritmo também é O(n.m). Neste caso, tanto a fase de pré-processamento quanto a fase de busca são O(n.m). Da mesma forma que a versão 1, no caso geral se comporta melhor que o algoritmo tradicional. Esse algoritmo se comporta melhor quando há muita repetição de trechos em a, o que pode ocorrer com maior frequência se m é grande. Entretanto quando não há coincidência o deslocamento é de apenas 1 enquanto que na versão 1 o deslocamento é em geral maior. Versão 1 versus Versão 2 Finalmente, reforçamos que na versão 1 é necessário conhecer o alfabeto enquanto que na versão 2 não é necessário. Ambas as versões só dependem de a. Exercício – versão híbrida Quando o alfabeto é conhecido, é possível usar as duas versões ao mesmo tempo. A cada repetição do algoritmo, calcula-se o deslocamento referente a cada versão e usa-se o maior deles. Fica como exercício. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 11. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 Outra versão (uma pequena variação) Uma pequena variação das versões 1 e 2. Deslocando-se para o próximo caractere de a diferente daquele que não houve coincidência. Exemplo: a a b b a b a b a b b a c b b a b b a b b b b a b b a b a b a b b a b b a b a b b b b Para isso é necessário construir-se uma tabela ult_dif[i] (i=1,2,..,m) tal que ult_dif[i]=k onde k é o maior índice menor que i e a[k] é diferente de a[i]. Exemplo: 1 2 3 4 5 6 7 b b c a a b b i 7 6 5 4 3 2 1 ult_dif 5 5 3 3 2 2 1 Há 2 casos particulares: 1) Quando não há diferentes à esquerda. Neste caso o deslocamento deve ser igual ao índice do elemento. 2) Quando coincide totalmente. Neste caso o deslocamento deve ser 1 Outros algoritmos Existem outros algoritmos de complexidade mais baixa que os anteriores. O mais conhecido é o algoritmo de Knuth-Morris-Pratt [KNUTH D.E., MORRIS (Jr) J.H., PRATT V.R., 1977, Fast pattern matching in strings, SIAM Journal on Computing 6(1):323-350]. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio
  • 12. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio – Revisado 08Nov12 Sua complexidade é O(m) na fase de pré-processamento e de O(m+n) na fase de busca. Portanto um algoritmo linear. Outras referências para este assunto: No site http://www-igm.univ-mlv.fr/~lecroq/string/index.html há informações sobre vários algoritmos de busca de palavras em texto e também uma simulação do seu funcionamento. Algoritmos de Busca de Palavras em Texto MAC 122 – Marcilio