A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

String Matching Emparelhamento de Cadeias Cin – UFPE

Apresentações semelhantes


Apresentação em tema: "String Matching Emparelhamento de Cadeias Cin – UFPE"— Transcrição da apresentação:

1 String Matching Emparelhamento de Cadeias Cin – UFPE
Danielle Nathália Gomes da Silva Anderson Paulo da Silva {dngs, Recife, Junho de 2008

2 Guia Motivação Definição Notação e Terminologia Algoritmos
Força Bruta Simples Rabin-Karp Emparelhamento por Autômato Finito Knuth-Moris Pratt.

3 Motivação Encontra sequências:
Grupo de pixels (leitura de um pergaminho); Grupo de índices de um banco de dados; Um texto (no caso de um “search” de um editor de texto); Uma sequência de DNA;

4 Motivação Objetivo: Encontrar uma cadeia de caracteres e geralmente, todas as ocorrências dessa cadeia (conhecida como padrão) em um determinado texto.

5 Visão Geral Força Bruta Simples: Desliza através do texto verificando caractere a caractere. Rabin-Karp: Codifica o padrão buscado como uma tabela hash. Emparelhamento por Autômato Finito: Para cada padrão é criado um autômato finito determinístico que o identifica no texto. Knuth-Moris Pratt (KMP): Custo linear, Otimização do simples e do AF. Mais usado para encontrar sequencia de DNA. ...Força Bruta AF KMP/BM KR

6 Tempo de pré-processamento Tempo de Emparelhamento
Quadro Comparativo Algoritmo Tempo de pré-processamento Tempo de Emparelhamento Simples Ο((n-m+1)m) Rabin-Karp Θ(m) Autômato Finito Ο(m3|∑|) Θ(n) Knuth-Morris-Pratt Com exceção do algoritmo de Força Bruta, todos os outros que serão apresentados, têm uma etapa anterior ao emparelhamento, que é fase de pré-processamento do padrão. Sendo o tempo total do algoritmo o tempo de processamento mais o tempo de emparelhamento.

7 Definições Texto é um array de tamanho n  T [ n] Padrão é um array de tamanho m  P [ m] T n = 8 P s=2 m= 3 s  deslocamento Com m ≤ n a b c a a b b c c a a

8 Definições Quando o padrão P ocorre? Quando temos um deslocamento valido? Se 0 ≤ s ≤ n - m T [s s+m] = P [1 ... m] T [s+j] = P [j], para 1 ≤ j ≤ m

9 Definição Se 0 ≤ s ≤ n - m (Possíveis valores de s) s=0 s=1 s=2 s=3
b c a a b b c c c c c c c c c c c c c c c c c c c

10 Definição T [s+1 ... s+m] = P [1 ... m] T n = 8 P s=2 m = 3
T [ ] = P [ ] T [3, 4, 5] = P [1, 2, 3] a b c a a b b c c c c

11 Definição T [s+j] = P [j], para 1 ≤ j ≤ m T n = 8 P s=2 m = 3 Se j = 3
1 ≤ j ≤ 3, T [2+3] = P [3] a b c a a b b c c c c Verifica para todos os valores de j

12 Notação e Terminologia
∑  Sigma, representa um alfabeto ∑*  Sigma asterisco, conjunto de todas as cadeias de comprimento finito formadas, usando caracteres do alfabeto ∑ ε  Cadeia vazia e pertence a ∑* lXl  Comprimento de X XY  Concatenação de duas cadeias X e Y. E tem comprimento lXl + lYl

13 Notação e Terminologia
Prefixo: w é prefixo de x, denota-se por w  x, se x=wy para y  ∑*. Então se w  x, |w| ≤ |x|. Ex.: ab  abcca Sufixo: w é sufixo de x, denota-se por wx, se x=yw para y  ∑*. Então se w x, |w| ≤ |x|. Ex.: cca  abcca

14 Notação e Terminologia
Se |x| ≤ |y|, então, x  y. X Z Y Prova gráfica do Lema 32.1 Suponha que x,y e z sejam cadeias tais que x  z e y  z.

15 Notação e Terminologia
Se |x|  |y|, então, y  x. X Z Y

16 Notação e Terminologia
Se |x|  |y|, então, y  x. X Z Y

17 Notação e Terminologia
Trazendo para nosso contexto: Denotaremos o prefixo de k caracteres P[1...k] do padrão P[1...m] por Pk. Então, P0= ε e Pm=P=P[1...m]. Também denota-se para k caracteres do texto T como Tk. Objetivo: Encontrar “s” válidos tal que P  T s+m.

18 Notação e Terminologia
T 1 ...n Tk 1 ...k P 1 ...m Pk 1 ...k Ilustrando: T n = 6 P s= m = 3, P  Ts+m -> P  T3 s= P  T4 s= P  T5 s= P  T6 a a b a c b a a c a a b a c a c b a a a c b a a a a b a c b a a c a c b a a a c b a a a a a a a a a a a a a a a

19 O Algoritmo de Força Bruta Simples
O algoritmo de força bruta procura por todos os deslocamentos s válidos, usando um loop para verificar a condição de que: P[1 .. m] = T[s s + m] para cada n – m + 1 possível valor de s.

20 O Algoritmo de Força Bruta Simples
NAIVE-STRING-MATCHER (T, P) n ← comprimento[T] m ← comprimento[P] for s ← 0 to n-m do if P[1...m]=T[s+1...s+m] then imprimir “Padrão ocorre com deslocamento” s Caminha os possíveis valores de s Verifica a condição de igualdade

21 O Algoritmo de Força Bruta Simples
O tempo de complexidade deste algoritmo no pior caso é O((n – m + 1)m). Serão feitas comparações para cada deslocamento s, de acordo com o tamanho do padrão m. Considere: T n=7 P m=5 S assume n-m+1 = 3. =(7-5+1)5 =15 b c a a b b c b c a a b b c a a b b c a a b b c a a b b c a a b b c Se m = n/2, Então O (n/2 x n) O (n2/2) 1/2 O(n2) O(n2)

22 O Algoritmo de Força Bruta Simples Exercício 32.1-1 (Cormen)
T P s=0 s=1 P[1,2,3,4]=T[2,3,4,5] s=2 s=3 s=4 s=5 P[1,2,3,4]=T[6,7,8,9] ... s=11 1 1 1 1 1 1 1 1 1 1 1

23 O Algoritmo de Força Bruta Simples
Exemplo de busca em texto T e x t o d m p l a r u b s c i E

24 Rabin-Karp Princípio: Transforma o padrão procurado em um número, seguindo determinadas regras. O métodos é baseado em processar a função de assinatura de cada substring de m-caracteres no texto e checar se é igual a assinatura da função da palavra procurada. O padrão P ocorre no texto T se o valor calculado para P for igual ao valor calculado para qualquer substring X de T, de tamanho m, tal que | X | = | P |

25 Rabin-Karp Cada caractere será um dígito decimal
31415 corresponde ao nº decimal Os padrões podem ser texto 2 3 5 9 2 3 1 4 1 5 2 6 7 3 9 9 2 1 8 9 3 11 1 7 8 4 5 10 11 7 9 11 Por isso precisamos verifica a condição de igualdade

26 Rabin-Karp Acrescentando notação: p – número correspondente de P;
ts – número correspondente de T; d – cardinalidade do alfabeto ; Então cada caractere é um dígito na base d. q – número primo, como: ; Então temos s válidos se, p = ts. Como calcular p e ts ?

27 Rabin-Karp Com o alfabeto  = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} e || = 10 P Temos: (P[1] * 10 + P[2]) = 19 (19 * 10) + P[3] = 199 (199 * 10) + P[4] = 1991 Generalizando: P[m] + || (P[m-1]+ || (P[m-2] || (P[2] + | P[1]) )) 1 9 9 1 ∑ = alfabeto |∑| = tamanho de ∑ Dado um caractere, a representação numérica deste será sua posição no alfabeto ∑

