Me gustaría un algoritmo (o biblioteca) eficiente que pueda usar en Java para buscar subcadenas en una cadena.Algoritmo rápido para buscar subcadenas en una cadena
Lo que me gustaría hacer es:
Dada una cadena de entrada - INSTR:
"BCDEFGH"
Y un conjunto de cadenas de candidatos - CAND :
"AB", "CDE", "FG", "H", "IJ"
: todas las CAND cadenas que coinciden como subcadenas dentro INSTR
En este ejemplo coincidiría con "CDE", "FG" y "H" (pero no con "AB" y "IJ")
Podría haber miles de cadenas candidatas (en CAND), pero lo más importante es que haré esta búsqueda muchos millones de veces, así que necesito que sea RÁPIDO.
Me gustaría trabajar con matrices de caracteres. Además, no estoy probado en soluciones arquitectónicas, como distribuir la búsqueda, solo la función/algoritmo más eficiente para hacerlo localmente.
Además, todas las cadenas en CAND y INSTR serán relativamente pequeñas (< 50 caracteres), es decir, la cadena de destino INSTR NO es larga en relación con las cadenas candidatas.
actualización debería haber mencionado, el conjunto de cadenas CAND es invariante en todos los valores de INSTR.
Actualización Solo necesito saber que hay una coincidencia, y no necesito saber cuál fue el partido.
Informe final de actualización que optamos por tratar AhoCorsick y Rabin-Karp, debido a la simplicidad de implementación. Como tengo patrones de longitud variable, utilicé un Rabin-Karp modificado que hash los primeros n caracteres de cada patrón, donde n es la longitud del patrón más pequeño, N fue entonces la longitud de la ventana de búsqueda de mi subserie móvil. Para el Aho Corsick que utilizan this
En mi prueba Busqué 1000 patrones en dos documentos de artículos de prensa de papel, promediados entre 1000 iteraciones etc ... tiempos normalizados para completar eran:
AhoCorsick: 1
RabinKarp: 1.8
Naive Buscar (marque cada string.contains patrón de uso &): 50
* Algunos recursos que describen los algos mencionados en las respuestas a continuación:
http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module5/module5.html
http://www.cs.princeton.edu/courses/archive/spr09/cos226/lectures/18SubstringSearch-2x2.pdf
http://www-igm.univ-mlv.fr/~lecroq/string/index.html *
BTW - esto NO es tarea, ¡pero es un problema del mundo real! – Joel
¿Cuánto duran las cadenas de entrada en relación con las cadenas candidatas? –
Son cortos. Las cadenas de entrada suelen tener menos de 40 caracteres, al igual que las cadenas candidatas. – Joel