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 :

[STL] optimisation d une fonction de recherche dans un set


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut [STL] optimisation d une fonction de recherche dans un set
    j aimerais optimiser cette foncton de recherrche avec des algo de la STL si possible. --> <-- lol

    Des idées d'implementation ?

    merci d'avance

    le conteneur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::set<CNCMClic *,CNCMClicCompare> TClicArray;
    TClicArray m_ClicArray;
    la fonction de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool CMAClasse::GetClic(T_CLIC _ClicNumber,TClicArray::const_iterator & _itClic)
    {
    	//TODO optimize this search	
    	for(_itClic = m_ClicArray.begin();_itClic!=m_ClicArray.end();_itClic++)
    	{
    		if((*_itClic)->GetClicID() == _ClicNumber)
    		{			
    			return true;
    		}
    	}
    	_itClic = m_ClicArray.end();
    	return false;
    }
    Pour les details, cherche tout seul !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Deux possibilités.

    Soit ton set est ordonné par le membre recherché (ClicID) et tu peux tirer partie du temps de recherche logarithmique.

    Soit ton set est ordonné par autre chose, et je vois mal comment tu pourras aller plus vite qu'en faisant un parcours séquentiel.

    Sinon, il faut se tourner vers des conteneurs plus évolués (y en a un dans boost il me semble).

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    Citation Envoyé par Laurent Gomila
    Soit ton set est ordonné par le membre recherché (ClicID) et tu peux tirer partie du temps de recherche logarithmique.
    c'est le cas en effet, comment tirer parti du temps de recherche en log ?
    Pour les details, cherche tout seul !

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Si tu as une liste triée, pourquoi ne pas utiliser une map dont la clé derait ClicId? L'avantage c'est que l'accés serait direct, même pas besoin de recherche.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    c'est le cas en effet, comment tirer parti du temps de recherche en log ?
    En utilisant la fonction set::find. Bon là où ça peut être pas très pratique, c'est qu'il faut absolument lui passer un élément (donc un CNCMClic* défini avec le ClicID recherché).

    Si tu as une liste triée, pourquoi ne pas utiliser une map dont la clé derait ClicId? L'avantage c'est que l'accés serait direct, même pas besoin de recherche.
    Lorsque la clé fait partie de l'élément, il vaut mieux std::set, avec std::map tu aurais une duplication de celle-ci. Et puis un accès dans un std::map suppose forcément une recherche

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Laurent Gomila
    Et puis un accès dans un std::map suppose forcément une recherche
    Et oui, logique. C'est l'opérateur [] qui m'a trompé. Il ressemble tellement à un accés sur un tableau...
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les tables de hachages par contre (qui ne sont pas encore dans le standard) proposent un accès presque direct.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/12/2011, 08h53
  2. [Sql Server] Fonction de recherche dans une chaine
    Par pierre031183 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/01/2011, 16h16
  3. Réponses: 2
    Dernier message: 29/07/2010, 21h58
  4. fonction de recherche dans une liste chainée
    Par seifvai dans le forum C
    Réponses: 10
    Dernier message: 23/12/2007, 10h35
  5. vb.net pb dans une fonction de recherche
    Par hajarussa dans le forum VB.NET
    Réponses: 2
    Dernier message: 09/08/2007, 13h03

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