28 Rabin-Karp Realiza pré-processamento do padrão P em tempo (m) |P| = m
Usando a regra de Horner, podemos calcular o valor de p no tempo O (m) P = P[m]+10(P[m-1]+10(P[m-2] (P[2]+10P[1])...)) Comparar P com as m 1ª posições de T. O t0 pode ser calculado de modo semelhante, mas os t1 ... tn-m ? 2 3 5 9 2 3 1 4 1 5 2 6 7 3 9 9 2 1 2 3 5 9

29 Rabin-Karp Para calcular os ts, com s = 1 ... n-m. Temos s=6.
ts+1 = 10(ts – 10m-1T[s+1]) + T[s+m+1] ts+1 = 10(31415 – 30000) + 2 ts+1 = 10(1415) + 2 ts+1 = 14152 Remove o dígito de mais alta ordem de ts. 2 3 5 9 2 3 1 4 1 5 2 6 7 3 9 9 2 1 8 9 3 11 1 7 8 4 5 10 11 7 9 11

30 Rabin-Karp 10m-1T[s+1] – Remover dígito de mais alta ordem – 10m – x = 9910 1 9 9 1 2 1 4 1 5 2 6 7 3 9 9 2 1 1 9 9 É previamente calculado. Nesta operação matemática a complexidade depende do nº de bits. Custo O(lg m). O dígito de mais alta ordem foi retirado. Faz esse processo O(n – m) Acrescenta a casa decimal para a substring voltar a ter tamanho m O(1)

