Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MESTRADO EM INFORMTICA
PROJETO DE ANLISE DE ALGORITMOS
Vitria ES
2009
Sumrio
1
Introduo ......................................................................................................... 2
Descrio.............................................................................................. 3
2.1.2
Anlise .................................................................................................. 4
Descrio.............................................................................................. 5
2.2.2
Anlise .................................................................................................. 7
2.3.1
Descrio.............................................................................................. 7
2.3.2
Anlise .................................................................................................. 9
Casamento Aproximado.................................................................................... 9
3.1 Shift-And Aproximado ....................................................................................... 9
3.1.1
Descrio.............................................................................................. 9
3.1.2
Anlise ................................................................................................ 11
3.2.1
Descrio............................................................................................ 12
3.2.2
Anlise ................................................................................................ 13
Experimentos .................................................................................................. 14
4.1 Execuo ........................................................................................................ 14
4.2 Resultado Experimentais ................................................................................ 15
4.2.1
Metodologia ........................................................................................ 15
4.2.2
Resultados.......................................................................................... 16
Sumrio........................................................................................................... 23
1 Introduo
Este trabalho visa comparar os diversos algoritmos usados no processamento de
cadeias de caracteres, escolhidos a partir de um conjunto chamado alfabeto.
O objetivo do mesmo estudar a busca de palavras (padres) em um texto, atravs
do casamento de caracteres. O casamento pode ser exato ou aproximado, como
mostraremos no prximo captulo.
Este trabalho est organizado da seguinte forma:
Captulo 2: Casamento exato e os algoritmos usados para este tipo de casamento.
Para cada algoritmo, apresentamos uma breve descrio e uma anlise genrica;
Captulo 3: Casamento aproximado e os algoritmos usados para este tipo de
casamento. Para cada algoritmo, apresentamos uma breve descrio e uma anlise
genrica;
Captulo 4: Demonstramos os experimentos realizados e confrontamos os
resultados de cada um dos algoritmos.
2 Casamento exato
O casamento exato acontece quando todos os caracteres do padro so
encontrados exatamente na mesma ordem no texto.
Neste trabalho apresentaremos os seguintes algoritmos para casamento exato:
Boyer-Moore-Horspool, Boyer-Moore-Horspool-Sunday e Shift-And Exato.
long bmh(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
int n = strlen(linha);
int m = strlen(padrao);
long i, j, k;
long d[MAX_CHAR];
long comp=0;
*ocorrencias = 0;
// pre processamento
for (j=0; j<=MAX_CHAR; j++)
d[j] = m;
for (j=1; j<m; j++)
d[(int)padrao[j-1]] = m-j;
// busca
i = m;
while (i<=n) {
k=i;
j=m;
while (linha[k-1] = = padrao[j-1] && j>0) {
k--;
j--;
comp++;
}
if (j==0) {
imprimeResultado(linha, padrao, numLinha, k+1);
(*ocorrencias)++;
}
i+=d[(int)linha[i-1]];
}
}
return comp;
Algoritmo 1 - BMH
2.1.2 Anlise
A fase de pr-processamento do padro ocorre nos dois primeiros loops do cdigo
acima. No pr-processamento calculado a tabela de deslocamentos d. O
deslocamento pode ser computado com base apenas no padro e no alfabeto, e a
complexidade de tempo e de espao para essa fase O(c), onde c o tamanho do
alfabeto.
Para a fase de pesquisa, o pior caso do algoritmo O(mn), caso os deslocamentos
ocorram apenas de 1 em 1. No entanto o melhor caso O(n/m), onde os
2.2.1 Descrio
O BMHS uma variao do BMH. Ele enderea a tabela com o caractere no texto
correspondente ao prximo caractere aps o ltimo caractere do padro, em vez de
deslocar o padro usando o ltimo caractere como no algoritmo BMH.
Atravs de deslocamentos maiores, e o baixo nmero de referncias memria
deste novo algoritmo, o faz executar mais rapidamente no geral.
Desta forma, para pr-computar o padro, o valor inicial de todas as entradas na
tabela de deslocamentos feito igual a m+1. A seguir, os m primeiros caracteres do
padro so usados para obter os outros valores da tabela.
A seguir apresentamos a implementao do algoritmo BMHS:
long bmhsLinha(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
int tamLinha = strlen(linha);
int tamPadrao = strlen(padrao);
*ocorrencias = 0;
long i, j, k;
long d[MAX_CHAR+1];
long comp=0;
// Pre-processamento
for (i=0; i<=MAX_CHAR; i++)
d[i] = tamPadrao + 1;
// inicializa as 'tamPadrao' casas do vetor com:
// tamPadrao, tamPadrao - 1, tamPadrao - 2, ..., 2, 1
for (i=1; i<=tamPadrao; i++)
d[(int)padrao[i-1]] = tamPadrao - i + 1;
// busca
i = tamPadrao;
while (i<=tamLinha) {
k = i;
j = tamPadrao;
while (linha[k-1] == padrao[j-1] && j>0) {
k--;
j--;
// conta o numero de comparacoes
comp++;
}
if (j==0) {
imprimeResultado(linha, padrao, numLinha, k+1);
(*ocorrencias)++;
}
}
i += d[(int)linha[i]];
return comp;
}
Algoritmo 2 - BMHS
2.2.2 Anlise
Observando o cdigo, temos que o comportamento assinttico do BMHS idntico
ao BMH tanto no pr-processamento quanto na pesquisa. Entretanto os
deslocamentos so mais longos (podendo chegar a m+1), levando a saltos
relativamente maiores para padres curtos e resultando em execues mais
rpidas.
2.3.1 Descrio
Este algoritmo foi proposto por Baeza-Yates e Gonet em 1989. A idia por trs
deste algoritmo bastante simples, e seu tempo de execuo bem melhor que
diversos algoritmos de busca como por exemplo o proposto por KNUTH-MORRISPRATT.
Este consiste em manter um conjunto de todos os prefixos de P que casem com um
sufixo do texto lido. Os algoritmos utilizam paralelismo de bits1 para atualizar este
conjunto a cada novo caractere. Este conjunto representado por uma mscara
D = dm...d1. Tirando proveito do paralelismo de bit, o nmero de operaes que um
algoritmo realiza pode ser reduzido por um fator de at , onde o nmero de
bits da palavra do computador. Considerando que nas arquiteturas atuais, 32 ou
64, temos um ganho relativamente grande.
Colocamos um 1 na j-sima posio de d(esta posio ento dita estar ativa) se e
somente se p1...pj um sufixo de t1...ti. Se o tamanho de p menor que , ento
este vetor poder ser armazenado em um registrador. Reportamos um casamento
sempre que dm ficar ativo.
Ao ler o prximo caractere ti+1, temos que computar o novo conjunto D. Uma
posio j+1 neste conjunto ser ativada se e somente se a posio j estava ativada
Uma tcnica que tira proveito do paralelismo intrnseco das operaes sobre bits dentro de uma
palavra de computador. Neste caso, possvel empacotar muitos valores em uma nica palavra e
atualizar todos eles em uma nica operao
em D, isto , p1...pj era um sufixo de t1...ti e ti+1 casa com pj+1. Este novo conjunto
fcil de computar em tempo constante usando operaes com paralelismo de bits.
O algoritmo primeiro monta uma tabela B, que armazena a mscara de bits bm...b1
para cada caractere. A mscara em B[c] tem o j-simo bit ligado se pj=c.
Inicialmente setamos D = 0m, e para cada novo caractere ti+1 atualizamos D usando
a frmula
(I)
Intuitivamente, o ''<<'' desloca a posio para a esquerda para marcar no passo i+1
quais posies de p eram sufixos no passo i. Tambm marcamos uma string vazia
como um sufixo, para que possamos fazer um OR da nova mscara com 0m-11.
Agora podemos manter at esta posio apenas aquelas que casam ti+1 com pj+1,
fazendo um AND deste conjunto de posies com o conjunto B[ti+1] de posies de
ti+1 em p.
Apesar de parecer um pouco complicado, este algoritmo pode ser implementado em
poucas linhas, como segue abaixo:
long saLinha(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
int n = strlen(linha);
int m = strlen(padrao);
long Masc[MAX_CHAR];
long i, R = 0;
long comp = 0;
*ocorrencias = 0;
// pre-processamento
for (i=0; i<MAX_CHAR; i++)
for (i=1; i<=m; i++)
Masc[i] = 0;
// Busca
for (i=0; i<n; i++) {
R = ((((unsigned long)R) >> 1) | (1 << (m-1))) & Masc[linha[i]+127];
if ((R&1) != 0) {
imprimeResultado(linha, padrao, numLinha, i - m + 2);
(*ocorrencias)++;
8
}
comp++;
}
return comp;
2.3.2 Anlise
A fase de pr-processamento, onde criada a tabela de mscara M ocorre nos dois
primeiros loops do cdigo. A fase de pesquisa constituda por um loop em que i
varia de 1 at n, onde cada caracter analisado. Desta forma temos que o custo
deste algoritmo O(n). O custo de espao O(c).
3 Casamento Aproximado
3.1 Shift-And Aproximado
3.1.1 Descrio
Como o prprio nome indica, este algoritmo uma modificao do Algoritmo SHIFTAND original que permite o casamento aproximado dos padres. Este algoritmo foi
proposto por Wu e Manber em 1992.
A implementao deste algoritmo bastante parecida com a implementao do
SHIFT-AND original. Ele tambm representa o autmato como uma seqncia de bits
e, atravs de operaes lgicas bit a bit, realiza o caminhamento no autmato. Uma
mscara tambm definida para cada um dos caracteres do alfabeto.
Este algoritmo empacota cada linha j(0<j<k) do autmato no-determinista em uma
palarvra Rj diferente do computador. A cada novo caractere lido do texto, todas as
transies do autmato so simuladas usando operaes entre as k+1 mscaras de
bits. Todas as k+1 mscaras de bits tm a mesma estrutura e assim o mesmo bit
alinhado com a mesma posio no texto (ZIVIANI, 2004).
Na posio i do texto, os novos valores Rj, o<j<k, so obtidos a partir dos valores
correntes de Rj, a saber:
R0= ((R0 >> 1) | 10m-1) & M[T[i]]
Rj= ((Rj >> 1) & M[T[i]]) | Rj-1 | (Rj-1 >> 1) | (Rj-1 >>1)
onde M a tabela do algoritmo SHIFT-AND conforme mostrado anteriormente. A
princpio estas operaes em Rj parecem complicadas, mas explicando elas por
partes, ficam bem mais fcil de entender:
((Rj >>1) & M[T[i]]): faz com que os estados ativos acumulados pelo
registrados Rj continuem caminhando em direo ao estado final do autmato
em conformidade com a mscara do caractere atual do texto;
10
R[0] = 0;
Ri = 1 << (m - 1);
for (j = 1; j<=erro; j++)
R[j] = (1 << (m-j)) | R[j-1];
// busca
for (i=0; i<n; i++) {
Rant = R[0];
Rnovo = ((((unsigned long)Rant) >> 1) | Ri) & Masc[linha[i] + 127];
R[0] = Rnovo;
for (j = 1; j<=erro; j++) {
Rnovo = ((((unsigned long)R[j]) >> 1) & Masc[linha[i] + 127]) |
Rant | (((unsigned long)(Rant | Rnovo)) >> 1);
Rant = R[j];
R[j] = Rnovo | Ri;
comp++;
}
if ((Rnovo & 1) != 0) {
imprimeResultado(linha,
padrao,
numLinha,
i(strlen(padrao))+2);
(*ocorrencias)++;
}
}
return comp;
}
Algoritmo 4 - Shift-And Aproximado
3.1.2 Anlise
A complexidade deste algoritmo de O(k[m/]n) no pior caso e no caso mdio
onde o tamanho em bits de uma palavra, o que equivale a O(kn) para padres
tpicos, isto m (ZIVIANI, 2004). J a complexidade de espao O(Km), onde
K o nmero de erros, uma vez que so necessrio K autmatos com o tamanho
do padro.
11
(2)
12
// pre-processamento
for (i=0; i<=m; i++)
C[i]=i;
lact = erro + 1;
// busca
for (pos=1; pos<=n; pos++) {
pC = 0;
nC = 0;
for (i=1; i<=lact; i++) {
if (padrao[i-1] == linha[pos-1]) {
nC = pC;
} else {
if (pC < nC) nC = pC;
if (C[i] < nC) nC = C[i];
nC = nC + 1;
}
pC = C[i];
C[i] = nC;
comp++;
}
while (C[lact] > erro) {
lact = lact-1;
comp++;
}
if (lact == m) {
imprimeResultado(linha, padrao, numLinha, pos-m+1);
(*ocorrencias)++;
} else {
lact = lact + 1;
}
}
return comp;
Algoritmo 5 - Programao Dinmica
3.2.2 Anlise
A complexidade do algoritmo sem a modificao mencionada O(mn). Com a
modificao, esta complexidade passa a ser de O(kn). Em ambos os casos, tm-se
uma complexidade de espao de O(m).
13
4 Experimentos
.4#ALY\T A=4#]#^51 M _4_Y\T 5CKl"TIP_1_A,O#1_PQ1wm.1_6\T IP.m.4#J /Y\1_A,1_AN 4S'B(4#6=JRP_4_G[Y\1_A_-.F ,A= ALJ KP.B_6=JRP_4_J K6\TIP_4_G} Y=4
seguinte,
apresentaremos
os
resultados
experimentais
obtidos
4.1 Execuo
Para compilar todo o cdigo, digite:
> make
Para executar, obedea ao padro:
>./TP2 <cdigo do algoritmo> <texto> <arquivo com os padres> <numero de erro>
Cdigo
BMH
BMHS
Shift-And Exato
Shift-And Aproximado
Programao Dinmica
No arquivo que contm os padres, cada linha ser considerada como um padro a
ser procurado.
14
ii.
Padro: para facilitar a anlise dos resultados, nos testes utilizamos padres
diferentes, porm com o mesmo tamanho (Em torno de quinze caracteres).
Nas buscas, para cada algoritmo e para cada valor de k (erro), foram
buscados 10 padres e calculada a mdia do nmero de comparaes e do
tempo de execuo.
4.2.2 Resultados
A seguir, apresentaremos os grficos com os resultados obtidos dos experimentos.
Eles foram organizados de acordo com o nmero de erros alm de estarem sempre
em funo do tamanho do texto a ser pesquisado (representado nos grficos pelo
tamanho do arquivo em Megabits). Assim, para cada erro sero apresentados dois
grficos:
Vale salientar que, os algoritmos exatos aparecem apenas nos grficos cujo erro
0. Os grficos que comparam o tempo e o nmero de comparaes das so os
grficos de 1 at 8, apresentados na prxima seo.
Como mencionado anteriormente, os algoritmos possuem complexidade de tempo
linear quando o tamanho da palavra constante. Isso foi comprovado atravs dos
experimentos, apesar dos grficos darem a falsa impresso de que o crescimento
no linear, pois o eixo x no est com os dados marcados proporcionalmente.
Alm de se comparar o desempenho entre os algoritmos, foram gerados grficos
para a comparao do desempenho de um algoritmo aproximado de acordo com o
seu erro. Os Grficos 9 e 10 mostra essa comparao para o ShiftAnd Aprox. j os
Grficos 11 e 12 so relativos ao de programao dinmica.
4.2.3 Grficos
16
2,5
BMH
2
tempo (s)
BMHS
Shift-And Exato
1,5
Shift-And Aproximado
1
Programao
Dinmica
0,5
0
2,7
9,8
19,9
107
tamanho do arquiv o
n de comparaes
200000000
BMH
BMHS
150000000
Shift-And Exato
100000000
Shift-And Aproximado
Programao
Dinmica
50000000
0
2,7
9,8
19,9
107
tamanho do arquivo
17
tempo (s)
3,5
3
Shift-And Aproximado
2,5
Programao
Dinmica
2
1,5
1
0,5
0
1
tamanho do arquivo
n de comparaes
300000000
250000000
Shift-And Aproximado
200000000
Programao
Dinmica
150000000
100000000
50000000
0
2,7
9,8
19,9
107
tamanho do arquivo
18
n de comparaes
5
4
Shift-And Aproximado
3
Programao
Dinmica
2
1
0
2,7
9,8
19,9
107
tamanho do arquivo
n de comparaes
400000000
350000000
300000000
Shift-And Aproximado
250000000
Programao
Dinmica
200000000
150000000
100000000
50000000
0
2,7
9,8
19,9
107
tamanho do arquivo
19
tempo (s)
6
5
Programao
Dinmica
Shift-And Aproximado
3
2
1
0
2,7
9,8
19,9
107
tamanho do arquivo
n de comparaes
600000000
500000000
Programao
Dinmica
400000000
Shift-And Aproximado
300000000
200000000
100000000
0
2,7
9,8
19,9
107
tamanho do arquivo
20
Shift-And Aproximado
Tempo X Tamanho do Arquivo
6
5
tempo
erro = 0
erro = 1
erro = 2
erro = 3
2
1
0
2,7
9,8
19,9
107
tamanho do arquivo
Shift-And Aproximado
Comparaes X Tamanho do arquivo
500000000
450000000
n de comparaes
400000000
350000000
erro = 0
300000000
erro = 1
250000000
erro = 2
200000000
erro = 3
150000000
100000000
50000000
0
2,7
9,8
19,9
107
tamanho do arquivo
21
Programao Dinmica
Tempo X Tamanho do Arquivo
8
7
tempo (s)
6
5
erro = 0
erro = 1
erro = 2
erro = 3
3
2
1
0
2,7
9,8
19,9
107
tamanho do arquivo
Programao Dinmica
Comparaes X Tamanho do Arquivo
700000000
n de comparaes
600000000
500000000
erro = 0
400000000
erro = 1
erro = 2
300000000
erro = 3
200000000
100000000
0
2,7
9,8
19,9
107
tamanho do arquivo
22
Sumrio
23