parcourir une structure de graphe

parcourir une structure de graphe - Java - Programmation

Marsh Posté le 03-05-2007 à 01:03:39    

Bonjour,
 
J'ai une petite question algorithmique à vous poser, si cela ne vous dérange pas.
 
J'ai une structure de graphe représentant une méthode java en fait.
 
J'utilise une ArrayList dont les indices 0,1,... vont représenter les différents labels et pour chaque label (donc indice de mon tableau), j'associe un couple par exemple (inst, {2,4,8}) pour dire quaprès avoir executé l'instruction inst, on a plusieurs instructions potentielles à traiter: celles qui se trouvent au label, puis 4 et enfin 8 (donc en allant à l'indice 2 puis 4 et 8 de mon ArrayList).
La liste de labels est ouvent supérieure à 1 quand l'instruction est une conditionnelle par exemple...
 
Le pb c'est qu'après avoir traité l'instruction inst, je vais tout d'abbord aller au label 2, puis de ce label 2, j'aurais d'autres labels à traiter (pouvant être aussi par exemple ne liste de labels à plus d'un élement...)
 
Je sais que je termine un parcours quand j'arrive à l'instruction End, mais à ce moment là, faudrait réitérer sur ma liste du depart en allant ensuite au label 4...
 
Comment me conseillez-vous de faire ca algorithmiquement de facon la plus simple? sachant que forcement si je n'avais qu'un label possible à chaque fois par instruction, c'est facile, pq il suffit de parcourrir une seule fois la liste des différents labels, pour tomber sur le End, et là c'est définitivement fini...
 
Merci :-)
 
 
 
 

Reply

Marsh Posté le 03-05-2007 à 01:03:39   

Reply

Marsh Posté le 03-05-2007 à 08:26:42    

une fonction recursive est pas mal  
 
fonction  parcoursArbre(Noeud noeudCourant)
{
   
    execute(noeudCourant);
    Pour chaque noeud  dans la liste des fils de noeudCourant
           parcoursArbre(noeud);  
}

Reply

Marsh Posté le 03-05-2007 à 08:47:24    

Re,
 
ok, mais par exemple, sans utiliser la récursion, c'est possible facilement?
 
Sinon, si y'a pas d'autres solutions, je le ferai en récursif, mais je préférerais eviter.
 
Merci :-)


Message édité par thierry_b le 03-05-2007 à 08:47:36
Reply

Marsh Posté le 03-05-2007 à 08:51:07    

avec une pile c'est possible

 

pile.push(noeudRacine);
tant que ( taille(pile) > 0 )
{
   noeudCourant = pile.pop();
   Pour chaque noeud  dans la liste des fils de noeudCourant
           pile.push(noeud);
}

  

EDIT : ca marche aussi avec une file, ca depend du sens de parcours que tu veux


Message édité par flo850 le 03-05-2007 à 08:51:34
Reply

Marsh Posté le 03-05-2007 à 10:21:34    

Re,
 
ok, pour la version recursive, mais pour la version itérative, j'aimerais qques précisions, si j'ai bien compris avec l'algo qui utilise une pile ca fera en ordre d'exec:
 
l0, l2, l21, l1, l11 et l2 si on suppose par ex, que l0 a pour successeur l1 et l2, et que l1 a pour successeur l11 et l12 et que l2 a pour successeur l21 et l22?
 
Tandis qu'avec une queue, ca fera: l0, l1, l2, l11, l12, l21.
 
C'est bien ca?
 
Merci :-)

Reply

Marsh Posté le 04-05-2007 à 08:07:39    

Re,
 
Bon, je m'en suis bien sorti finalement :-)
 
Merci :-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed