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 :

algo sur chaine


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut algo sur chaine
    Le titre n'est pas clair, alors voici l'explication de texte :

    imaginons un fichier contenant 5000 lignes (des articles).

    Je recherche un algo me permettant d'identifier de façon unique le texte de chaque ligne sous une forme numérique ou alphanum. Là, vous allez me dire qu'il suffit de créer un index. Sauf que le fichier n'est pas indexé et que je ne peux y rajouter que des articles, et aucun champ de plus. De plus, j'ai des raisons personnelles pour ne pas créer d'index

    Le but de cet algo serait de calculer une sorte de checksum dépendant de la nomenclature de chaque article. Ainsi, si deux nomenclatures ne sont différentes ne serait-ce que d'un espace, alors les checksums seraient différents.

    Je sais que c'est un truc bizarre, mais je n'ai pas la maitrise du fichier initial (c'est celui d'un fournisseur et il est stocké sur son site de production).

    Tout ça pour me faciliter la phase de traitement de ce fichier et pour en faire une utilisation à ma sauce. Par exemple, la recherche de doublons ou autres serait plus simple (pour info, chaque article est identifié par une nomenclature comprenant de 53 à plus de mille caractères... Quand je vous dis que c'est un truc bizarre )

    Donc si quelqu'un avait ce genre d'algo, une lib/compo utilisable sous Delphi ou au moins une piste de recherche, j'en serais reconnaissant.

    PS : je suis nul en maths (4 au bac de Math, coef 9 - pas fait mieux depuis)

  2. #2
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Vous pouvez calculer la somme des codes ASCII de tous les caractères de chaque nomenclature.
    Abdeljalil A.N. Nadiri

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 221
    Points : 84
    Points
    84
    Par défaut
    Ton truc m fait penser a des problemes de cryptographie.....

    As tu pensée à utiliser des fonctions de hachage? Un hash sur l'article, et normalement si les articles sont différents, le hash sera différent....

    Avec des hash correct t'as que 1 chance sur 2^80 ou 2^160 d'avoir pour 2 articles différents un hash identique...

  4. #4
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Je pense qu'effectivement, parcourir le fichier ligne à ligne depuis delphi, et pour chaque ligne générer un hash stoqué dans un tableau, puis dédoublonner le tableau pourrait suffire.
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut
    merci pour vos conseils. Je n'ai pas les connaissances mathématiques nécessaires à l'élaboration d'une fonction de hachage (en fait, je ne sais absolument pas comment faire).

    Je me suis renseigné, et en furetant à droite/gauche, j'ai trouvé une unité "MD5.pas" utilisable sous D4. Je vais essayé de voir si je peux l'adapter à mon Delphi.

    Autrement, si quelqu'un arrive à m'expliquer en langage "mathématiques pour les nuls" la façon dont marche une fonction de hashage... j'ai regardé dans ma bibliothèque (wikipédia + google ), mais j'ai un peu de mal. J'essairais de relire tout ça à tête reposée. (les bouts de pseudo-code sont les bienvenus )

    En plus, dans tous les cas, si je crée un hash, j'ai cru comprendre qu'il me fallait un index car création d'une table...

    @Nadiri : cela n'est pas possible car certaines nomenclatures contiennent strictement les mêmes caractères, mais dans un ordre différent (ex : P15-RFPN-59 et R9N1-P-PF55)

    @Sebus : c'est quoi un hash 'correct' ? est-ce qu'on peut en obtenir un sur des chaines de moins de 100 caractères ?

    Edit :
    PS : n'y aurait-il pas quelque part des cours d'algo accessible aux débutants. j'en ai trouvé, mais à moins d'être ingénieur ou d'avoir fait math sup, c'est souvent 'raide' ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par diam's
    @Nadiri : cela n'est pas possible car certaines nomenclatures contiennent strictement les mêmes caractères, mais dans un ordre différent (ex : P15-RFPN-59 et R9N1-P-PF55)
    oui même avec une fonction de hachage plus compliquée comme :
    S=s0s1..sn-1
    h(S) = (s0B^(n-1) + s1B^(n-2) + .. + s(n-1)B^1) mod N
    (N: taille de la table de hachage, B une puissance de 2)
    la possibilité que deux nommeclatures soient associées à la même clé se présente toujours.
    La solution est de prévoir une comparaison supplémentaire pour traiter le cas des collisions(si deux nomenclautres ont les mêmes clés)

    Normalement on crée une table supplémentaire qui contient les enregsitrements ayant la même clé.
    Abdeljalil A.N. Nadiri

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    la possibilité que deux nommeclatures soient associées à la même clé se présente toujours.
    La solution est de prévoir une comparaison supplémentaire pour traiter le cas des collisions(si deux nomenclautres ont les mêmes clés)
    +1

    Pour la clé, un checksum (CRC) polynomial sur 16, 32 ou 64 bits fait l'affaire, MD5 par exemple.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/09/2005, 16h18
  2. [VB.NET] Traitement sur chaine (simple)
    Par Tempotpo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 13h20
  3. actions sur chaine
    Par ericmart dans le forum ASP
    Réponses: 2
    Dernier message: 22/12/2004, 10h03
  4. Réponses: 3
    Dernier message: 19/12/2004, 14h30
  5. [Debutant][Tableau] Tableau indexé sur chaine de caractères
    Par SamRay1024 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 11h14

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