Matriz de sufijos

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 6 de noviembre de 2021; las comprobaciones requieren 2 ediciones .

La matriz de sufijos  es una matriz ordenada lexicográficamente de todos los sufijos de la cadena . Esta estructura de datos fue diseñada por Eugene Myers y Udy Manber como una alternativa más económica al árbol de sufijos en términos de requisitos de memoria. A menudo se usa cuando se necesitan búsquedas rápidas de subcadenas, como en la transformación Burrows-Wheeler (BWT) y como estructura de datos en un índice de búsqueda .

Ejemplo

Considere la cadena "abracadabra" de 11 caracteres de longitud.

abracadabra 1 2 3 4 5 6 7 8 9 10 11

Lista ordenada de sus sufijos:

a Abra abracadabra acadabra adábra sostén bracadabra Cadabra Dabra real academia de bellas artes racadabra

La matriz de sufijos de esta cadena es {11,8,1,4,6,9,2,5,7,10,3}, porque el sufijo "a" comienza con el carácter 11, el sufijo "abra" comienza con el carácter 8. ir, y así sucesivamente, hasta el último sufijo "racadabra", que comienza con el tercer carácter de la palabra original.

Ahora, usando esta matriz, puede encontrar fácilmente todas las subcadenas. Por ejemplo, si necesita encontrar la subcadena "ab", basta con encontrar todos los sufijos que comienzan con "ab". Al ordenar alfabéticamente, están uno al lado del otro. Usando la búsqueda binaria , encontramos los sufijos 2 y 3 "abra" y "abracadabra" que coinciden con el elemento 2 y 3 de la matriz de sufijos (8 y 1). Esto significa que la subcadena buscada "ab" aparece en el primer y octavo carácter de la palabra original.

Edificio

Se puede construir una matriz de sufijos con o sin un árbol de sufijos rellenando una cadena a una longitud cíclica de una potencia de dos y aplicándole un algoritmo específico.

A través del árbol de sufijos

  1. Construimos un árbol de sufijos para la cadena T$. Donde T es texto.
  2. En este árbol de sufijos, ejecutamos una búsqueda en profundidad con la prioridad de elegir bordes mínimos lexigráficamente.
  3. Durante la búsqueda, consideramos que $ (centinela) es el carácter lexicográficamente más pequeño.
  4. Llegada a la hoja alcanzando algún sufijo lexicográficamente más pequeño aún no considerado en ese momento, cuyo valor en la hoja, comenzando con el índice en, debe escribirse en la celda actual de la matriz de sufijos.
  5. Esto da como resultado una matriz de sufijos para todo el texto.

La complejidad de la construcción es , la línea incluye la construcción de un árbol de sufijos y una búsqueda en profundidad.

Buscar

Se puede realizar una búsqueda en una matriz de sufijos mediante una búsqueda binaria. Su peor calificación . Pero puedes acelerar hasta .

Búsqueda binaria ingenua

  • La idea de la búsqueda es que si el patrón ocurre en el texto, todos los sufijos que comienzan con en la matriz de sufijos se ubicarán uno al lado del otro.
  • Realizamos una búsqueda binaria en la matriz de sufijos y encontramos el índice más pequeño : no comienza con y el índice más grande : no comienza con ninguno de los dos .
  • Entonces la muestra viene en posiciones hasta .
  • Si hay muchos prefijos de patrones, la puntuación baja a .

Aceleración simple

  • ,  — límites del intervalo de búsqueda. Al principio , .
  • Recordamos la longitud de los prefijos , , coincidiendo con el prefijo .
  • .
  • En la próxima comparación en posición, comenzamos a procesar caracteres no desde la primera posición, sino desde .
  • Por lo general, el tiempo de trabajo , pero el peor tiempo de trabajo sigue siendo .

Aceleración vía LCP

El prefijo común más grande ( eng.  Prefijo común más grande ) - para dos cadenas ,  - la longitud del prefijo coincidente más grande.

En este algoritmo, supondremos que para cualquiera de los dos sufijos se calcula . La función se calcula en la etapa de preprocesamiento al construir un árbol. La siguiente afirmación también es cierta :

Gracias a esta función, puede optimizar la búsqueda binaria de una matriz de sufijos.

Lema : si los primeros caracteres del sufijo coinciden en los límites izquierdo y derecho ( , respectivamente, los índices de la matriz de sufijos) , entonces el mismo número de caracteres coincidirá para todos los sufijos en el segmento .

  1. , , , . Los siguientes casos son posibles
    1. .
      1. Compara el sufijo in con el patrón en posición .
      2. El sufijo es lexicográficamente mayor o igual y ocurrió una discrepancia en la posición del sufijo (si hay una coincidencia lexicográfica y , entonces lo consideramos igual a ), luego cambiamos los límites de búsqueda: .
      3. De lo contrario, cambie los bordes de esta manera: .
    2. . Comprobamos _
      1. . En este caso, después de la posición en el sufijo en la posición , sigue un número de caracteres iguales a los de , que no coinciden con el patrón (si lo hicieran, habría más). Por lo tanto, debe cambiar los límites de la siguiente manera: .
      2. , esto significa que después de la posición en el sufijo, la posición es seguida por una discrepancia con algunos caracteres del prefijo , y la mayoría de las coincidencias con el patrón están contenidas en el segmento, lo que significa que definitivamente no habrá ocurrencias de el patrón en el segmento. Necesita cambiar los bordes de la siguiente manera: .
      3. , esto significa que en el segmento los primeros caracteres de todos los sufijos coinciden y es imposible saber inmediatamente a qué subsegmento ir. Para resolver esto, es necesario comparar con el patrón los caracteres que  siguen a la posición en el sufijo. Si es lexicográficamente menor o igual que y hay una discrepancia en la-ésima posición (si hay una coincidencia lexicográfica y, entonces consideramos igual ), entonces cambiamos los límites de la siguiente manera:, ,; de lo contrario ( lexicográficamente mayor): , ,.
    3. . Verificamos y comparamos con como en el paso anterior, pero cambiamos a y a .
  2. El algoritmo funciona hasta y se igualan . Esto significa que hay un segmento de coincidencia. Si no se cumple el invariante , entonces no hay patrón como subcadena en el texto.

Tal superaceleración da tiempo , ya que se realizan iteraciones sobre la matriz de sufijos.

Algoritmos relacionados

Véase también

Enlaces

Literatura