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

Algorithmes et structures de données Discussion :

parcourir un tableau aléatoirement


Sujet :

Algorithmes et structures de données

  1. #1
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut parcourir un tableau aléatoirement
    bien le bonjour

    mon problème est le suivant :
    je dois effectuer un traitement sur toutes les cases d'un tableau mais je ne peux pas parcourir mon tableau case après case.

    Ma contrainte est que la case sur laquelle je fais le traitement doit être choisie alétoirement. Et je dois traiter toutes les cases.

    En gros, actuellement j'ai mon tableau et un tableau miroir contenant des booléens symbolisant si le traitement a déjà été fait ou non sur la case miroir. Et j'ai un compteur de cases déjà traitées.

    j'en suis là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     TANT QUE mon nombre de cases traitées < nb total de cases à traiter
     
    choisir une case aléatoire
    vérifier que cette case n'a pas déjà été traitée en regardant la case miroir.
    SI la case choisie a déjà été traitée, 
        on boucle jusqu'à  ce qu'on en trouve une pas encore traitée
    FINSI
     
        je fais mon traitement
        case miroir = oui.
     
    nombre_de_cases_traitées++
    FIN TANT QUE
    mais le gros soucis de cette méthode est que pour les tableaux assez volumineux, il faudra un grand nombre de tours de boucles "dans le vent" pour obtenir les dernières cases qui restent à traiter, il mettra du temps à les trouver ; et bien sûr l'algo prend vite beaucoup de temps.

    j'espère m'être fait comprendre.
    quelqu'un a-t-il une solution à me proposer ?

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Tu peux conserver une liste des indices des valeurs non-traitées, mettons sous forme d'un tableau.
    A chaque itération, tu prends un élément au hasard dans cette liste, tu le traites, et tu le supprimes de ta liste des indices des valeurs non-traitées (décalage des valeurs suivantes par dessus)
    Attention !!! La suppression diminue le nombre d'éléments de ce tableau, il faut en tenir compte pour le tirage aléatoire suivant ...

    Comme ça, tu traite une valeur à chaque tirage ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Une autre solution peut être un mélange dans le genre "shuffle".

    Base de départ : une LUT simple de cardinalité N (N étant le cardinal de ton tableau d'origine), avec LUT(i)=i.

    Tu vas mélanger cette LUT en permutant de manière aléatoire ses éléments (par paires), et ceci un nombre suffisant de fois pour approcher un mélange complet aléatoire (2*N permutations devraient suffire, peut-être un peu plus si tu constates trop de séquences continues).

    Ensuite, tu n'as qu'à parcourir ta LUT séquentiellement, et traiter dans ton tableau d'origine l'élément LUT(i), ce qui aura pour effet de traiter ton tableau de manière aléatoire sans risquer de retomber sur un élément déjà traité, ni d'avoir "du mal" à trouver une case non-traitée.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    tu peux aussi te créer un autre tableau (tabparcours) ayant autant de case que ton tableau à traiter (tab)
    puis tu le remplis par des nombres de 0 à la longueur de ton tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i=0 to longueur(tabparcours)-1: tabparcours[i]=i
    puis tu permutes toutes les cases (la ième avec une choisis aux hasards)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i=0 to longueur(tabparcours)-1:
        swap(tabparcours,i,rand(len(tabparcours(i)))
    enfin, tu n'as plus qu'à traiter ton tableau (tab) avec le parcours de tabparcours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i=0 to len(tabparcours)-1:
         traiter(tab[tabparcours[i]])
    Edit: enh fait ce que je propose est la même chose que ce que propose Mac_Lak sauf qu'il n'y a besoin que de N permutations pour le tableau tabparcours (ou LUT)

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] parcourir un tableau?
    Par kanzarih dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2006, 00h32
  2. Parcourir un tableau?
    Par kanzarih dans le forum Oracle
    Réponses: 2
    Dernier message: 19/01/2006, 19h45
  3. Meilleure Méthode pour parcourir un tableau
    Par KPitN dans le forum MFC
    Réponses: 7
    Dernier message: 24/02/2005, 16h19
  4. Comment parcourir un tableau
    Par petitsims dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/01/2005, 14h33
  5. [langage] Parcourir un tableau
    Par Jibees dans le forum Langage
    Réponses: 13
    Dernier message: 22/04/2003, 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