31 Rabin-Karp Os valores das transformações de P e das substrings de T são muito grande, quando m e |∑| são muito longos Ajustando a equação para funcionar em módulo q. 14152  (d(ts – h T[s+1]) + T[s+m+1]) mod q 14152  10(31415 – 3x10000) + 2 (mod 13) 14152  10(7-3x3) + 2 (mod 13) 14152  8 (mod 13) Onde, d = || h  dm-1 3 1 4 1 5 2 7 8

32 Rabin-Karp Realiza pré-processamento em tempo
 (lg m) +  (m) +  (m) =  (m) Emparelhamento (matching) n-m+1 deslocamento possíveis T deve ser calculado com deslocamento s+1. Processar T no deslocamento s+1 custa O(1), então transformar todo T leva tempo  (n-m+1) Quantas comparações possíveis entre o número calculado p e para t vamos realizar?  (n-m+1) Até agora temos (2(n-m+1)) = (n-m+1) Processar o texto e fazer comparações entre dos nº entre as chaves

33 Rabin-Karp Análise do pior caso.
Entretanto para (n-m+1) deslocamento possíveis, no pior caso, pode haver necessidade de comparar caractere a caractere de p com todos os ts. Para comparar o com ts, custa o tamanho do padrão, O(m), então temos que, o custo de emparelhamento no pior caso é:  (n-m+1) x  (m) =  ((n-m+1)m) O custo total do algoritmo é a soma do tempo de pré- processamento com o tempo de emparelhamento.  ((n-m+1)m) +  (m)  ((n-m)m) (n x m) 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Se m = n/2, Então O (n/2 x n) O (n2/2) 1/2 O(n2) O(n2)

34 Rabin-Karp Realiza pré-processamento do padrão P em tempo O(m)
O tempo de processamento de T O(n) Pior caso: Realiza o emparelhamento de P em T O((n-m+1)m) = O (m x n) Se m= n\2, O (n2)

35 Rabin-Karp for s ← 0 to n-m \\ Emparelhamento do if p = ts
RABIN-KARP-MACHER (T, P, d, q) n ← comprimento[T] m ← comprimento[P] h ← d m-1 mod q p ← 0 t0 ← 0 for i ← 1 to m \\ Pré-processamento do p ← (dp + P[i]) mod q t0 ← (t0 + T[i]) mod q for s ← 0 to n-m \\ Emparelhamento do if p = ts then if P [1...m] = T [s s + m] then “Padrão ocorre no deslocamento” s if s < n-m then ts+1 ← (d(ts – T[s+1]h) + T[s+m+1]) mod q Inicializa o hash(p) da palavra e do texto, hash(t) Compara caracteres da substring com a palavra, eliminando o acerto espúrio

36 Rabin-Karp

37 Rabin-Karp

38 Emparelhamento de cadeias com autômatos finitos
Notação: Um autômato finito é uma 5-tupla (Q, q0, A, ,) Onde: Q – Conjunto de estados q0 - Estado Inicial (q0  Q) A – Conjunto de estados de aceitação (A  Q)  - Alfabeto de entrada finito  - Função de transição

39 Autômato de emparelhamento
Autômato que aceita a string “ababaca”. b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

40 Autômatos e função  a b c Entrada Estado 1 2 3 4 5 6 7
1 2 3 4 5 6 7 1 2 3 4 5 6 7 i – T[i] a b a b a b a c a b a Estado (Ti)

41 Função de estado final e função sufixo
(w) – Função de Estado Final () = q0 (wa) = ((w), a) para w  *, a   (x) – Função Sufixo É o comprimento do mais longo prefixo de P que é um sufixo de x (x) = max{k: Pk  x} P = ab () = 0 (ccaca) = 1 (ccab) = 2 Para um padrão P de comprimento m, temos (x) = m  P  x

42 Função de Transição, Função de Estado Final e Função Sufixo
A função de transição  é definida pela seguinte equação, para qualquer estado “q” e caractere “a”: (q, a) = (P qa). Uma boa razão intuitiva para a definição anterior é: (Ti) = (Ti)

43 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

44 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

45 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

46 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

47 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

48 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

49 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

50 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

51 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

