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 :

Prendre une partie d'un vecteur


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Par défaut Prendre une partie d'un vecteur
    dans l'algorithme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    recherche_dichotomique_récursive(élément, liste_triée):
       m = longueur de liste_triée / 2 ;
       si liste_triée[m] = élément :
           renvoyer m ;
       si liste_triée[m] > élément :
           renvoyer recherche_dichotomique_recursive(element, liste_triee[1:m]) ;
       sinon :
           renvoyer recherche_dichotomique_recursive(element, liste_triee[m:l]) ;
    j'aimerai savoir comment on fait et via des vecteur.

    Voici mon code :

    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
     
    /**
     @brief recherche un mot dans le dictionnaire via une recherche dichotomique              
     
     @param dico (vector<string>) Vecteur qui contient le dictionnaire
     @param mot  (string)         Mot à rechercher
      
     @return retourne vrai si le mot a été trouvé autrement faux
     */
    bool rechercheDichotomiqueRecursive(vector<string> dico, string mot){
     
        size_t indiceMilieu = dico.size()/2;
        if(dico.at(indiceMilieu) == mot){
            return true;
        }
        if(dico.at(indiceMilieu) > mot){
            rechercheDichotomiqueRecursive(dico,mot);
        }
        else{
            rechercheDichotomiqueRecursive(dico,mot);
        }
        return false;
    }

  2. #2
    Membre chevronné
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Par défaut
    Pour moi, tu as trouvé la solution quand tu as posé la question

    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
     
    bool rechercheDichotomiqueRecursive(vector<string> const &dico, string const &mot, int indiceDeb, int indiceFin)
    {
        size_t indiceMilieu = (indiceFin + indiceDebut)/2;
        if(dico.at(indiceMilieu) == mot){
            return true;
        }
        if(dico.at(indiceMilieu) > mot){
            rechercheDichotomiqueRecursive(dico, mot, indiceMilieu, indiceFin);
        }
        else{
            rechercheDichotomiqueRecursive(dico, mot, indiceDebut, indiceMilieu);
        }
        return false;
    }
    Par exemple?

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Tu as obtenue une solution basée sur le côté C du C++ : ne pas fabriquer d'objets inutiles.
    Attention, il faut faire plutôt size_t indiceMilieu = (indiceFin + indiceDebut)/2;.

    Si on regarde le côté Python du C++, on peut créer des vector : j'ai du CPU et de la mémoire à revendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if (dico.at(indiceMilieu) > mot){
            rechercheDichotomiqueRecursive( vector<string>(next(dico.begin(), indiceMilieu),dico.end()) , mot );
        }
        else{
            rechercheDichotomiqueRecursive( vector<string>(dico.begin(), next(dico.begin(), indiceMilieu+1)) , mot);
        }
    Personnellement j'opte plutôt pour la version économe.

  4. #4
    Membre chevronné
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Tu as obtenue une solution basée sur le côté C du C++ : ne pas fabriquer d'objets inutiles.
    Attention, il faut faire plutôt size_t indiceMilieu = (indiceFin + indiceDebut)/2;.
    Toutes mes excuses pour cet indice baclé, j édite en conséquence

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 2
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Tu as obtenue une solution basée sur le côté C du C++ : ne pas fabriquer d'objets inutiles.
    Attention, il faut faire plutôt size_t indiceMilieu = (indiceFin + indiceDebut)/2;.

    Si on regarde le côté Python du C++, on peut créer des vector : j'ai du CPU et de la mémoire à revendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if (dico.at(indiceMilieu) > mot){
            rechercheDichotomiqueRecursive( vector<string>(next(dico.begin(), indiceMilieu),dico.end()) , mot );
        }
        else{
            rechercheDichotomiqueRecursive( vector<string>(dico.begin(), next(dico.begin(), indiceMilieu+1)) , mot);
        }
    Personnellement j'opte plutôt pour la version économe.

    Je n'ai pas très bien compris se que tu fais dans la parentheses de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rechercheDichotomiqueRecursive( vector<string>(next(dico.begin(), indiceMilieu),dico.end()) , mot )
    idem pour la suivant. si tu arriverai a me faire une petit expliquation ça serait cool.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par galiaker Voir le message
    idem pour la suivant. si tu arriverai a me faire une petit expliquation ça serait cool.
    La ligne fait ce que tu demandes, elle crée une liste allant du milieu à la fin (et du début au milieu).
    On peut la décomposer en plusieurs lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       auto debutDeDico = dico.begin();     // itérateur dans dico sur le début
       auto apresFinDeDico = dico.end();    // itérateur dans dico après la fin
       auto milieuDeDico = next( debutDeDico , indiceMilieu ); // next() permet d'ajouter un déplacement à un itérateur
       auto apresMilieuDeDico = next( milieuDeDico , 1 ); // on veut aussi un itérateur après le milieu
       // un nouveau vecteur peut être construit en lui passant 2 itérateurs dans une collection
       // le premier indique le premier élément, le second doit être après le dernier élément à prendre.
       vector<string> vecteurPremiereMoitie( debutDeDico , apresMilieuDeDico );
       vector<string> vecteurSecondeMoitie( milieuDeDico , apresFinDeDico );
       if ( dico.at(indiceMilieu) > mot )
            rechercheDichotomiqueRecursive( vecteurSecondeMoitie , mot );
        else
            rechercheDichotomiqueRecursive( vecteurPremiereMoitie , mot);

Discussions similaires

  1. [Débutant] Prendre une partie d'une image en RGB
    Par jp_developpeur dans le forum Images
    Réponses: 3
    Dernier message: 02/07/2009, 12h40
  2. commande DOS pour prendre une partie d'un mot
    Par sofiane1111 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 21/09/2007, 10h59
  3. Prendre une partie du texte
    Par aikinhdo dans le forum Langage
    Réponses: 5
    Dernier message: 24/07/2007, 14h47
  4. Sélectionner une partie d'un vecteur
    Par yoann_deygas dans le forum MATLAB
    Réponses: 1
    Dernier message: 01/06/2007, 11h15
  5. [SimpleXML] prendre une partie
    Par zuxion dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 06/07/2006, 12h45

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