Hay muchos buenos recursos disponibles en internet.
Alerta
Antes de continuar, quisiera mencionar que hay grandes diferencias entre el árbol de sufijos y la matriz de sufijos. Sin embargo, construir el árbol de sufijos es un poco tedioso y lleva mucho tiempo. Además, el árbol de sufijos es un poco más lento que SA debido a la sobrecarga de las restricciones involucradas. Además, SA es una alternativa de espacio eficiente para el árbol de sufijos. Cada algoritmo de árbol de sufijos se puede reemplazar sistemáticamente con un algoritmo que utiliza una matriz de sufijos mejorada con información adicional (como la matriz LCP) y resuelve el mismo problema en la misma complejidad de tiempo. Por lo tanto, me gustaría explicar buenas fuentes para entender la matriz de sufijo, en lugar del árbol de sufijo.
Personalmente, me gustan las matrices de sufijos: un nuevo método para búsquedas de cadenas en línea, por Udi Manber y Gene Myers.
La implementación ordenada del documento anterior en C ++ se puede encontrar en TopCoder Forum .
Matrices de sufijos: un enfoque de concurso de programación es la mejor implementación / tutoriales de aplicación para matrices de sufijos en Internet.
Reúne tantos problemas como sea posible que se pueden resolver utilizando matrices de sufijos. Pasar por todos los problemas en la primera lectura parece bastante difícil para un lector que tuvo el primer contacto con matrices de sufijos al leer este documento. Con el fin de facilitar la conferencia, los problemas se arreglan en
Un orden de dificultad creciente.
- ¿Existen clases o recursos gratuitos en línea que enseñen estrategias y tácticas militares?
- ¿Cuáles son los mejores recursos gratuitos para aprender las aplicaciones de Adobe Creative Cloud?
- ¿Cuáles son los mejores recursos gratuitos para aprender Docker?
- Si no tengo experiencia en programación, ¿es recomendable primero aprender C y luego Python o puedo ir directamente a Python? Si puedo, ¿cuáles son algunos buenos recursos?
- ¿Cuáles son algunas de las fuentes que uno podría usar para aprender más sobre las personas Cajun y su cultura?
Las implementaciones en C ++ de algunos de los problemas populares de Array de sufijo están disponibles en: mi blog .
La lectura de tutoriales y algunas implementaciones no lo ayudarán a comprender esta estructura de datos avanzada ni lo ayudarán a controlar este tema. Intente seleccionar y resolver varios problemas de spoj, codechef, topcoder, etc., en el tema de matriz de sufijo / árbol.
Estos son algunos de los problemas en la matriz de sufijos que había recopilado de spoj, codechef y codeforces.
Nombre del problema Juez / Concurso Online
1 cuentas de vidrio SPOJ
2 Nuevos Substrings Distintos SPOJ
3 Stammering Aliens Live Archive2009Europe – Southwestern
4 Substrings DistintosCategorías SPOJ
5 Suffix Array SPOJ
6 I Love Strings !! UVA
7 Rotaciones mínimas SPOJ
8 SPOJ más largo de CommonSubstring
9 GATTACA UVA
10 perlas de vidrio UVA
11 Búsqueda de subcadenas lexicográficas SPOJ
12 Petr # Codeforces
Código de 13 cuerdas
14 cuerdas marcianas Codeforces
15 Eliminación de repeticiones Codeforces
16 Código de ingeniería genética
17 StringCategories Codeforces
18 pequeños elefantes y cuerdas de código
19 Fuerzas de código de misiones cíclicas
20 Fuerzas de código de cercas
21 formas de vida UVA
22 Robo de Código UVA
23 Número de palíndromos SPOJ
24 palíndromos SPOJ
25 nivel de diferencia CODECHEF
26 cuerdas repetidas CODECHEF
27 Prefijos y sufijos ACM-SGU-RU
28 Lucy y las flores CODECHEF
Implementaciones más rápidas: en general, la complejidad general de la construcción de la matriz de sufijos es O (n * log n), pero existe un algoritmo importante llamado DC3 que calcula las matrices de sufijos en el tiempo lineal O (n). Por lo tanto, las matrices de sufijos se vuelven tan efectivas como el árbol de sufijos. El código fuente de este genial algoritmo DC3 súper elegante en C ++ está disponible en las últimas páginas de este PDF . El PDF general incluye una hermosa explicación del algoritmo. DC3 siempre me ayudó a lograr el mejor tiempo de ejecución en SPOJ.
Para resolver cualquier problema de la matriz de sufijos, necesitamos saber:
- Construcción de matriz de sufijo (paso básico)
- Búsqueda de los prefijos comunes más largos entre los sufijos adyacentes (construcciones de la matriz LCP estándar)
- Encontrar el LCP entre cualquiera de los dos sufijos por RMQ utilizando una matriz de LCP estándar derivada en el paso 2.
He explicado los dos primeros pasos en uno de mis respuestas en la matriz de sufijos: http://qr.ae/TIoMQ