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 :

Quelle structure de données optimale en temps et en espace ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Par défaut Quelle structure de données optimale en temps et en espace ?
    Bonjour à tous,

    Je suis actuellement en train de réaliser une structure d'arbre amenée à devenir très rapidement immense en mémoire, et que j'ai besoin d'optimiser autant que possible.

    Basiquement, l'arbre est un ensemble de nœuds dont chacun pointe sur tous ses fils (les nœuds suivants dans l'arbre).

    Et je suis en train de me questionner sur la manière optimale de stocker cette liste de fils (qui sont des objets de type Noeud).

    En effet, un arbre peut avoir des millions voire des milliards de nœuds en fonction des données analysées, et il est donc très important que le traitement en temps et en mémoire soit optimal.

    Pour ce qui est du traitement en temps, les branches issues de chaque nœuds sont peu nombreuses et à chaque fois qu'on les traite on a besoin de les itérer de toute manière jusqu'à trouver la donnée que l'on cherche. De plus, on ne retire (pour l'instant) jamais un nœud lors de la construction de l'arbre, on ne fait qu'ajouter de nouvelles branches.

    Pour ce qui est du traitement en espace, la seule chose dont on ait besoin est cet itérateur sur la liste de fils.

    Ma question est donc très simple : Quelle est la liste la moins lourde en espace et pour laquelle l'ajout se fasse en temps constant et la lecture par itération en C++ svp ?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    ça semble un peu farfelu comme demande dit comme ça (millions, milliards, ..), mais ce que tu cherches est une liste simplement chaînée.
    Dans la std il y a la queue, mais elle utilise une deque par défaut qui ne correspond pas, je te conseillerais donc de créer une simple classe pour servir de Container à une queue, voire d'utiliser ta classe ainsi créée directement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si tu te poses la question, c'est que tu as déjà codé avec une solution raisonnable, telle que std::list, et que tu constates que les performances sont insuffisantes.

    Ma première suggestion, c'est de te pousser à regarder du côté de boost.intrusive.
    Les listes intrusives sont les plus efficaces en manipulation de mémoire, et sont effectivement en temps constant à l'ajout.
    Par contre, l'accès par index est lent, mais tu ne sembles pas en avoir besoin

    As-tu tout de même regardé si une simple map avec une classe de chemin comme clé ne suffirait pas?
    Par exemple, une std::list<string> avec un comparateur qui compare les éléments un par un.

    Et pour faire mieux, il y a un gain énorme à utiliser des entiers comme identifiants (plutot que des strings), quitte à avoir une map<identifiant, string> à coté pour traduire.


    Edit:
    Pour reprendre l'idée de Bousk, il y a la possibilité de définir la collection sous-jacente d'une queue: std::queue< Node, std::list<Node> >.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Par défaut
    D'accord merci beaucoup pour vos réponses, je vais voir ce que je peux faire.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Si on veut optimiser en temps comme en espace, une liste est à bannir... Un std::vector sera beaucoup mieux dans les deux cas ! Une liste a un overhead mémoire par noeud, et fragmente la mémoire, là où un vector n'a qu'un overhead par conteneur, et que les données sont contigües, ce qui permet une bonne utilisation du cache.

    Maintenant, on peut peut-être trouver mieux encore : Tu dis :
    les branches issues de chaque nœuds sont peu nombreuses
    Est-ce que ce nombre est borné avec une borne très petite ? Si oui, il vaudra mieux utiliser un std::array ayant pour taille cette borne. Tu évites alors des allocations mémoire et ta strucutre de données est encore plus contigüe.
    Si non, ça peut être une bonne idée quand même, mais il va falloir ruser, par exemple en utilisant un array quand il y a peu d'éléments, et en basculant vers un vector quand il y en a plus. Le tout packagé une bonne fois pour toutes pour éviter les fausses manips. Je te conseille de regarder par exemple http://llvm.org/docs/ProgrammersManu...-smallvector-h (l'article autour est intéressant lui aussi).

    Bien entendu, entre les différentes stratégies que je te propose, comme il n'y a pas de différences en terme de complexité algorithmique, uniquement en terme de détails d'implémentation, je te conseille d'essayer avec les 3 (l'interface doit être assez semblable pour que basculer de l'un à l'autre soit hyper simple), et de mesurer ce qui est le mieux sur les données que tu manipules.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Quelle structure de données pour mon projet ?
    Par stallaf dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2010, 17h12
  2. Quelle structure de données ? Analyse des occurrences d'un trigramme
    Par Tidus159 dans le forum Algorithmes et structures de données
    Réponses: 46
    Dernier message: 12/04/2009, 19h35
  3. Quelle structure de données ?
    Par SebSplo dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 27/01/2008, 03h52
  4. quelle structure de donnée par un arbre?
    Par rdh123 dans le forum C#
    Réponses: 1
    Dernier message: 31/12/2007, 15h27
  5. [C++] quelle structure de donnée utiliser pour stocker des vertices ?
    Par johnnyjohnny dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 14/07/2007, 21h44

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