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 :

Meilleur algorithme de recherche de chaine?


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut Meilleur algorithme de recherche de chaine?
    Bonjour,

    Je souhaiterai implémenter un algo de recherche qui me renverrai true si il a trouvé la chaine de caractère que je lui ai passé en paramètre dans ma base de donnée de mots.(une sorte de dictionnaire).

    Il faut que ça soit le plus optimiser possible, donc très rapide tout en requierant le minimum d'espace mémoire. (je sais, c'est beau de rèver )

    Et également, comment organiser la base de donnée pour qu'elle soit optimiser pour l'algorithme. Par exemple, ranger les mots par leur longueur et en plus dans l'ordre alphabétique?

    Merci par avance.

    PS:Attention, je parle bien de chaine et pas de sous-chaine, il faut, si il existe qu'il me trouve le mot recherché pil poil tel que je lui ai donné

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    ce que tu demandes est implémenté dans les dictionnaires electroniques : une table de hashage !!!

    - Recherche en O(1).
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    ok, merci, mais je pensais plutôt utiliser un vecteur dynamique car une table de hachage c'est pour faire un vrai dictionnaire, genre mot / définition. Quand j'ai parlé d'une sorte de dictionnaire, je voulais dire, juste des mots.

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    de memoire, pour avoir un resultat optimal il faut transformer la chaine a rechercher en un automate fini. par exemple, si tu recherche dans un texte une chaine sans repetiton, tu peux passer en O(n) facilement. exemple : chercher abc dans ababc.



    tu compares a et a, c'est bon, tu compare b et b c'est bon. tu compares c et a, la ca coince. dans l'approche naive, tu te decalerais jste d'un cran, et tu comparerais a et b, or comme tu sais qu'il n'y a pas 2 lettres identiques dans la chaine recherhée, tu pex directement passer a la comparaison de a et a... c'est pas clair ?? j'essaie de detailler.

    1
    a b a b c
    a b c -> pas bon

    2
    a b a b c
    a b c -> pas bon, mais tu le savais deja vu que a!=b donc tu pouvais passer direct a

    2 bis
    a b a b c
    a b c -> c'est bon, soit 2 etapes au lieu de 3.

    en gros, tu n'a jamais a revenir en arriere.

    l'idee est donc d'etendre ca en transformant ta chaine en automate pour sauter des etapes.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    oui, ok, mais moi, c'est plus simple que ça puisque je ne cherche pas une sous-chaine dans une chaine, je veux juste savoir si le mot que je passe en paramètre est dans ma base de mots.

    si j'envois le mot abc, et que je rencontre le mot abca ou dabc, c'est pas bon, c'est bon que quand je rencontre abc et rien d'autre.

    Là où je me pause des questions, c'est sur la manière de ranger ma base et comment faire mes recherches, sachant que j'aurai des milliers de mots et il faut donc que ça soit le plus optimisé possible.

    On pourrai juste les ranger par ordre alphabétique, puis chercher dedans, mais je pensais à ranger mes mots par leur longueurs, et chaque groupe de mots de même longueurs serait rangés dans l'ordre alphabétique, déjà, cela pourrait certainement améliorer la recherche, puisqu'on récupere la longueur du mot passer en parametre et on cherhche dans le bon groupe.

    Maintenant, je me demande dans quoi stocker ma base (vecteur dynamique?) et quel algo serait le plus approprié pour la recherche.

  6. #6
    Membre régulier
    Homme Profil pro
    Analyste
    Inscrit en
    Août 2003
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste
    Secteur : Services de proximité

    Informations forums :
    Inscription : Août 2003
    Messages : 85
    Points : 87
    Points
    87
    Par défaut
    Les meilleurs moteurs de recherche sont basés sur les expressions régulière il me semble...
    Air startout

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Est-ce que tu as regardé les tries.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    J'ai déjà vu utiliser une structure en arbre (chaque noeud représente une lettre, on a un indicateur sur chacun pour savoir si un mot se termine en ce noeud, la profondeur correspond à la position de la lettre dans le mot).
    Bref, je ne me souviens plus du nom en français ("écorché" ? pas retrouvé sur google), mais ça ressemble beaucoup au lien que propose Jean Marc Bourguet.
    Pour ce qui est de la table de hashage, arriver à une complexité en O(1) me paraît très suspect??

  9. #9
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut pour ce que j'en sais
    Juste pour confirmer que dans une table de hachage la recherche de l'existance d'un élément est bel et bien en O(1) vu qu'il recherche l'élément en codant la clef et qu'il peut retrouver de façon immédiate si cette clef se trouve dans la table. C'est bien du O(1)
    De plus moi je te dirai pour ton problème si tu ne veux pas utiliser de table de hachage (qui me parait être pourtant une bonne idée) de trier ta table tout d'abord en fonction de la taille des mots, puis dans l'ordre alphabétique pour les mots de même longueure, et comme ça quand tu recherche un mot, tu fais une dichotomie rapide sur la partie de la table dont les mots ont la même longueure que celui que tu recherches. Complexité de la recherche O(log(n)) et encore vu que tu ferais une recherche uniquement le nombre de mots de même longueure que le tien.
    Enfin je pense qu'il y a mieux, vu que le tri serait pas mal conséquent à mettre en oeuvre, mais pour la recherche c pas trop mal.
    tout le monde est différent sauf moi

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par lyxthe
    il peut retrouver de façon immédiate si cette clef se trouve dans la table.
    je ne vois pas trop comment retrouver ca de facon "immediate".... si j'ai 50 000 clé et que je recherche un element, va bien falloir que je fasse quelque comparaison par ci par la... bref c'est bien beau de coder l'element a chercher et de passer par la cle, il y a bien des cas ou ca accelere, mais ca ne change rien au fait que tu doives faire une rechercher, le bon element ne sort pas par magie

  11. #11
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut non non
    de mémoire dans une table de hashage, c'est comme si t'avais un tableau derriere dont seule les cases correspondant au numéro de la clef sont remplies. Dans un tableau normal tu peux accéder directement à la case numéro 10. genre y = T[10] se fait en O(1). Et bien dans une table de hachage, y=T['toto'] se fait en O(1) aussi. Donc savoir si 'Toto' est une clef de la table se fait aussi en O(1). donc si tu places tes mots en tant que clefs de la table, tu sais directement si un mot est présent.
    Enfin je crois, je suis pas super sur de moi mais il me semble que c'est comme ça que ça se passe dans les tableaux associatifs et dans les tables de hachage
    tout le monde est différent sauf moi

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    Un petit exemple pour expliquer la raison de mon doute : si ton algo de hashage code associe un nombre de 128 bits à ton mot et que tu veux avoir une case par valeur, alors il te faudra 2^128 cases à ton tableau pour une complexité en O(1).
    Sans compter par ailleurs le coût de ta fonction de hashage...

  13. #13
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    en fait, pour qu'on ai du O(1), il faudrait avoir plus ou moins une correspondance exacte entre une clé et une adresse memoire.. ce qui est surment possible dans certaine cas particulier, mais pas du tout en général.

  14. #14
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    On a du O(1) en amorti avec une bonne fonction de hachage et un ensemble de clé qui n'est pas spécifiquement conçu pour tirer parti de cette fonction de hachage... Si on connait d'avance l'ensemble des clés, il est même possible de calculer une fonction de hachage parfaite, où toute les clés ont des hachages distincts. Bien sûr, il s'agit de O(1) en nombre d'accès à la table, le calcul de la fonction de hachage en lui-même est en O(n) par rapport à la longueur de la clé.

    Néanmoins dans le cas particulier d'un ensemble de mots, un trie me paraît une très bonne solution également.

    (les tables de hachages ont différentes stratégies pour gérer les cas de collision, par exemple chaque emplacement contient une liste chaînée de paires (clé,valeur), les collisions ralentissent la structure, mais avec une bonne fonction de hachage et une taille du tableau sous-jacent raisonnable, les collisions sont très rares)

    --
    Jedaï

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    Citation Envoyé par Jedai
    Si on connait d'avance l'ensemble des clés, il est même possible de calculer une fonction de hachage parfaite, où toute les clés ont des hachages distincts.
    Si j'ai bien compris, une fonction de recherche de la position selon un critère de tri d'une clé parmi toutes les possibles est alors considérée comme un fonction de hashage parfaite (association clé<->No ordre)!
    Par curiosité, est-il possible de faire mieux dans le cas général ? (et cette question a-t-elle un sens ??)

  16. #16
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut ben a priori non
    T'auras beau chercher, dans l'informatique et l'algorithmie normale (tant que les physiciens n'interviennent pas avec leur ordinateur quantique ou autre :p ), tu n'auras jamais mieux qu'un accés immédiat (donc en O(1)) à une donnée. Après c'est au niveau matériel que ça joue. Mais au niveau compléxité O(1) c'est le mieux vu que c'est immédiat....Enfin si j'ai bien compris ta question
    tout le monde est différent sauf moi

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    En fait, c'est au niveau de la correspondance fonction de hashage<->fonction de recherche que je pensais.
    Une fonction de hashage "idéale" (accès en O(1)) semble limitée dans le cas général dans sa complexité à la complexité de recherche d'un élément dans un ensemble sous une relation d'ordre total (log(n)?) au minimum.
    Mais je me comprends...

  18. #18
    Membre régulier Avatar de lyxthe
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 115
    Points : 90
    Points
    90
    Par défaut je crois que tu confonds
    Si je dis pas de bêtise, je crois que tu confonds, sinon c'est moi qui confond :p , toujours est-il que la fonction de hashage ne trouve pas un resultat en O(1), la fonction de hashage code ta clef. Une fonction de hashage idéale codera tes clefs de tels façon qu'il n'y aura pas besoin de gérer les éventuels doublons de clef. Mais c'est bien ta fonction de recherche qui se fait en O(1) pour une fonction de hashage parfaite justement parce qu'il n'y a pas de doublons de clefs. (Enfin je sais qu'il ne peut pas y avoir de doublon de clefs de toute façon, ce que je veux dire c'est qu'il n'y a pas possibilité pour la fonction de hashage de renvoyer deux fois le même résultats pour deux mots différents si elle est parfaite). J'espere m'être fait comprendre.
    Quoiqu'il en soit, que la fonction de hashage soit parfaite ou non, une recherche dans une Hash table se fera en quasi O(1) plus une broutille pour les cas où la fonction de hashage renvoit deux valeurs identiques pour deux mots différents.
    Alors effectivement la recherche dans une hash table pourrie avec une fonction de hashage la pire qu'on puisse imaginer et qui donnerait toujours le même résultat quelque soit le mot à coder, peut bel et bien prendre n opérations, mais ça n'arrive pas. L'accés à une donnée dans une table de hashage est considéré comme étant un accés en O(1) quelque soit la fonction.

    A moins que je ne m'embrouille .... ?
    tout le monde est différent sauf moi

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    J'ai très bien compris, mais ma remarque n'est pas très clairement exprimée (pourtant il paraît que qui se conçoit bien s'énonce clairement, donc le doute subsiste ). J'ai bien fait la distinction entre complexité de l'accès et complexité de calcul du hashage, ce que tu sembles ne pas faire.
    Quoiqu'il en soit, ça n'a pas grand rapport avec la question initiale, qui a reçu une réponse appropriée.

  20. #20
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par borisd
    En fait, c'est au niveau de la correspondance fonction de hashage<->fonction de recherche que je pensais.
    Une fonction de hashage "idéale" (accès en O(1)) semble limitée dans le cas général dans sa complexité à la complexité de recherche d'un élément dans un ensemble sous une relation d'ordre total (log(n)?) au minimum.
    Mais je me comprends...
    Tu es bien le seul, exprime toi clairement !!

    Je cite les morceaux de ta phrase dépourvus de sens :
    "limitée dans sa complexité à la complexité de..." ??
    "la complexité de recherche d'un élément dans un ensemble sous une relation d'ordre total" ?? Elle dépend de la structure de donnée (un "ensemble" peut-être représenté de diverses façons), et peut aller de O(1) à O(n) (n étant le nombre d'éléments de l'ensemble).
    "Relation d'ordre total (log(n))" ?? Qu'est que ce log(n) fout là ? Si c'est une complexité, met au moins un o() ou un O().

    --
    Jedaï

Discussions similaires

  1. meilleur algorithme de recherche
    Par momedalhouma dans le forum Général Java
    Réponses: 2
    Dernier message: 08/05/2013, 11h23
  2. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04
  3. Recherche de chaine (TFindDialog)
    Par PoOky dans le forum Composants VCL
    Réponses: 10
    Dernier message: 30/08/2005, 07h59
  4. Recherche de chaine ...
    Par Metal3d dans le forum C
    Réponses: 8
    Dernier message: 27/07/2002, 01h20
  5. Algorithme de recherche de chemin
    Par amelie gaya dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 09/06/2002, 15h29

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