VinBR

AEDs III 28/03/2011

Mar 6th, 2012
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.04 KB | None | 0 0
  1. TP0
  2.  
  3. kemey-young
  4. -malloc(), free() tambem terá Makefile
  5.  
  6. -Resenha
  7.  
  8. Vai sair hoje!
  9. Data de entrega 08/04/2011
  10.  
  11.  
  12. Makefile
  13.  
  14. regra: dependencia
  15. comando
  16. executavel, executavel.cpp
  17. gcc executavel.cpp -o executavel
  18.  
  19. Ja foi definido que havera uma resenha para esta aula.
  20.  
  21. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  22.  
  23. Revisão da ultima aula:
  24. // Basicamente ele falou do KMP, e colocou a o significado da sigla, que anotei ai embaixo
  25. KMP = Kmuth-Moris-Prett
  26.  
  27. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  28.  
  29. // O professor começou a falar desse novo algoritimo de casamento de padrão
  30. // Uma nota é que a explicação dele foi bem confusa hoje, eu tive que pesquisar tudo na internet depois.
  31.  
  32. BOYER-MOORE-HORSPOOL - Boyer-Moore-Horspool
  33.  
  34. - O(n/m), pior caso O(nm), melhor caso O(n/m)
  35.  
  36. - As comparações são feitas da direita p/ esquerda.
  37. - Deslocamento é feito da esquerda para direita.
  38. - É criada uma tabela de deslocamentos, analoga à tabela <pi> do KMP.
  39. - É um algoritimo mais simples o que o diferencia do KMP e um pouco mais eficiente.
  40.  
  41. Como Funciona?
  42.  
  43. // começando com uns conceitos que eu vou usar para explicar:
  44. Vamos chamar de "janela" o trecho do texto T que está atualmente sendo comparado com P.
  45.  
  46. // Só revendo um detalhe estrutural do algoritimo
  47. Como dito nas notas acima, o deslocamento da janela ocorre no sentido de leitura,
  48. enquanto as comparações ocorrem no sentido contrario.
  49. // Eu pensei um pouco sobre a necessidade dessas comparações no sentido contrario, e realmente não vi muita necessidade =/
  50. // pra mim eu poderia fazer as comparações no sentido normal e ia funcionar identicamente.
  51. // mas sei lá neh, vai ver o algoritimo que eu achei na internet num ta 100% fiel.
  52.  
  53. // Agora sim a explicação:
  54.  
  55. O grande "chan" do algoritimo é uma tabela um pouco analoga à tabela <pi> do KMP, é uma tabela que indica o numero de
  56. deslocamentos que são seguros de se fazer após o fim de comparações, sabendo que "tal caractere" está em tal posição.
  57.  
  58. No caso especifico desse algoritimo, o "tal caractere" é sempre o último da janela de comparação.
  59. A partir dele, se ele não for igual, a nem um dos caracteres do padrão P de comprimento m,
  60. eu posso assumir que é seguro eu deslocar m casas para frente.
  61. Porque concerteza aquele caractere não pertence a palavra, então vou tentar algo pra frente dele.
  62.  
  63. Caso ele pertença a palavra, então eu tenho que deslocar um tanto de modo que
  64. a posição do caractere na janela e a posição do caractere no padrão sejam a mesma, depois tento comparar de novo.
  65. Obviamente isso da errado a maioria das vezes, mas funciona até melhor que a tabela <pi> do KMP.
  66.  
  67. // Bom é esse ai o BMH, o chan dele é uma tabela melhor que a tabela <pi> e melhor também que o sistema
  68. // de O(n) do automato, já que no melhor caso e também no caso medio esse algoritimo é O(n/m), bom né?
  69.  
  70. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  71.  
  72. Shift-And
  73.  
  74. - Paralelismo de bit
  75.  
  76. - Simulação de um autômato não determinista.
  77.  
  78.  
  79. Seguinte a ideia é simular um automato não determinista de modo que voce pode estar em multiplos estados ao mesmo tempo.
  80. Isso é feito da seguinte maneira,
  81. uma vez que o estado inicial representa uma palavra vazia e cada estado subsequente do automato representa uma letra da palavra uma vez que o ultimo estado é atingido é encontrado um padrão.
  82.  
  83. Para a parte não determinista, ao invez de se guardar quais estados estão funcionando em um inteiro cada estado,
  84. o que exigiria varios inteiros e varias operações para atualizar cada estado,
  85. guarda-se os estados ativos em um arranjo de bits chamado "R" onde o indice do bit indica qual é o estado
  86. e o bit estar 1 indica que ele está ativo, permitindo que todas as operações de atualização dos estados ativos sejam feitos
  87. em uma unica operação de processador. Bem engenhoso né?
  88.  
  89. Percebam então que isso funciona para palavras menores que a word do sistema sobre qual elas rodam. Hoje em dia isso significa
  90. palavras de 32 ou 64 caracteres.
  91.  
  92. O sistema em sí funcoina da seguinte forma: A principio o estado "palavra vazia" está sempre ativo sendo então sempre igual a 1.
  93. o que faz com que inicialmente R seja igual a "100000" para uma palavra de 5 letras e um automato consequente de 6 estados.
  94. Antes de ler uma nova letra, arrasta-se o arranjo para a direita R>>1 de um bit, e o estado lambida é igualado a 1 novamente.
  95. Deixando R = "110000". Isso faz do estado vazio e estado 1 ativos.
  96. Agora vamos usar um arranjo M que possui um arranjo de bits para cada letra do alfabeto. Cada arranjo confirma a quais estados é possivel se chegar lendo-se aquela letra.
  97.  
  98. Portando se a palavra é "teste", M[ 't' ] = "010010". Indicando que é valido chegar-se ao estado 1 ou 4 lendo-se t.
  99.  
  100. Agora fazemos a magica, vamos supor que lemos a letra 't', já que R = "110000", e M['t'] = "010010" nós precisamos confirmar se realmente o estado 1 deve continuar ativo. Se a letra não for t ele não continuar ativo, se for ele deve continuar.
  101. Fazemos isso comparando o R="110000" & M['t']="010010" resultando no novo R = "110000", e reiniciando o processo.
  102.  
  103. O que acontece então é que nos vamos caminhando com os estados sempre ativos a partir do estado "vazio" e desativamos aqueles que não forem possíveis usando a operação de &. Se o estado caminhar ativo ate a ultima posição necessariamente as letras t,e,s,t,e foram lidas ocasionando um casamento de padrão. Extremamente interessante não?
  104.  
  105. Bem simplificando todo este texto que escrevi, e ja tendo em mente como M e R devem ser preenchidos inicialmente
  106. a equação que atualiza o valor de R é:
  107.  
  108. R' = ((R>>1) | 2^(m-1)) & M[t[i]]; // (só lembrando m minusculo é o comprimento do padrão, no caso de teste é 5)
  109.  
  110. R>>1 faz o caminhamento dos estados
  111. | 2^(m-1) recoloca o 1 no bit do estado vazio.
  112.  
  113. então o & M[t[i]] (sendo t[i] o caractere do texto lido atualmente) faz o check up de quais estados podem continuar ativos.
Advertisement
Add Comment
Please, Sign In to add comment