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 :

Double boucle imbriquée pas assez rapide.


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut Double boucle imbriquée pas assez rapide.
    Bonjour à tous,

    But : Je cherche à faire des regroupements de termes (mots, ou ensemble de mots) suivant leur ressemblance.

    Mon problème n'est pas dans le calcul de ressemblance mais plutôt dans les deux boucles que j'effectue et qui à mon avis n'optimise pas du tout mon programme.

    Hyp :
    - un terme peut avoir plusieurs équivalents
    - un équivalent peut se retrouver dans plusieurs groupes

    J'utilise une liste d'objet, chaque objet est défini de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    KW = TObject
      Name : chaine; // Nom du terme
      Code : chaine; // Codification du terme (algo soundex)
      lKWEq : Liste de KWEq; // Liste des termes équivalents
    end;
     
    KWEq = TObject
      Name : chaine; // Nom du terme équivalent;
      Code : chaine; // Codification du terme equivalent (algo soudex aussi)
    end;
    List_KW = TList;

    Et voici maintenant comment je fais mes boucles, (je n'ai pas mis la création des objets dans les boucles pour éclaircir le code) :

    Une première Pass, qui n'est pas montrée ici, calcul les codes de chaque termes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    For i := 0 to List_KW-1 do
    Begin
      oKW:=List_KW[i];
      For j:=0 to List_KW-1 do
      Begin
        pKW:=List_KW[j];
        IF oKW.Code = pKW.Code then
        Begin
          eqKW.Name:=pKW.Name;
          eqKW.Code:=pKW.code;
          oKW.lKWEq.Add(eqKW);
        End;
      End;
    End;
    Mais voilà, c'est :
    1. Assez long en temps de traitement
    2. Il y a de la redondance dans les résultats, c'est à dire que je retrouve plusieurs groupes ayant les mêmes équivalents (normal quoi , au vu de ma boucle)

    Avez vous des conseils à me donner, ou même mieux une solution moins coûteuse en temps d'exécution.

    D'avance merci à tous pour vos conseils,

    Amicalement,
    Bruno

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Peut être indexer la liste traitée par la boucle extérieure par les codes.
    Ensuite les mots clés sont regroupés par codes équivalents.
    Tu parcoures ta liste de code en code et non de KW en KW si pour le premier tu rencontres un équivalent tu rajoutes TOUT le groupe (jusqu'au prochain code).
    Maintenant il faut voir le temps d'indexation (au mieux nlog(n)).
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    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
    Une solution simple et performante consisterait à trier la liste en fonction des codes.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Ne me dis pas que personne ne t'as jamais conseillé d'allez voir du côté de Union-Find

    La structure de donnée ressemble à un arbre d'héritage (c'est-à-dire un arbre n-aire inversé). Algorithmiquement il y a une optimisation dite de compression des chemins.

    Voir le chapitre IX. Le type partition du cours de Denis Lapoire.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

Discussions similaires

  1. Création double boucle : boucles imbriquées
    Par freygeo dans le forum SAS Base
    Réponses: 5
    Dernier message: 29/06/2012, 14h41
  2. [XL-2010] Boucles imbriquées très simples : ne fonctionne pas
    Par funkyspirit dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2012, 11h58
  3. je comprends pas les (boucles imbriquées)
    Par nitch01 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 08/11/2009, 15h57
  4. [XSLT] Boucles imbriquées qui ne marchent pas :s
    Par Fatjo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/10/2007, 10h35
  5. Réponses: 20
    Dernier message: 01/12/2006, 22h29

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