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 :

Inverser l'ordre lexicographique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Inverser l'ordre lexicographique
    Supposons qu'une string soit la clé pour définir l'ordre d'une structure quelconque.
    Pour inverser cet ordre suffit-il d'inverser tous les bits de chaque octet de la string ?

    Intuitivement je pense que oui, mais il y a un soucis quand une string est la sous-string d'une autre:
    "a" < "ab"
    mais
    not("a") < not("ab") [alors qu'on voudrait not("ab") < not("a")]

    Pour que cela puisse être généralisable il suffit me semble-t-il d'ajouter l'octet nul à la fin (qui deviendrait '\xFF' après inversion de ses bits):
    "a\0" < "ab\0"
    not("ab\0") < not("a\0")

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Yes on dirait bien que tu as raison. Tu cherches une preuve mathématique ?

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Non, l'affirmative suffit
    Merci !

    Il me reste à trouver le calcul optimal pour le faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef unsigned char byte;
     
    byte b;
    ...
    byte inverted_b=0xFF-b;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte inverted_b=b^0xFF;
    Le deuxième code fait gagner quelques octets sur le code machine, et peut-être quelques nanosecondes à l'exécution.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Et ce serait pas plus rapide de simplement changer la callback de comparaison plutôt que d'inverser toutes les clés ?

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Lorsqu'on a accès à la callback, oui bien sûr.

    En dehors d'un contexte C/C++ je me posais cette simple question de logique.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Bon, je précise un peu plus le contexte.

    Je fais un petit prg qui lit des fichiers textes. Ces fichiers sont des tables de données dont chaque ligne est un enregistrement, les champs étant séparés par des tabulations. Rien que du très classique donc.
    L'output du prg est un fichier équivalent dont les lignes sont triés suivant certains critères.
    Ces critères de tri sont définis dans une sorte de script. Exemple, trier suivant les champs 2 puis 5 puis 1, en considérant que 2 est un entier non signé, 5 un entier signé, et 1 une string (éventuellement à normaliser). Il pourrait aussi y avoir des dates ou des nombres non entiers (des flottants quoi), et l'ordre pourrait être montant ou descendant.

    Il n'y a qu'une seule "callback" dans le prg, mais elle doit gérer n'importe quel cas au runtime.
    Je vois deux approches.
    Dans la première, la callback gère une structure contenant un vector de variant (ou de boost::any) et en fonction du type effectue la comparaison ad-hoc élément par élément.
    Dans la deuxième, la callback ne gère qu'une chaine d'octet et fait un memcmp dessus, sans plus. En amount cette chaine est construite une seule fois par enregistrement de sorte à ce qu'elle soit lexicographiquement ordonnable en fonction des critères. C'est simple pour des entiers par exemple qu'il suffit d'arranger en big endian dans la chaine, ou pour des string que l'on arrange en UTF8.

    Voilà, vos avis ?
    Merci.

Discussions similaires

  1. Inverser l'ordre des lignes ?
    Par tintin72 dans le forum Débuter
    Réponses: 8
    Dernier message: 16/12/2008, 13h57
  2. [JpGraph] Inverser l'ordre de l'axe des coordonnées
    Par Bonjovi51 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 05/12/2008, 19h27
  3. [Débutante] Tri ordre lexicographique
    Par débutantepascal dans le forum Pascal
    Réponses: 12
    Dernier message: 25/04/2007, 20h58
  4. [C#] Inverser l'ordre des éléments d'une Hashtable
    Par lancer83 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 31/08/2006, 20h03
  5. inverser l'ordre de lecture des post
    Par serge-07 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 19/04/2006, 10h31

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