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 :

Eliminer les doublons dans un tableau d'entiers


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut Eliminer les doublons dans un tableau d'entiers
    bonjour,

    tout est dans le titre !
    je programme en C mais le principe est certainement identique quel que soit le langage.

    bref, j'ai un tableau qui contient des entiers qui sont potentiellement répétés.
    je voudrais retirer tous les doublons de ce tableau.

    merci pour votre aide

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut Re: Eliminer les doublons dans un tableau d'entiers
    Citation Envoyé par engi
    bonjour,

    tout est dans le titre !
    je programme en C mais le principe est certainement identique quel que soit le langage.

    bref, j'ai un tableau qui contient des entiers qui sont potentiellement répétés.
    je voudrais retirer tous les doublons de ce tableau.

    merci pour votre aide
    Il y a un forum d'algorithmique... Vu que tu le remarques toi même:
    je programme en C mais le principe est certainement identique quel que soit le langage.
    Il serait bon d'aller là-bas pour poser cette question,
    Jc

  3. #3
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    bref, j'ai un tableau qui contient des entiers qui sont potentiellement répétés.
    je voudrais retirer tous les doublons de ce tableau.
    Plusieurs solution, méthode bête et méchante, tu fais la brute :

    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
     
    Ti : tableau initial
    Tf : tableau sans doublons
    k : nombre d'entier sans doublons
     
    Tf[1] = Ti[1];
     
    pour i allant de 2 à N faire
     
         -- On regarde si on a pas déjà ajouté l'entier
         pour j allant de 1 à k faire
              si Ti[i] == Tf[j] alors
                   passer au i suivant
              fin si
         fin pour
     
         -- Si on est ici alors c'est que ce n'est pas un doublon
         Tf[k] := Ti[i]
         k <- k + 1
    fin pour
    Bon c'est une méthode comme une autre, d'autres solutions existent et sont plus efficaces.

    Une par exemple consiste à trier le tableau puis éliminer les doublons, en général, on appelle ça une élimination de plateau

    Une autre solution consiste à vérifier lorsque tu ajoutes dans ton tableau que tu n'a pas de doublons avant d'insérer (ce n'est pas toujours possible), pour optimiser cette méthode, il faut que ton tableau soit trié.

    Bref pleins de solutions possibles, reste à toi de voir celle qui te semble adaptable à ce que tu veux faire.

  4. #4
    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,

    Au cas ou la plage [min,max] soit suffisament petite disons de l'ordre de quelques centaines de milliers, on peut créer une chaine bits (Max-min+1 bits) qui indiquera si on a déjà la valeur dans le tableau.
    Si oui, on mets le bit à 1
    Sinon, on enlève la valeur.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    merci pour ces infos.
    je vais pouvoir mettre en application

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    Au cas ou la plage [min,max] soit suffisament petite disons de l'ordre de quelques centaines de milliers, on peut créer une chaine bits (Max-min+1 bits) qui indiquera si on a déjà la valeur dans le tableau.
    Si oui, on mets le bit à 1
    Sinon, on enlève la valeur.
    En fait, en prenant un tout petit peu de recul, il s'agit en fait d'une méthode de tri postal un peu modifiée (au lieu d'insérer, on regarde juste si on a déjà inséré)

  7. #7
    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,

    si l'ordre des éléments n'est pas important, tu peux peux etre trier le tableau, comme ca tout les doublons seront cote à cote. De plus, si tu dois ajouter des éléments dans ton tableau, tu n'aura pas forcément besoin de le parcourir entièrement pour savoir si le numéro existe.

  8. #8
    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
    Si l'ordre n'est pas important et que tu risques d'avoir à insérer de nouveaux éléments, je te conseille de passer directement à un arbre rouge-noir, c'est l'une des meilleures structures pour ce type de problème.

    --
    Jedaï

  9. #9
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    arbre rouge-noir !

    tu peux m'éclairer sur le sujet; jamais entendu parler

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Si l'ordre n'est pas important et que tu risques d'avoir à insérer de nouveaux éléments, je te conseille de passer directement à un arbre rouge-noir, c'est l'une des meilleures structures pour ce type de problème.
    C'est peut être un peu radical, un simple tableau ou un arbre binaire de recherche simple (pas forcément rouge-noir ou autre ...) peut éventuellement être utilisé.

    arbre rouge-noir !

    tu peux m'éclairer sur le sujet; jamais entendu parler
    Un arbre rouge noir est un arbre binaire de recherche équilibré dont les noeuds ont une couleur (rouge ou noire) pour aider à l'équilibre du noeud.

    Un arbre binaire de recherche est un arbre qui est ordonné de la façon suivante :

    les noeuds du sous arbre gauche sont plus petits que le noeud courrant. Les noeuds du sous arbre droit sont plus grand que le noeud courrant.

    Un arbre rouge noir est un arbre équilibré ce qui signifie que les feuilles sont au même niveau (ou avec un décalage entre les niveaux d'au maximum un)

    Je ne pense pas que tu en ai besoin.

  11. #11
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Même si ça n'est pas très complet (loin de là), tu peux ne serait ce que voir ce qu'est un arbre binaire de recherche ici :

    http://rperrot.developpez.com/articl...arbres/#LVII-B

  12. #12
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    merci pour le lien

  13. #13
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Citation Envoyé par engi
    merci pour le lien
    Oui, c'est une façon de se faire de la publicité gratuite !

  14. #14
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 123
    Points
    28 123
    Par défaut
    Bonjour,

    Dans ce cas précis, pourquoi ne pas faire la chose suivante :

    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
    TabI : tableau initial (avec doublon(s))
    TabF : tableau final (sans doublon)
     
    Tri de TabI (quicksort par exemple si on veut un tri rapide)
     
    tabF[0] = TabI[0];
    j=1;
     
    Pour i allant de 1 à fin_TabI -1
      Si  ( tabI[i] != tabI[i-1] )
       {
         TabF[j] = tabI[i];
         j++;
       }
       FSi
    Fpour
    Je pense qu'on obtient quelque chose d'assez rapide.

  15. #15
    Membre actif Avatar de Betatesteur
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Points : 248
    Points
    248
    Par défaut
    je préfère celle ci.

  16. #16
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Tu as indiqué que tu programmais en C. Si cela ne te gène pas d'inclure un peu de C++, tu peux utiliser un objet de type set disponible dans la STL. Sauf erreur, le type set est implémenté avec une structure d'arbre binaire de recherche (ça évite de réinventer la roue).

    - Si l'ordre n'a pas d'importance, tu fais des insert dans ton set et à la fin, tu parcours le set avec un itérateur pour restituer le tableau sans doublon.

    - Si l'ordre a l'importance, tu peux utiliser un set pour garder en mémoire les éléments déjà présents dans le tableau initial.

    Voici un exemple d'utilisation de set (pour tester si un élément a déjà été rencontré) :

    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
    #include <set>
    using namespace std ;
     
    ...
     
    set<int> ensemble ;
     
    ensemble.insert(5) ;
    ensemble.insert(14) ;
    ensemble.insert(2) ;
    ...
    if( ensemble.find(50) != ensemble.end() ) {
      // l'ensemble contient 50
    } else {
      // l'ensemble ne contient pas 50
    }
    ***
    Si tu dois utiliser du C uniquement (pas de C++), la méthode "brute" suffit (pas besoin de quicksort). Il est d'ailleurs très simple de l'implémenter au moyen de pointeurs. Ici, la version "sur place" (non testée):

    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
    // Retourne la nouvelle taille du tableau
     
    int suppressionDoublons(int * tab, int taille) {
      int * p1, p2, p3, pFin ;
     
      p1 = tab ;
      pFin = tab + taille ;
     
      while (p1 < pFin) {
        p2 = p1+1 ;
        p3 = p2 ;
     
        while(p3 < pFin) {
     
          if (*p3 != *p1 ) {
             *p2 = *p3 ;
             p2++ ;
          }
           p3++ ;
     
        }
        pFin = p2 ;
        p1++ ;
      }
     
      return pFin - p1 ;
     
    }
    ***
    Note: Désolé d'avoir mis du code C/C++ au millieu d'un forum "algorithmes", mais c'est pour répondre à engi.

  17. #17
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    j'avais entendu dire que la stl pouvait me faciliter la tache.
    ça à l'air de se confirmer.
    as-tu le lien d'un site du style "La STL pour les nuls" .
    je programme en C et/ou C++, mais je n'ai jamais abordé tout ce qui touche de près ou de loin à la STL.
    en tous les cas, merci pour ta réponse.

  18. #18
    Membre actif Avatar de Betatesteur
    Inscrit en
    Juillet 2003
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 210
    Points : 248
    Points
    248
    Par défaut
    l'ami fidèle

  19. #19
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par engi
    j'avais entendu dire que la stl pouvait me faciliter la tache.
    ça à l'air de se confirmer.
    Oh que oui !

    Déjà, tu as tous les conteneurs standards tels que les list, queue, deque, map, set...

    Ensuite, tu as l'utilisation des "templates" qui te permet de définir des objets et des fonctions adaptables au type de données souhaité (ex: dans l'exemple précédent, on a utilisé un set d'entiers, mais on aurait pu aussi bien créer un set du type que tu veux)

    Rien que ça, ça aide énormément !


    Citation Envoyé par engi
    as-tu le lien d'un site du style "La STL pour les nuls" .
    Tout d'abord, je peux te conseiller le livre de Bjarne Stroustrup (l'inventeur du C++): "le langage C++". Une référence (le mien est complètement usé à force de le consulter!). Tu trouveras de nombreux livres presque aussi chers, mais beaucoup moins bons (et surtout moins complets)

    Sinon, pour faire du chauvinisme communautaire, on a le "méga cours de C/C++" sur DVP. Tu t'intéresseras plus particulièrement à la partie II. La bibliothèque standard C++, notamment au Chapitre 17. Les conteneurs dans son ensemble.

    Volià, tu sais tout. Bon C++ !


    Citation Envoyé par engi
    en tous les cas, merci pour ta réponse.
    De rien !

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/03/2007, 18h29
  2. [Tableaux] Rechercher les doublons dans un tableau
    Par jym_22 dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2006, 09h47
  3. eliminer les doublons d'un tableau
    Par wided_instm dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/09/2006, 10h56
  4. [XSL] Eliminer les doublons dans un noeud
    Par Shadow aok dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/04/2006, 15h17
  5. Eliminer les doublons d'un tableau de hachage
    Par dreydrey dans le forum Langage
    Réponses: 21
    Dernier message: 15/11/2005, 15h03

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