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 :

Produit cartesien sur un nombre variable de vecteurs


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut Produit cartesien sur un nombre variable de vecteurs
    Bonjour,

    J'ai un probleme conceptuel et je recherche de l'aide.

    J'ai un vecteur qui contient egalement un certain nombre variable de vecteurs de double:
    std::vector<std::vector<double> > vecteur

    J'aimerais etre capable d'extraire le produit cartesien de ce vecteur, en prenant toutes les combinaisons possibles.

    Par exemple, si mon vecteur contient:

    < <1 , 2, 3>, <4, 5>, <6, 7> >

    J'aimerais construire les combinaisons:
    <1,4,6><1,4,7>,<1,5,6><1,5,7> ... <3,5,7>

    Comment faire? Comme mon nombre de vector<double> est lui-meme variable, je ne peux pas utiliser un nombre fixe de boucles for. Si jamais mon vecteur devient:
    < <1 , 2, 3>, <4, 5>, <6, 7>, <8> >

    la meme fonction devrait m'extraire:
    <1,4,6,8>,<1,4,7,8> etc...


    J'ai pense creer un tableau d'iterateurs, mais est-ce la meilleure methode? Utiliser la recursivite peut-etre ?


    Merci d'avance.

  2. #2
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Points : 151
    Points
    151
    Par défaut
    Salut,

    Est-ce que tu as commencé à implementer?

    Comment stocks tu tes donnes?

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par rikau2 Voir le message
    Salut,

    Est-ce que tu as commencé à implementer?

    Comment stocks tu tes donnes?
    Oui, en fait j'utilise la STL et des structures. Pour etre tout a fait exact:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct parameterRange {
    string name;
    vector<double> values;
    };
     
    vector<parameterRange> ranges;
    Donc j'ai stocke mes ranges sous cette forme (si j'utilise < pour representer un vecteur, et {} pour delimiter ma structure parameterRange):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Pseudocode:
     
    <{"A",<1,2,3>},{"B",<4,5>}>
    Ce que je veux faire est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct nvpair {
    string name;
    double value;
    };
     
    Pseudocode ou {} represente une structure nvpair:
    < <{"A",1},{"B",4}>,<{"A",1},{"B",5}>,...,<{"A",3},{"B",5}>>
    mais sachant que mon vecteur ranges peut contenir un nombre variable de structures parameterRange.

  4. #4
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Avec la recursivite tu dois pouvoir t'en sortir sans trop de problemes.

    Il ne faut juste pas que tu ai trop de vectors a parcourir sinon ta stack risque de peter une durite .

    Un morceau de code tres vite fait qui fait un produit cartesien:

    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
     
    #include <vector>
    #include <cstdlib>
    #include <iostream>
     
    void    get_cart_prod(std::vector<std::vector<double> >::iterator end,
            std::vector<std::vector<double> > *cart_prod,
            std::vector<std::vector<double> >::iterator tabs_it,
            std::vector<double> *cart_prod_unit)
    {
        std::vector<double>::iterator   tab_it = tabs_it->begin();
        std::vector<double>::iterator   tab_end = tabs_it->end();
     
        while (tab_it != tab_end)
        {
            std::vector<double> *new_cart_unit = new std::vector<double>(*cart_prod_unit);
            new_cart_unit->push_back(*tab_it);
     
            if (tabs_it + 1 != end)
                get_cart_prod(end, cart_prod, tabs_it + 1, new_cart_unit);
            else
                cart_prod->push_back(*new_cart_unit);
            ++tab_it;
        }
        return ;
    }
     
    int		main(void)
    {
        std::vector<std::vector<double> >   tabs(2);
     
        tabs[0] = std::vector<double>(3);
        tabs[0][0] = 2;
        tabs[0][1] = 3;
        tabs[0][2] = 4;
     
        tabs[1] = std::vector<double>(2);
        tabs[1][0] = 1;
        tabs[1][1] = 5;
     
        std::vector<std::vector<double> >   cart_prod;
        std::vector<std::vector<double> >::iterator tabs_it;
     
        tabs_it = tabs.begin();
     
        std::cout << "Will fill cartesian prod table" << std::endl;
        get_cart_prod(tabs.end(), &cart_prod, tabs_it, new std::vector<double>());
     
        std::cout << "Will print cart table" << std::endl;
        tabs_it = cart_prod.begin();
     
        while (tabs_it != cart_prod.end())
        {
            std::vector<double>::iterator it;
            std::vector<double>::iterator end;
     
    	it = tabs_it->begin();
    	end = tabs_it->end();
            while (it != end)
            {
                std::cout << *it << ' ';
                ++it;
            }
            std::cout << std::endl;
            ++tabs_it;
        }
     
        return (EXIT_SUCCESS);
    }
    C'est fait rapidement donc desole pour la proprete.
    Je n'ai rien supprime de ce que j'ai cree pour eviter d'alourdir le code .
    Mais ca devrait te donner une idee de la structure de la fonction recursive...

    Ca donne la sortie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Will fill cartesian prod table
    Will print cart table
    2 1 
    2 5 
    3 1 
    3 5 
    4 1 
    4 5
    Bonne soiree

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Ouaouh ca a l'air vraiment pas mal!
    Je vais m'adapter ca mais ca me semble vraiment cool. Merci beaucoup je vais travailler avec ca

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    En effet la recursivite va limiter la taille des tableaux. Y-a-t-il une methode iterative ?

  7. #7
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Surement.

    Tout ce qui se fait en recursif peut se faire en iteratif.

    En precalculant la taille du vector resultat et de ses vectors membres.
    Ca se fait en deux boucles.

    Apres tu dois avoir une autre grosse boucle en fonction des resultats trouves avant pour remplir les vector resultats.

    Un papier, un crayon et tu devrais pouvoir trouver ca sans trop de probleme

    Si j'ai un peu de temps dans la soiree je verrais si je peux pondre un autre morceau de code qui fait ca mais je ne te promet rien.

    Bonne continuation

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Jack_serious Voir le message
    Surement.

    Tout ce qui se fait en recursif peut se faire en iteratif.

    En precalculant la taille du vector resultat et de ses vectors membres.
    Ca se fait en deux boucles.
    Ah OK, je me doutais qu'il fallait faire ca. N'hesite pas a poster ta solution quand meme
    En tout cas merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Somme en ligne sur un nombre variable de colonnes
    Par mariem84 dans le forum SAS Base
    Réponses: 7
    Dernier message: 11/10/2013, 16h01
  2. Somme sur nombre variable de cellule
    Par Aulanh dans le forum Excel
    Réponses: 4
    Dernier message: 28/04/2009, 16h16
  3. Réponses: 0
    Dernier message: 30/10/2008, 12h29
  4. NoSuchMethod sur constructeur à nombre args variable
    Par cbi1net dans le forum Langage
    Réponses: 3
    Dernier message: 12/06/2008, 11h28
  5. Réponses: 8
    Dernier message: 14/11/2007, 10h27

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