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

C++ Discussion :

Utilisation de la fonction HeapSort (algorithme de tri)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Par défaut Utilisation de la fonction HeapSort (algorithme de tri)
    Bonjour à tous,
    Alors là je suis en train de me prendre la tête pour trier des arrêtes d'un maillage.
    En fait, le but du jeu c'est que, sur un maillage triangulaire, je récupère toutes les arrêtes du maillage. Mon idée est de récupérer les trois arrêtes de chaque triangle et ensuite d'enlever les doublons (le maillage est évidemment conforme).
    Chacune des arrêtes est définie par deux points A et B par exemple numérotés par le couple (a, b)

    Pour enlever les doublons mon idée était de trier les a par exemple (avec la fonction HeapSort) et après il est facile par comparaison des lignes successives du tableau d'enlever les doublons.

    Problème je peux trier les a mais comment garder le b qui forme un couple avec a?

    Si quelqu'un a une idée...
    Merci.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Rend a et b dépendants l'un de l'autre...

    Soit en créant une structure particulière qui représente une arrête (mais dont la comparaison pour le tri ne s'intéresse qu'à a), soit, pourquoi pas, en utilisant tout simplement une std::pair, dont le premier élément serait a et le second serait b

    [EDIT]l'avantage d'une "spécialisation" de la std::pair, c'est que, si tu te sert de cette spécialisation comme clé d'un conteneur associatif (set ou map), il ne pourra plus y avoir que une seule fois [point1, point2] dans l'ensemble (mais [point2,point1] reste possible :p)

    Dés lors, le simple fait d'ajouter les différentes arrêtes dans le conteneur supprimera les doublons

    Mais sous-entend que tu as un predicat "less" pour ton point
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Par défaut
    Tout d abord merci pour tes réponses. Ensuite, pourquoi il n y aurait plus de doublons en utilisant ta méthode?? Et qu est ce qu un prédicat "less"?

    Merci...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Parce que le propre des conteneurs associatifs est que leur clé est unique...

    Pour te permettre de savoir ce qu'est un prédicat, je préfère te réorienter vers l'entrée de la FAQ correspondante, ainsi que vers l'entrée précédente.

    Si je te parle de "less", c'est parce que les différents algorithmes de tri de la STL utilisent ce prédicat particulier, qui signifie "plus petit", pour travailler.

    Il faut noter que c'est le seul prédicat réellement utilisé, ainsi, la STL considère que:
    • Si a n'est pas plus petit que b et que
    • b n'est pas plus petit que a alors
    • a est égal à b

    Dés lors, si tu permet à ton point de répondre à la question "es tu plus petit que l'autre point ", ton point pourra servir comme clé dans un conteneur associatif

    Il faut cependant prendre en compte le fait que, si tu a deux points a et b, l'arrete [a,b] et l'arrete [b,a] seront être considérées comme étant différentes si elles servent de clé dans une std::pair.

    Selon que tu considère que deux arrêtes sont identiques si elle ont seulement la même orientation ou qu'elles sont identiques si elles ont la même orientation et la même direction, il n'est pas impossible que tu doive mettre en place une vérification de l'existence d'une permutation entre a et b
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 87
    Par défaut
    Merci encore.

    Mais le fait que deux arretes identiques sont "différentes" selon leurs orientations me dérange un peu... Alors j ai écrit une nouvelle version de HeapSort:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    template<class T>
    void  HeapSort(T *c,long n) // on a un tableau sur lequel on travaille par adresse memoire
    {
      long l,j,r,i;
      T crit;
      c--; // on decale de 1 pour que le tableau commence a 1
      if( n <= 1) return;
      l = n/2 + 1;
      r = n;
      while (1) { // label 2
        if(l <= 1 ) { // label 20
          crit[0] = c[r][0];
          c[r--][0] = c[1][0];
          crit[1] = c[r][1];
          c[r--][1] = c[1][1];
        if ( r == 1 ) { c[1][0]=crit[0]; c[1][1]=crit[1];  return;}
        } 
        else  {crit[0] = c[--l][0]; crit[1] = c[--l][1]; }
        j=l;
        while (1) {// label 4
          i=j;
          j=2*j;
          if  (j>r) {c[i][0]=crit[0]; c[i][1]=crit[1];
            break;} 
          if ((j<r) && (c[j][0] < c[j+1][0])) j++; // L5
          if (crit[0] < c[j][0]) { c[i][0]=c[j][0]; c[i][1]=c[j][1];
          }
          else {c[i][0]=crit[0];c[i][1]=crit[1];
           break;} 
        }
    Mais ça ne marche pas, mon tableau est modifié mais ça n a ni queue ni tête!

    Peut être que l ereur vient aussi de l appel à HeapSort qui est bancal aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HeapSort(tre,Th.nt*3 );
    tre: triangle edge
    Th.nt : nombre de triangles du maillage


    Voilà, thanks.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Butterfly83 Voir le message
    Merci encore.

    Mais le fait que deux arretes identiques sont "différentes" selon leurs orientations me dérange un peu... Alors j ai écrit une nouvelle version de HeapSort:
    Réécrire la fonction de comparaison ne suffirait-il pas?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Excel : utilisation de la fonction tri
    Par Hicks90 dans le forum Débuter
    Réponses: 9
    Dernier message: 12/12/2012, 02h04
  2. Tri après l'utilisation de la fonction "explode"
    Par celinedecham dans le forum Langage
    Réponses: 7
    Dernier message: 04/10/2008, 20h40
  3. Utilisation de la fonction de déploiement
    Par mchicoix dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/03/2005, 14h35
  4. Utilisation de la fonction qsort
    Par Jsmeline dans le forum C
    Réponses: 8
    Dernier message: 28/01/2005, 12h40
  5. [LG]librairies : utiliser seulement quelques fonctions
    Par wwwroom dans le forum Langage
    Réponses: 13
    Dernier message: 14/05/2004, 22h50

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