52 Autômato de emparelhamento
T[i ] = a b a b a b a c a b a P = a b a b a c a b, c c b b, c a b a b a b a c a 1 2 3 4 5 6 7 c a a a b, c b, c c

53 Automato de Emparelhamento
FINITE-AUTOMATON-MATCHER(T, , m) n  comprimento[T] q  0 for i  1 to n do q (q, T[i]) if q = m then imprimir “padrão ocorre com deslocamento” i-m (n)

54 Computando a função de Transição
COMPUTE-TRANSITION-FUNCTION(P, ) m  comprimento[P] for q  0 to m do for cada caractere “a”  do kmin(m+1, q+2) repeat k  k-1 until Pk  Pqa (q, a)  k return  m* m* m*|| = O(m3| |)

55 Algoritmo KMP (Knuth-Morris-Pratt)
Algoritmo de emparelhamento em tempo linear; Evita por completo o cálculo da função de transição; Evita testes de deslocamento inúteis;

56 Algoritmo KMP – Função Prefixo 
Definição: A função prefixo para o padrão P é a função: {1, 2, …, m}  {0, 1, …, m-1} tal que *[q] = max{k: k<q e Pk  Pq} Em outras palavras: [q] é o comprimento do prefixo mais longo de P que também é sufixo de Pq.

57 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

58 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

59 Algoritmo KMP (Knuth – Morris – Pratt)
Êpa! T = P = Antes do erro a string “10”foi lida no texto. Logo o padrão não precisa ser comparado com a segunda posição do texto.

60 Algoritmo KMP (Knuth – Morris – Pratt)
Êpa! T = P =

61 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

62 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

63 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

64 Algoritmo KMP (Knuth – Morris – Pratt)
Êpa! T = P = A última substring lida foi “101”. Logo o padrão pode avançar 2 posições a direita

65 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

66 Algoritmo KMP (Knuth – Morris – Pratt)
Êpa! T = P =

67 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

68 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

69 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

70 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

71 Algoritmo KMP (Knuth – Morris – Pratt)
Êpa! T = P =

72 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

73 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

74 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

75 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

76 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

77 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

78 Algoritmo KMP (Knuth – Morris – Pratt)
Ôba! T = P =

79 Algoritmo KMP (Knuth – Morris – Pratt)
T = P =

80 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

81 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

82 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

83 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

84 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

85 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

86 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

87 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

88 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

89 Algoritmo Compute-Prefix-Function
Compute-Prefix-Function(P) m  comprimento[P] [1]  0 k  0 For q  2 to m do while k > 0 e P[k+1]  P[q] do k  [k] if P[k+1] = P[q] then k  k + 1 [q]  k return  (m)  Amortizada i 1 2 3 4 5 6 7 8 9 10 P[i] a b c [i]

90 Algoritmo KMP (Knuth–Morris–Pratt)
KMP - MATCHER(T, P) n  comprimento[T] m  comprimento[P]   Compute-Prefix-Function(P) q  0 for i  1 to n do while q > 0 e P[q+1]  T[i] do q  [q] if P[q+1] = T[i] then q  q + 1 if q = m then print “ Padrão ocorre com deslocamento” i – m q  [q] (n)  Amortizada i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 P[i] a b c T[i] [i]

91 Knuth-Morris-Pratt (KMP)
Exemplo de busca em texto

92 Boore Moore Inicia a busca comparando-se os caracteres do final da cadeia; Compara as observações anteriores da cadeia, mesmo artifício do KMP; Faz uso de duas heurísticas: mau-caractere e bom sufixo; A escolha da heurística depende da sua aplicação; Texto com grande diversidade de caractere (mau-caractere);

93 Boore Moore Exemplo de busca em texto H o L a - l g i r s k e n

94 Boore Moore Exemplo de busca em texto A s T r i n g e x a m p l c o t
f . N

95 Bibliografia http://en.wikipedia.org/wiki/String_searching_algorithm
o_de_Padr%C3%B5es_em_Strings#Vis.C3.A3o_Geral Carvalho, Paulo. Oliveira, Deive. Guaracy, Alessandra. Gomes, Alisson. Albuquerque, Jones. Um Estudo Teórico e Experimental em Algoritmos Clássicos de Busca em Texto. UFLA - Universidade Federal de Lavras. Silva, Danielle. Fernandes, Carlos. Joab, Rony. Algoritmos para Busca de Padrões em Sequências. UFRPE – Universidade Federal Rural de Pernambuco. Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford. Introduction to Algorithms, second edition, MIT Press and McGraw-Hill.


Carregar ppt "String Matching Emparelhamento de Cadeias Cin – UFPE"

Apresentações semelhantes


Anúncios Google