title: Algoritmo Karp-Rabin
text: # Algoritmo Karp-Rabin
  
  Es un Algoritmo de búsqueda de subcadenas simple enunciado por Michael Oser Rabin y Richard Manning Karp en 1987. Este algoritmo se basa en tratar cada uno de los grupos de m caracteres del texto (siendo m el número de símbolos del patrón) del texto como un índice de una tabla de valores hash (la llamaremos tabla de dispersión), de manera que si la función hash de los m caracteres del texto coincide con la del patrón es posible que hayamos encontrado un acierto. para verificarlo hay que comparar el texto con el patrón, ya que la función hash elegida puede presentar colisiones.
  
  La función hash tiene la forma $d(k)=x_{k}\mod d$ donde $d$ es un número primo grande que será el tamaño de la tabla de dispersión y $x_{k}$ se calcula de la forma indicada más abajo.
  
  Para transformar cada subcadena de $m$ caracteres en un entero lo que hacemos es representar los caracteres en una base $B$ que en el planteamiento original coincide con el tamaño del alfabeto. Por tanto el entero $x_{i}$ correspondiente a la subcadena de texto $C_{i}\ldots C_{i+m-1}$ sería:
  
  $x_i=C_i×B^{m-1}+C_{i-1}×B^{m-2}+...+C_{i+m-1}$
  
  podemos calcular el valor de $x_{i+1}$ en función de $x_{i}$.
  
  $x_{i+1}=x_i×B-C_i×B^m+C^{i+m}$
  
  Es decir, si la cadena es un número en base B, el nuevo valor será el resultado de multiplicar por la base el valor anterior eliminado el dígito de mayor peso (ya que no está en la cadena) y añadiendo como componente de menor peso el valor del nuevo símbolo.
  
  Siguiendo este planteamiento, y dependiendo de la longitud del patrón, el $x_{i}$ podría superar el rango de enteros representable por el computador. Para que esto no suceda se usa la función módulo (resto de la división). Como la función módulo es asociativa, podemos calcular el $x_{i+1}$ incrementalmente a partir de cada $x_{i}$.
  
  Ejemplo de Implementación
  
  