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 :

Savoir si un élément appartient à une liste/table sans la parcourir complètement ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut Savoir si un élément appartient à une liste/table sans la parcourir complètement ?
    Imaginons un tableau de long.

    Est-il possible de savoir si un long appartient a ce tableau sans avoir à le parcourir ?

    Et si non existe t'il un autre type de variable qui me permettrait de faire le même genre de test sans tout parcourrir ?

    (optimisation quand tu nous tiens )

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Oui, si tu connais la taille de ton tableau et que celui-ci est trié, alors tu peux procéder par dichotomies successives. En gros, tu tapes dans le milieu de la table, tu regardes si ton élément est plus grand ou plus petit que celui que tu lis. En fonction de cela, tu considères la moitié qui t'intéresse, et tu recommences. Tu obtiens donc à chaque tour des moitiés, puis des quarts puis des huitièmes de tables, et ainsi de suite.

    Tu peux donc garantir, par exemple, qu'avec une table de 100 éléments, tu trouveras forcément le bon élément avant le huitième coup.

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    qsort() est fait pour cela.

  4. #4
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Donc il n'existe aucune structure en C permettant un accès directe sans aucun parcours.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je pense que ce genre de chose n'existe dans aucun langage, ou plutôt, certains langages fournissent des fonctions du type indexof(), mais dans tous les cas il y a une recherche, soit par dichotomie si le tableau est trié, soit d'un bout à l'autre dans le cas contraire.
    Le terme "structure" a un sens bien particulier en C.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par spin0us Voir le message
    Donc il n'existe aucune structure en C permettant un accès directe sans aucun parcours.
    Si, bien sûr que si, pour peu que ta liste soit déjà ordonnée d'une manière ou d'une autre. Et ça, ce n'est pas propre au C, c'est une question d'algorithmique. Lorsque tu cherches un nom dans l'annuaire téléphonique, tu ne te paluches pas le bottin entier. Tu le prends au milieu, puis tu navigues vers son début ou vers sa fin jusqu'à ce que tu trouves le nom qui t'intéresse. Cela dit, il n'y a pas moyen de tomber directement sur le nom recherché dès l'ouverture du livre, sauf coup de chance.

    — Si ta question est : existe-t-il une fonction pour le faire à ma place ? La réponse est : oui, il y en a plein ;
    — Si ta question est : puis-je accéder directement à un élément dont je connais l'emplacement, là aussi c'est élémentaire (un tableau suffit) ;
    — Si ce à quoi tu penses, ce sont les tableaux associatifs d'autres langages comme « password['Obsidian'] », alors ce n'est pas un accès direct à l'élément : il y a bien une recherche qui est effectuée, mais elle est masquée aux yeux du programmeur et c'est bien dommage car elle peut être très longue dans certains cas.

    Précise ta pensée.

  7. #7
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    — Si ce à quoi tu penses, ce sont les tableaux associatifs d'autres langages comme « password['Obsidian'] », alors ce n'est pas un accès direct à l'élément : il y a bien une recherche qui est effectuée, mais elle est masquée aux yeux du programmeur et c'est bien dommage car elle peut être très longue dans certains cas.
    C'était bien cette solution là que je cherchais à reproduire. Maintenant, concrètement j'ai des clients qui arrivent sur une socket d'écoute, ils s'identifient via leur numéro qui est un timestamp unix et j'y associe un numéro de socket pour la durée de l'échange. D'un autre côté j'ai des actions à déclencher et qui cible un numéro précis de boitier. Donc plutôt que de parcourir l'ensemble des boitiers connectés je cherchais un moyen d'atteindre directement le boitier concerné pour accélérer au maximum le temps d'exécution.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Joa,

    Je me demande comment tu as pu espérer/envisager que ce que tu désires soit faisable.

    Avec un peu de bon sens et/ou de réflexion, tu saurais que ça ne peut pas exister.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par spin0us Voir le message
    C'était bien cette solution là que je cherchais à reproduire. Maintenant, concrètement j'ai des clients qui arrivent sur une socket d'écoute, ils s'identifient via leur numéro qui est un timestamp unix et j'y associe un numéro de socket pour la durée de l'échange. D'un autre côté j'ai des actions à déclencher et qui cible un numéro précis de boitier. Donc plutôt que de parcourir l'ensemble des boitiers connectés je cherchais un moyen d'atteindre directement le boitier concerné pour accélérer au maximum le temps d'exécution.
    C'est encore un peu flou. Tu parles de timestamp, de boitier. Je vois pas trop comment tu fais le lien.

    Mais pourquoi ne pas créer une structure contenant {
    n° de socket
    actions à déclencher
    }

    Puis tu crées un tableau tab[] de structures. Quand tu as ton n° "b" de boitier, tu vas directement taper dans tab[b]...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2013, 12h19
  2. Réponses: 1
    Dernier message: 02/05/2013, 20h19
  3. [AC-2007] trier éléments d'une liste non liée à une table
    Par atech dans le forum IHM
    Réponses: 5
    Dernier message: 23/08/2011, 13h46
  4. Réponses: 2
    Dernier message: 05/08/2009, 15h58
  5. Réponses: 3
    Dernier message: 24/07/2007, 19h31

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