IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

rechercher une sous-chaine dans un set de 40 000 noms


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Par défaut rechercher une sous-chaine dans un set de 40 000 noms
    Bonjour,

    Je recherche une méthode qui me permette de trouver rapidement une sous chaine ou une chaine dans un set de 40000 noms.

    Si je fais une recherche du mot "tu", je veux que mon programme trouve "turquoise", "tortue", "tu" dans un "dictionnaire" figé c'est à dire que les données dans lesquelles la recherche est faite reste inchangées d'une exécution à une autre.

    J'ai trouvé des informations sur l'algorithme de Boyer-Moore pour la recherche de sous-chaine.
    j'ai aussi trouvé les arbres binaires mais étant donné que ma recherche doit porter sur une sous-chaine qui n'est pas forcément en début de mot, je ne pense pas que cela puisse me servir.
    J'ai aussi pensé à une table de hash avec des listes chainées mais je ne vois pas sur quoi calculer ma clé de hash.

    Quelqu'un peut-il m'orienter pour choisir une structure de données adaptée pour la recherche ?
    Merci

  2. #2
    Membre chevronné Avatar de I_believe_in_code
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 219
    Par défaut
    Après avoir lu cet article :

    http://fr.wikipedia.org/wiki/Algorithme_de_Boyer-Moore

    Ainsi que les autres cités dans "articles connexes"

    Je crois pouvoir affirmer que tout ceci est très intéressant et répond sans doute à tes questions.

    L'Algorithme de Boyer-Moore est basé sur une idée que je trouve géniale. Ne convient-il pas à ce que tu dois faire ?

  3. #3
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonsoir,

    Une autre approche serait de construire un dictionnaire qui optimise les recherches partielles de lettres consécutives qui renvoient un ensemble de mots correspondants.
    Il y a évidemment l'approche naïve (et peu efficace) qui consiste à construire un arbre n-aire qui factorise les préfixes (en anglais un trie). L'étape suivante est de passer en une représentation binaire (fils gauche, frère droit) et de factoriser au possible les suffixes (en anglais un DAWG). Puis tu peux essayer un GADDAG qui prend plus de place mais facilite les «accès en milieu de mots».
    Il y a pas mal de doc et d'articles sur ce genre d'approche (citeseer et google scholar par exemple).

  4. #4
    Membre éprouvé Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Mai 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 73
    Par défaut
    Bonjour,

    comme tu a dis que tu recherche une "méthode", si tu peux placer tes mots dans une BDD alors ton problème peut se résoudre facilement avec une requête SQL :
    Select * FROM les_mots WHERE mot like "*tu*"

    C'est juste une proposition car je ne sais pas si tu as la possibilité d'utiliser une BDD.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sologne Voir le message
    Bonjour,

    comme tu a dis que tu recherche une "méthode", si tu peux placer tes mots dans une BDD alors ton problème peut se résoudre facilement avec une requête SQL :
    Select * FROM les_mots WHERE mot like "*tu*"

    C'est juste une proposition car je ne sais pas si tu as la possibilité d'utiliser une BDD.
    juste pas très efficace, je pense, en termes d'optimisation...

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Bonjour

    J'ai eu à faire ce genre de choses il y a une vingtaine d'années, avec une base de plusieurs dizaines de milliers de mots, qui ne changerait pas fréquemment.
    J'ai indexé tous les mots de la base sur la premiere lettre, la seconde etc
    Ce qui fait que j'ai 24 index et je recherche les chaînes comme je veux à partir de la premiere, la seconde... C'est très rapide.
    Evidemment, et j'insiste, il ne faut pas que la base change tous les jours (quoique maintenant, l'indexation totale doit prendre moins d'une heure).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je n'ai pas lu les aticles pointés, mais une idée comme ça, avec ta condition :

    Citation Envoyé par floopi51 Voir le message
    dans un "dictionnaire" figé c'est à dire que les données dans lesquelles la recherche est faite reste inchangées d'une exécution à une autre.
    et si tu disposes d'un tant soit peu de mémoire

    Un tableau 2D de 26 cases

    • On passe une fois dans l'ensemble du dico
    • Pour chaque lettre rencontrée, on stocke dans le tableau à l'indice correspondant la position en 2ième dimension


    Ensuite, pour chercher une sous-chaine, on va directement à la première lettre. Puis pour chaque possiiblité, on regarde avec la deuxième (par exemple avec une recherche dichotomique dans son tableau de position). etc...

    Non ??

    Enfin je sais que c'est un sujet de recherche et de travail courant, donc peut-être mon idée est-elle trop nettement simpliste...

Discussions similaires

  1. rechercher une sous chaine dans une chaine
    Par id.prog dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/01/2009, 17h59
  2. Rechercher une sous chaine dans un chaine
    Par franck06 dans le forum Access
    Réponses: 2
    Dernier message: 20/09/2006, 14h53
  3. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 13h46
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo