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 :

supression équivalence (doublons)


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut supression équivalence (doublons)
    salut

    dans un programme en java, il y a construction d'une requête de façon dynamique

    le plus optimisé (je crois) serait d'avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select caisse, guichet, joursemaine, semaine, tg1.annee, tg2.annee, tg1.nbEnv, tg2.nbEnv, ((tg1.nbEnv +tg2.nbEnv)/2)
    from transactionGuichet tg1, transactionGuichet tg2
    where tg1.caisse=tg2.caisse
    and tg1.guichet=tg2.guichet
    and tg1.joursemaine=tg2.joursemaine
    and tg1.semaine=tg2.semaine
    and tg1.annee!=tg2.annee
    avec l'algo suivant
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    public void generateQuery(int nbDimension) {
            int[] tabAnneeATraite = new int[nbDimension];
     
            for (int i = 0; i < tabAnneeATraite.length; i++) {
     
                tabAnneeATraite[i] = i;
            }
     
            StringBuffer sb = new StringBuffer();
     
            sb.append("select caisse, guichet, joursemaine, semaine");
            int cpt = 1;
            for (int i = 0; i < tabAnneeATraite.length; i++) {
                sb.append(",tg" + cpt + ".annee");
                cpt++;
            }
     
            cpt = 1;
            for (int i = 0; i < tabAnneeATraite.length; i++) {
                sb.append(",tg" + cpt + ".nbEnv");
                cpt++;
            }
     
            sb.append(",");
            sb.append("((");
            //la moyenne - ((tg1.nbEnv +tg2.nbEnv)/2)
            cpt = 1;
            for (int i = 0; i < tabAnneeATraite.length; i++) {
                sb.append(" tg" + cpt + ".nbEnv ");
                if(i !=tabAnneeATraite.length -1)
                    sb.append("+");
                cpt++;
            }
            sb.append(")" + "/" + tabAnneeATraite.length + ")");
     
            sb.append(" from ");
            cpt = 1;
            for (int i = 0; i < tabAnneeATraite.length; i++) {
     
                if (i != 0) {
                    sb.append(",");
                }
                sb.append("transactionGuichet " + "tg" + cpt);
                cpt++;
            }
     
            sb.append(" where \n");
     
            generateWhere(tabAnneeATraite, sb, "caisse", " =");
            sb.append(" and ");
            generateWhere(tabAnneeATraite, sb, "guichet", " =");
            sb.append(" and ");
            generateWhere(tabAnneeATraite, sb, "joursemaine", " =");
            sb.append(" and ");
            generateWhere(tabAnneeATraite, sb, "caisse", " =");
            sb.append(" and ");
            generateWhere(tabAnneeATraite, sb, "semaine", " =");
            sb.append(" and ");
            generateWhere(tabAnneeATraite, sb, "annee", " !=");
     
            System.out.println(sb.toString());
        }
     
        public void generateWhere(int tabAnneeATraite[], StringBuffer sb, String nomChamp, String operateur) {
            int cpt = 1;
            int cpt2 = 1;
            boolean addToAdd = false;
            for (int i = 0; i < tabAnneeATraite.length; i++) {
                cpt2 = 1;
                for (int j = 0; j < tabAnneeATraite.length; j++) {
                    if (i != j) {
     
                        if (addToAdd) {
                            sb.append("and ");
                            addToAdd = false;
                        }
                        sb.append("tg" + cpt + "." + nomChamp + operateur);
                        sb.append("tg" + cpt2 + "." + nomChamp + " \n");
                        addToAdd = true;
                    }
                    cpt2++;
                }
                cpt++;
            }
        }
    on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select caisse, guichet, joursemaine, semaine,tg1.annee,tg2.annee,tg1.nbEnv,tg2.nbEnv,(( tg1.nbEnv + tg2.nbEnv )/2) from transactionGuichet tg1,transactionGuichet tg2 where 
    tg1.caisse =tg2.caisse 
    and tg2.caisse =tg1.caisse 
     and tg1.guichet =tg2.guichet 
    and tg2.guichet =tg1.guichet 
     and tg1.joursemaine =tg2.joursemaine 
    and tg2.joursemaine =tg1.joursemaine 
     and tg1.caisse =tg2.caisse 
    and tg2.caisse =tg1.caisse 
     and tg1.semaine =tg2.semaine 
    and tg2.semaine =tg1.semaine 
     and tg1.annee !=tg2.annee 
    and tg2.annee !=tg1.annee
    on remarque donc qu'il y a plusieurs éléments inutile

    dans le premier car la requête prend 40 secondes avec hsqldb alors qu'avec la deuxième c'est 75...

    ça va être encore pire si on passe avec une valeur de plus de 2 à la fonction

    je cherche donc une méthode pour enlever les éléments équivalents

    une idée

    merci

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Par défaut
    ça reviens à faire les combinaisons C(n,p) sans remise

    j'ai fait en recursif....
    le mieux serait de le faire en iteratif

  3. #3
    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 : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    c'est ici que tu génères tes doublons :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i = 0; i < tabAnneeATraite.length; i++) {
                cpt2 = 1;
                for (int j = 0; j < tabAnneeATraite.length; j++) {
                    if (i != j) {

    Tu peux les supprimer comme ceci :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i = 0; i < tabAnneeATraite.length; i++) {
                cpt2 = 1;
                for (int j = i+1; j < tabAnneeATraite.length; j++) {
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

Discussions similaires

  1. supression des doublons
    Par pymouse dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2007, 14h11
  2. Supression des doublons les plus anciens
    Par jonkalak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/05/2007, 08h42
  3. Supression de doublon dans un tableau
    Par Blo0d4x3 dans le forum C
    Réponses: 4
    Dernier message: 18/05/2007, 01h47
  4. Réponses: 13
    Dernier message: 12/01/2006, 10h45
  5. utilisation classe vector et supression de doublons
    Par vandevere dans le forum SL & STL
    Réponses: 1
    Dernier message: 30/06/2005, 11h17

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