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 :

tableau file circulaire


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut tableau file circulaire
    bonsoir,

    j'essaye de modélisation une file avec un tableau statique et pour optimiser la place, je souhaite faire une file circulaire.
    avant de coder tout ça , j'essaye dèjà de faire l'algo. j'ai trouvé des codes sur ce site mais je ne comprends pas l'incrémentation de certains indices.

    voilà ce que j'ai :

    taille_maximale : 10
    file : tableau d'entier de 0 à 9
    la file étant en fifo j'ai besoin de deux indices:
    indice_ins : indice de la case pour l'insertion d'un nouveau entier
    indice_ext : indice de la case où extraire l'élement
    j'utilise un booléen "plein" pour savoir si la file est pleine ou non

    pour l'initialisation :
    indice_ins et indice_ext prennent la valeur 0, celle de la première case du tableau
    plein prend la valeur faux

    La file est vide si indice_ins = indice_ext et si plein vaut faux

    Pour l'insertion , il faut d'abord vérifié que la file n'est pas plein en vérifiant la valeur du booléen plein , puis on insert à l'indice "indice_ins" et on doit l'incrémenter de 1.
    c'est là que mon résonnement differt de ce que je trouve sur le net :
    moi je teste si indice_ins == taille_max et si c'est le cas je dis que indice_ins doit prend la valeur 0.
    les codes trouvés incrémentent indice_ins avec (indice_ins+1) % taille_max
    et je ne vois pas pourquoi
    est ce que quelqu'un pourait m'expliquer s'il vous plait ??
    j'ai fais des exécutions papiers des deux résonnements et je n'arrive pas à comprendre "(indice_ins+1) % taille_max" et je doute que mon résonnement soit exaxte vu que je l'ai trouvé nulle part

    merci d'avance

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par P'tite Nélodie
    c'est là que mon résonnement differt de ce que je trouve sur le net :
    moi je teste si indice_ins == taille_max et si c'est le cas je dis que indice_ins doit prend la valeur 0.
    les codes trouvés incrémentent indice_ins avec (indice_ins+1) % taille_max
    Ca sera équivalent puisque tu incrémentes ou décrementes toujours ton indice de 1 en 1. Ca permet juste de retirer la condition et d'obtenir directement la bonne formule en utilisant un modulo.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Le gros avantage du modulo (X % 3), c'est qu'il donne le reste de la division du premier terme par le second...

    Autrement dit, tu n'auras jamais une valeur comprise entre 0 et X-1, ce qui, dans ton cas, correspond justement à... la fourchette d'indices utilisables dans ton tableau.

    (ben oui: 1%3=1, 2%3=2 3%3=...0 4%3=...1 et on recommence...)

    Ceci dit, le principe d'une même d'une liste circulaire fait que les avantages sont important à l'utiliser de manière dynamique:
    • L'insertion et le retrait d'élément est facilité (plus besoin de vérifier si le tableau est plein, ou si l'élément existe)
    • la sélection d'un élément est facilité (si tu ne dois plus disposer d'un élément, tu le supprime de la liste, et tu ne dois pas commencer à faire attention au fait qu'il y a peut etre un élément "supprimé" au milieu du tableau)
    • ...

    Pour implémenter une liste circulaire de manière dynamique, ce n'est, en outre, pas beaucoup plus compliqué que pour l'implémenter de manière statique...

    La seule différence (et, il est vrai, le seul inconvéniant) notable sera du point de vue de son utilisation où l'acces au Nième élément par rapport à ta position dans la liste ne se fera plus avec une complexité de 1, mais bien avec une complexité de N (il faudra demander d'accéder N fois à l'élément suivant dans la liste)...

    Ceci dit, la différence de temps d'exécution, tant que tu n'essaye pas d'accéder au 10.000.000 élément de la liste par rapport à ta position actuelle, sera minime, du fait meme des vitesses atteintes à ce jour par les ordinateurs

    Le principe d'implémentation d'une liste chaînée dynamique est relativement simple, mais, il semblerait que la balise CODE ne soit plus en activité pour l'instant... si l'implémentation dynamique t'intéresse, je me ferai un plaisir de te donner un exmple plus tard
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par P'tite Nélodie
    j'essaye de modélisation une file avec un tableau statique et pour optimiser la place, je souhaite faire une file circulaire.
    avant de coder tout ça , j'essaye dèjà de faire l'algo. j'ai trouvé des codes sur ce site mais je ne comprends pas l'incrémentation de certains indices.

    voilà ce que j'ai :

    taille_maximale : 10
    file : tableau d'entier de 0 à 9
    la file étant en fifo j'ai besoin de deux indices:
    indice_ins : indice de la case pour l'insertion d'un nouveau entier
    indice_ext : indice de la case où extraire l'élement
    j'utilise un booléen "plein" pour savoir si la file est pleine ou non
    OK. Mais pour savoir si tu as le droit de lire, il faut aussi un flag ('vide'), car l'égalité des indices ne permet pas de savoir si le file est vide ou pleine.

    Il est cependant possible de le déterminer en combinat l'égalité des indices et l'état du flag plein... (iw : indice d'écriture, ir : indice de lecture)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vide := iw = ir AND NOT full
    personnellement, et pas souci de symétrie et de simplicité, je préfère maintenir l'état d'un flag vide au moment de l'initialisation (vide := TRUE) et des lectures (vide := ir = iw, après lecture)
    pour l'initialisation :
    indice_ins et indice_ext prennent la valeur 0, celle de la première case du tableau
    plein prend la valeur faux
    OK.
    La file est vide si indice_ins = indice_ext et si plein vaut faux
    OK, on s'est compris...
    Pour l'insertion , il faut d'abord vérifié que la file n'est pas plein en vérifiant la valeur du booléen plein , puis on insert à l'indice "indice_ins" et on doit l'incrémenter de 1.
    Correct.
    c'est là que mon résonnement differt de ce que je trouve sur le net :
    moi je teste si indice_ins == taille_max et si c'est le cas je dis que indice_ins doit prend la valeur 0.
    Ton 'raisonnement' est correct.
    les codes trouvés incrémentent indice_ins avec (indice_ins+1) % taille_max
    et je ne vois pas pourquoi
    est ce que quelqu'un pourait m'expliquer s'il vous plait ??
    L'implémentation (peu recommandée, AMA, question de perf) avec les % produit le même comportement.

    Ton raisonnement est correct et c'est celui que j'utilise, si je me souviens bien.

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module FIFO.

Discussions similaires

  1. [Socket][File] Envoyer un tableau de byte
    Par itsmii dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 30/01/2014, 09h10
  2. File circulaire avec gestion des exceptions
    Par nicosmash dans le forum Contribuez
    Réponses: 1
    Dernier message: 20/06/2013, 16h32
  3. Tableau Trié circulaire
    Par linformaticien dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 22/10/2012, 10h27
  4. conversion d'un tableau de string en tableau de file
    Par sroux dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 01/12/2006, 11h19
  5. [Stream] Mettre le contenu d'un File dans un tableau de byte
    Par JohnBlatt dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 25/08/2006, 14h18

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