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 :

Classes pour les mots


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut Classes pour les mots
    Bonjour,

    Je souhaiterais construire une classe C++ pour les mots sur un alphabet à deux lettres (par exemple 0,1) et une autre pour les mots sur quatre lettres (par exemple 00, 01, 10 et 11). Ces classes doivent implémenter toutes les opérations standards sur les mots : concaténation, recherche de caractère, recherche de sous-mot,... avec un grand soucis d'efficacité.

    Pour le stockage des données, une première implémentation possible serait d'utiliser le type char pour stocker une lettre mais on voit bien que question optimisation on a vu mieux.

    Une seconde implémentation consiste à utiliser un vector<unsigned int> et considérer que chaque élément contient sizeof(unsigned int) lettres (ou bien la même chose divisé par 2 pour les mots sur quatre lettres). Il faudra alors écraser les méthodes d'accès aux éléments et les itérateurs en utilisant les opérations de décalage de bits. Ca me semble un peu fumeux car on démonte précisément tout ce qui est utile dans cette classe. On peut aussi créer de nouveaux itérateurs iterator_on_bit, reverse_iterator_on_bit... et de nouvelles méthodes d'accès aux éléments at_bit()...

    Cependant, la solution la plus naturelle pour les mots sur deux lettres devrait utiliser vector<bool> ou bit_vector. J'aimerais savoir si ces deux classes sont standardisées quand au stockage des données. En effet, pour effectuer une recherche de sous-mot, on compare des 'segments' de mots de 32 ou 64 bits... il faut donc pouvoir y accéder directement et non pas simplement aux lettres.

    Une dernière solution consisterait à reconstruire depuis le début une classe de tableau dynamique (ce qui, je pense, n'est jamais une bonne idée en C++).


    Que feriez-vous/est-il possible de faire ? Voyez-vous d'autres solutions ?


    Merci,
    IFFL

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pour le stockage des données, une première implémentation possible serait d'utiliser le type char pour stocker une lettre mais on voit bien que question optimisation on a vu mieux.
    Comme quoi ? Utiliser un mot matériel (i.e. un int) par lettre ?
    Tu cherches à optimiser l'efficacité ou l'utilisation mémoire ?

    Ce que je ferais, c'est que je ferais simplement un conteneur de lettre, où lettre est un type qui identifie une lettre de l'alphabet.
    Que lettre puisse potentiellement tenir sur quelques bits, c'est pas vraiment ça le plus important...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut
    La gestion du temps et de l'espace mémoire n'est pas négligeable.
    codage sur char est 32 (voir 64) fois plus lent et plus couteux en mémoire que le codage sur bit.

    Par exemple pour une comparaison d'égalité entre deux mots de longueurs 32 :
    codage par bit --> une seule opération de processeur !
    codage par char --> 32 comparaisons (sans compter l'itération)

    Je suis d'accord, on ne gagne qu'un facteur. Mais je ne pense pas que ce facteur soit négligeable. Il y a quand même une différence entre 32 secondes et 1 seconde du point de vue de l'utilisateur.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut
    Je veux à la fois optimiser la mémoire et le temps.

    Qu'entends-tu par un type de conteneur ?

  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
    Citation Envoyé par info_folie_linux Voir le message
    Je veux à la fois optimiser la mémoire et le temps.
    Et moi je veux le beurre, l'argent du beurre, et le sourire de la crémière...

    Ces deux points sont souvent en conflit (bien qu'une faible utilisation mémoire soit favorable à la gestion du cache). Par exemple un vector<bool> va optimiser la mémoire, mais accéder à un bit va être plus lent, car on doit faire des opérations bit à bit. Tu pourrais peut-être encore plus optimiser la mémoire avec un algo de compression, mais l'accès sera encore plus long.

    J'ai l'impression que tu ne sais pas encore vraiment quelles vont être les problèmes de perf que tu vas rencontrer. Dans ce cas là, je te conseille de commencer par le plus simple à utiliser (vector<bool>, peut-être), mais en l'encapsulant bien de manière à pouvoir le modifier par la suite et à faire des mesures quand ton programme tournera.
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut
    Merci beaucoup pour vos réponses.

    En fait j'ai un programme qui tourne, ce dernier opère avec des données de type char (j'autorise 256 caractères). Mais très souvent, on est confronté à des alaphabets à deux lettres et trois lettres; ne-serait-ce que parce que les problèmes combinatoires sont plus simples. J'espérai gagner du temps en prévoyant une structure de donnée dans ce cadre là. Les opérations que j'effectue le plus souvent sont :
    concaténer une chaîne à une autre chaîne
    recherche de sous-mots
    parcourir la chaîne dans l'ordre
    accéder à un caractère

    Vous me déconseilleriez donc de prévoir une structure de donnée spécialisée pour les mots sur deux lettres ?

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par info_folie_linux Voir le message
    La gestion du temps et de l'espace mémoire n'est pas négligeable.
    codage sur char est 32 (voir 64) fois plus lent et plus couteux en mémoire que le codage sur bit.

    Par exemple pour une comparaison d'égalité entre deux mots de longueurs 32 :
    codage par bit --> une seule opération de processeur !
    codage par char --> 32 comparaisons (sans compter l'itération)

    Je suis d'accord, on ne gagne qu'un facteur. Mais je ne pense pas que ce facteur soit négligeable. Il y a quand même une différence entre 32 secondes et 1 seconde du point de vue de l'utilisateur.
    premature optimization is the root of all evil
    Tu rentre parfaitement dans ce cadre. Conseiller de coder sur un tableau de bit, c'est se compliquer la vie pour rien.

    Un programmeur devrait se concentrer là où se joue les performances, c'est à dire dans les algorithmes. Après, et seulement après avoir épuisé toutes les méthodes algorithmique d'optimisation, il peut s'attaquer à ce genre de détails si les performances sont si critiques que ca, ce qui ne semble pas être le cas ici. Et même s'il le fait, on il ne battra jamais un compilateur avec toutes les options d'optimisation.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. classe pour les boutons
    Par ver_for dans le forum IHM
    Réponses: 4
    Dernier message: 02/04/2008, 11h19
  2. [DEV] REALbasic, BWPreferencesFile : une classe pour les préférences
    Par gibet_b dans le forum Développement OS X
    Réponses: 0
    Dernier message: 18/09/2007, 14h38
  3. [PEAR] Class pour les logs
    Par sebos63 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 13/11/2006, 13h53
  4. Auto-complétion pour les mots clés Begin/End
    Par Alex Laforest dans le forum EDI
    Réponses: 2
    Dernier message: 21/09/2005, 21h26
  5. Des classes pour les liens en CSS
    Par Invité dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 08/03/2005, 14h31

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