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

SL & STL C++ Discussion :

Algo pour quantiliser une valeur


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut Algo pour quantiliser une valeur
    Salut,

    J'ai un vecteur de valeurs, et une valeur particulière, je veux connaître le quantile (au sens de l'ensemble des valeurs du vecteur) auquel appartient ma valeur particulière. Je donne bien sûr le nombre de quantiles total.

    Pour l'instant j'en suis à un algo qui classe le vecteur de valeurs puis qui va comparer la valeur particulière à chaque élément entre 0 et n jusqu'à ce que je trouve une valeur inférieure à la valeur particulière.

    Est ce qu'il y a plus rapide tout en restant relativement simple ?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    Pas tout compris...
    Tu pourrais faire un exemples??

    Peut être
    http://r0d.developpez.com/articles/algos-stl/#LII-C-2

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par tnarol Voir le message
    Est ce qu'il y a plus rapide tout en restant relativement simple ?
    La dichotomie est en général assez rapide pour des comparaisons de ce genre.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Salut.
    Pas tout compris...
    Tu pourrais faire un exemples??

    Peut être
    http://r0d.developpez.com/articles/algos-stl/#LII-C-2
    Ben par exemple j'ai comme vecteur de valeurs {1,2,9,4,7,6,7,8}
    Mettons que je veuille savoir dans quel quartile est la valeur 5
    Les intervalles qui composent les quartiles sont des ensembles ordonnés de 2 valeurs car il y en a 8 au départ (8/4 = 2)
    [1,2][4,6][7,7][8,9]
    Ainsi présenté on voit que 5 est situé dans le 2ème quartile
    -> 2 c'est la réponse que je veux.

    En pratique c'est sûrement pas nécessaire d'avoir le découpage exact en quartiles pour connaitre la valeur finale...

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    si tu n'est pas envie de tout triée, nth_element() me semble la bonne solution
    http://r0d.developpez.com/articles/algos-stl/#LII-C-2

    Cela va trié jusqu'à ce que l'élément nth soit à ça place si l'on continue le trie.
    Tu te retrouve ainsi avec deux sous partie. Une inférieur à l'élément et une supérieur à l'élément (je ne sait plus comment se gère l'égalité).
    std::distance te permet de connaitre la distance entre la position résultat et le début de ton tableau

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Enfaite, peut être que std::partition est plus adapté
    http://r0d.developpez.com/articles/algos-stl/#LII-B-12

    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
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ctime>
    #include <limits>
    using namespace std;
     
     
    struct gen
    {
        gen():i(0){}
    	int operator()()
        {
    		return i++ ;
        }
        int i;
    };
     
     
     
    int main(int argc, unsigned char* argv[])
    {	
    	srand(0);
     
        std::vector<int> m_vect(100);
        /*init vector*/
        std::generate(m_vect.begin(),m_vect.end(),gen());
        std::random_shuffle(m_vect.begin(),m_vect.end());
     
     
        std::vector<int>::iterator pos = std::partition
            (
            m_vect.begin(),
            m_vect.end(),
            bind2nd(less<int>(), 25)
            );
        std::cout<<std::distance(m_vect.begin(),pos)<<std::endl;
     
    	return 0;
    }

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Et si tu ajoutes ces valeurs dans un set, ce sera déjà trié, après l'accès aux valeurs sera sûrement plus lent qu'un vector mais le fait de ne pas le trier te permettra peut-être de gagner un peu.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ou un simple count_if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int count = std::count_if
            (
            m_vect.begin(),
            m_vect.end(),
            std::bind2nd(std::less<int>(), 25)
            );

  9. #9
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    ou un simple count_if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int count = std::count_if
            (
            m_vect.begin(),
            m_vect.end(),
            std::bind2nd(std::less<int>(), 25)
            );

    Oui merci c'est exactement ce que j'ai fini par trouver. Je crois que c'est le plus rapide.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par tnarol Voir le message
    Ben par exemple j'ai comme vecteur de valeurs {1,2,9,4,7,6,7,8}
    Mettons que je veuille savoir dans quel quartile est la valeur 5
    Les intervalles qui composent les quartiles sont des ensembles ordonnés de 2 valeurs car il y en a 8 au départ (8/4 = 2)
    [1,2][4,6][7,7][8,9]
    Ainsi présenté on voit que 5 est situé dans le 2ème quartile
    -> 2 c'est la réponse que je veux.

    En pratique c'est sûrement pas nécessaire d'avoir le découpage exact en quartiles pour connaitre la valeur finale...
    C'est plus un problème de math que de STL. Si je comprend bien, tu part d'un ensemble N de cardinalité n, tu veux le découper en quantile de dimension q, et tu voudrais savoir à quel quantile appartient une valeur v. Sauf, que tu ne veux pas découper tout ton ensemble N pour cela.
    Une façon de faire serait d'utiliser v comme pivot pour découper ton espace N entre ceux plus petit N1 et ceux plus grand N2. La borne inférieur de ton quantile sera donnée par le min des card(N1)%q max de N1 et le max par le max des min de card(N2)%(q-NbrElementDuQuantileCoteInferieur) de N2. Ou quelque chose de ce goût là à affiner plus précisément et en gérant les cas particulier (pivot < N ou pivot>N, cas triviaux).

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Si ton ensemble est trié, regarde peut être les recherche binaire
    http://r0d.developpez.com/articles/algos-stl/#LII-C-3

Discussions similaires

  1. probleme pour recuperer une valeur
    Par kespy13 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/04/2006, 10h18
  2. Réponses: 21
    Dernier message: 28/02/2006, 15h23
  3. Réponses: 1
    Dernier message: 22/09/2005, 15h46
  4. Réponses: 5
    Dernier message: 09/09/2005, 17h51
  5. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49

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