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 :

suppression doublons tableau


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Technicien Informatique
    Inscrit en
    Février 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 187
    Points : 89
    Points
    89
    Par défaut suppression doublons tableau
    B onjour à tous !

    Pourriez vous m'expliquer un algorithme de suppression de doublons
    dans un tableau

    |Nom|Prenom|Adresse|Ville|

    Meric d'avance pour vos explications

    Jean Marc
    Jean Marc

  2. #2
    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
    Il faut déjà que tu choisisses le champ que tu désires supprimer.

    Alors ensuite, suivant les méthodes, tu as :

    -> la bête et méchante, tu regardes chacune des lignes et tu supprimes celles qui sont identiques (au moins sur le champ que tu veux).

    -> un peu plus subtil : tu effectues un tri sur le champ que tu veux, puis tu passes en revue toutes tes lignes et les doublons sont forcément à la suite ce qui limite les recherches et permet une opération efficace.

  3. #3
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Encore plus subtil : tu crées une clef de hashage sur les colonnes qui doivent être concernées par la suppression des doublons, et tu recopies ton tableau dans une table de hashage en utilisant la clef de hashage créée précédemment.
    Ensuite, tu vires les clefs, tu récupères ton tableau, y'a plus de doublons.

  4. #4
    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
    et tu recopies ton tableau dans une table de hashage en utilisant la clef de hashage créée précédemment.
    Attention, ça reste difficilement applicable sur de très gros tableaux ce qui risque d'être le cas (l'exemple donné fait penser à une table de base de donnée).

  5. #5
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Si c'est une table de base de donnée, dans ce cas, une clef unique sur les champs concernés, pas besoin de plus...

    Sinon, je vois pas trop pourquoi ça ne serait pas applicable sur de grosses tables.

  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
    Le problème, c'est l'espace de stockage nécessaire pour ton opération suivante :

    et tu recopies ton tableau dans une table de hashage en utilisant la clef de hashage créée précédemment.
    Ca ne représente aucun problème si tu as un nombre raisonnable de valeurs. Mais pour un très grand nombre de valeur, ça risque devenir problématique. Les méthodes que j'ai cité (même si elle ne sont pas parfaites), ont la caractéristique principales de travailler sur place. (l'espace nécessaire au tri est négligeable par rapport à la taille de la table).

  7. #7
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Tout dépend du taux de collisions.

  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
    Citation Envoyé par PRomu@ld
    Ca ne représente aucun problème si tu as un nombre raisonnable de valeurs. Mais pour un très grand nombre de valeur, ça risque devenir problématique. Les méthodes que j'ai cité (même si elle ne sont pas parfaites), ont la caractéristique principales de travailler sur place. (l'espace nécessaire au tri est négligeable par rapport à la taille de la table).
    Certes, mais au pire tu as approximativement un doublement de l'espace requis (la table plus la table de hachage, et s'il y a beaucoup de doublons, ça compense, évidemment il faut également qu'il n'y ait pas trop de collisions, ce qui risque de demander plus qu'un doublement...). Et s'il y a vraiment trop de lignes, alors la meilleure solution est très probablement d'en passer par une base de donnée de toute façon.

    --
    Jedaï

  9. #9
    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
    Certes, mais au pire tu as approximativement un doublement de l'espace requis
    J'aime ton euphémisme, imagine une table contenant admettons 2 Go de données, la doubler me semble irréalisable. D'une part aura t'on la place pour stocker les données temporaires. D'autre part, il est relativement rare d'avoir la place en RAM pour stocker ce doublon, par conséquent, on va être obligé de "swapper" énormément, e là, les temps de calculs sont énormement plus long qu'en RAM. Enfin, quand bien même le temps ne compterait pas, sera t'on sur d'avoir un système permettant un swap aussi grand.

  10. #10
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    une petite question comme ça: quel est l'ordre du hachage ?

    il me semble que quicksort est O(x*ln(x)) donc la méthode subtile doit être en O(x(1+ ln(x)))
    la bête et méchante est en O(x²) je pense ...

    et le hachage? (d'ailleurs, tous les hachages suppriment les doublons ?)


    merci.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  11. #11
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Calculer un hash nécessite une simple passe (à peine pire que la comparaison) et l'accès doit être directe. Ce cas étant simple la dispertion devrait être bonne et si on néglige les collisions on doit avoir du O(x). Mais comme les données doivent tenir en mémoire il se peut que ça n'aide pas trop par rapport à du O(x*ln(x))... à moins peut-être de ne garder que le hash et un n° d'index.

    Ce qui va vraiment compter c'est de savoir si les données sont en RAM ou sur le disque, et si on peut les charger ou ne serait-ce que les indexer en RAM.

  12. #12
    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
    une petite question comme ça: quel est l'ordre du hachage ?

    il me semble que quicksort est O(x*ln(x)) donc la méthode subtile doit être en O(x(1+ ln(x)))
    la bête et méchante est en O(x²) je pense ...

    et le hachage? (d'ailleurs, tous les hachages suppriment les doublons ?)


    merci.
    Visiblement tu n'as pas compris ma remarque, elle ne concerne absolument pas la complexité en temps mais la complexité en espace.

    La table de hachage a une complexisté en temps qui est proportionnelle à ta fonction de hachage, La conplexité de ta fonction de hachage n'apparait pas dans la complexité (on n'affiche pas les constantes). Entre deux algos en n log n, l'un peut être 4 fois plus rapide que l'autre ... .

    Pour en revenir à ma remarque, la complexité en espace est relativement importante dans ce cas, et comme l'a dit Sivrît, ce n'est pas parce que la complexité en temps est plus faible que la méthode dans la pratique va être plus rapide.

  13. #13
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    A vrais dire, je demandais juste dans un cadre purement théorique la fonction de complexité du hachage (vous auriez un algo en exemple ?) car je connais mal ces fonctions là. (et comme ce n'est pas moi qui a posé la question initiale...)

    merci.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  14. #14
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par méphistopheles
    A vrais dire, je demandais juste dans un cadre purement théorique la fonction de complexité du hachage (vous auriez un algo en exemple ?) car je connais mal ces fonctions là. (et comme ce n'est pas moi qui a posé la question initiale...)

    merci.
    Il me semble que les String Java sont typiques :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public int hashCode()
    {
       if (cachedHashCode != 0)
          return cachedHashCode;
       // Compute the hash code using a local variable to be reentrant.
       int hashCode = 0;
       int limit = count + offset;
       for (int i = offset; i < limit; i++)
          hashCode = hashCode * 31 + value[i];
       return cachedHashCode = hashCode;
    }
    (oui je sais, du code dans ce forum c'est mal )

    Si c'est plus complexe on peut jouer avec des XOR ou appliquer la même formule entre les hash des différentes parties.

  15. #15
    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
    Essaie de (re)poser ta question dans le forum, si le sujet t'intéresse, je doute que tu sois le seul, de plus tu devrais avoir plus de réponses si tu crées un nouveau sujet.

Discussions similaires

  1. Trigger pour suppression doublons ds table
    Par lg_gaelle dans le forum PL/SQL
    Réponses: 2
    Dernier message: 18/10/2006, 15h53
  2. Suppression doublon Table
    Par francois78 dans le forum Access
    Réponses: 11
    Dernier message: 13/06/2006, 16h16
  3. [Tableaux] suppression colonne tableau 2 Dimensions
    Par flydragon dans le forum Langage
    Réponses: 21
    Dernier message: 27/04/2006, 11h28
  4. Suppression doublons
    Par osmoze dans le forum Oracle
    Réponses: 2
    Dernier message: 26/04/2006, 13h17
  5. [MySQL] Problème de syntaxe dans suppression doublons
    Par fred23195 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/04/2006, 15h45

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