Algorithme rapide pour la recherche de sous-chaînes dans une chaîne de caractères

J'aimerais un algorithme efficace (ou bibliothèque) que je peux utiliser en Java pour la recherche de sous-chaînes dans une chaîne de caractères.

Ce que je voudrais faire c'est:

Donné une chaîne d'entrée - INSTR:

"BCDEFGH"

Et un ensemble de candidats cordes - CAND:

"AB", "CDE", "FG", "H", "IJ"

Trouver tout CAND chaînes qui correspondent comme des sous-chaînes dans INSTR

Dans cet exemple, je pourrait correspondre à "CDE", "FG" et "H" (mais pas "AB" et "IJ")

Il pourrait y avoir plusieurs milliers de candidats des chaînes de caractères (ACDN), mais plus important encore, je vais faire cette recherche plusieurs millions de fois, donc j'ai besoin d'être RAPIDE.

J'aimerais travailler avec des tableaux de char. Aussi, je ne suis pas intested dans les solutions architecturales, comme la distribution de la recherche - tout le plus efficace de la fonction/l'algorithme pour le faire localement.

En outre, toutes les chaînes de CAND et INSTR seront tous relativement faible (< 50 caractères) - c'est à dire la chaîne de caractères de l'INSTRUMENT n'est PAS longue par rapport à la candidat à cordes.


Mise à jour je devrais l'avoir mentionné, l'ensemble de l'ACDN chaînes est invariant à travers toutes les valeurs des INSTR.

Mise à jour j'ai seulement besoin de savoir qu'il y avait un match et je n'ai pas besoin de savoir ce que le match a été.

Dernière Mise À Jour
J'ai opté pour tenter AhoCorsick et de Rabin-Karp, en raison de la simplicité de mise en œuvre.
Parce que j'ai de longueur variable des modèles, j'ai utilisé une version modifiée de Rabin-Karp qui hache les n premiers caractères de chaque modèle, où n est la longueur du plus petit modèle, N est la longueur de mon roulement de chaîne de fenêtre de recherche.
Pour l'Aho Corsick j'ai utilisé cette

Dans mon test j'ai cherché pour 1000 modèles dans les deux documents news articles en papier, en moyenne sur 1000 itérations etc...
Normalisé fois pour terminer étaient:

AhoCorsick: 1

RabinKarp: 1.8

Naïf de Recherche (vérifiez chaque motif & utiliser des chaînes de caractères.contient): 50


*Certaines ressources décrivant les algos mentionnés dans les réponses ci-dessous:

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*

  • Combien de temps sont les chaînes d'entrée par rapport à la candidat à cordes?
  • Ils sont courts. Les chaînes d'entrée sont généralement moins de 40 caractères, que les candidats sont des chaînes de caractères.
  • mais il peut y avoir plusieurs milliers de candidats cordes, et je veux le faire à plusieurs reprises sur de nombreuses chaînes d'entrée des millions de fois.
  • Étant donné les détails d'un FSM est probablement votre meilleur choix.
  • Curieux de savoir à quoi vous attendre en tant que sortie. C'est de savoir que l'un a été trouvé assez bon ou avez-vous besoin de savoir ce qui a été trouvé? Avez-vous besoin de savoir combien de fois chaque sous-chaîne a été trouvé?
  • Oui, un match est assez bon avec un simple "vrai/faux" et pas les autres informations nécessaires.