les tas pour Dijkstra - Algo, la page

Download Report

Transcript les tas pour Dijkstra - Algo, la page

Algorithmique
td no 7+ – mars 2014
Info-Spé Api
Epita
les tas pour Dijkstra
Le type
Le tas est un enregistrement contenant :
tas : des sommets (pointeur vers le sommet). La relation d’ordre est donnée par le vecteur
en paramètre des algos ;
index : pour chaque sommet, sa position dans le vecteur tas, -1 s’il n’est pas présent ;
taille : la taille du tas.
constantes
MaxSommets = 50
types
t_AB_hierarchique = MaxSommets t_listsomm
t_vect_entiers = MaxSommets entier
t_tas = enregistrement
t_AB_hierarchique
tas
t_vect_entiers
index
entier
taille
fin enregistrement t_tas
Utilisation
1. Initialisation :
Spécifications :
La procédure init_tas (t_tas T ) initialise T .
algorithme procedure init_tas
parametres globaux
t_tas
T
variables
entier
i
debut
T.taille ← 0
pour i ← 1 jusqu’a MaxSommets faire
T.index[i] ← -1
fin pour
fin algorithme procedure init_tas
Remarque : On pourrait passer en paramètre l’ordre du graphe, pour n’initialiser que la partie
"utile" du vecteur index.
1
Algorithmique
td no 7+ – mars 2014
Info-Spé Api
Epita
2. Test vide :
Spécifications :
La fonction est_vide (t_tas T ) retourne vrai si le tas T est vide, faux sinon.
algorithme fonction est_vide
parametres locaux
t_tas
T
debut
retourne (T.taille = 0)
fin algorithme fonction est_vide
3. Mise à jour et ajout :
Si le sommet n’est pas présent, alors il est ajouté à la suite des autres dans le vecteur (en nouvelle
feuille dans l’arbre, à la suite de la dernière feuille du dernier niveau). L’arbre reste donc parfait.
Sinon, on garde sa position (grace à l’index).
Pour rétablir la relation d’ordre, on compare la valeur de l’élément courant à celle de son père, et on
les échange (en réalité, pas d’échanges) si nécessaire. Cette opération est répétée jusqu’à ce qu’on
ait trouvé la place de l’élément (éventuellement comme nouvelle racine).
Spécifications :
La procédure ajout_modif (t_tas T , t_listsom ps, t_vectReels dist) ajoute le sommet pointé par ps au tas T s’il n’y est pas déjà. Sinon, la position du sommet est mise à
jour sa nouvelle distance est inférieure à l’ancienne). Le vecteur dist contient les distance pour
la relation d’ordre dans le tas. On suppose que T.taille < M axSommets au moment de l’appel.
algorithme procedure ajout_modif
parametres globaux
t_tas
T
parametres locaux
t_listsom
ps
t_vectReels dist
variables
entier
i
debut
si T.index[ps↑.som] = -1 alors
T.taille ← T.taille + 1
i ← T.taille
sinon
i ← T.index[ps↑.som]
fin si
tant que (i > 1) et (dist[ps↑.som] < dist[T.tas[i div 2]↑.som]) faire
T.tas[i] ← T.tas[i div 2]
T.index[T.tas[i].↑.som] ← i
i ← i div 2
fin tant que
T.tas[i] ← ps
T.index[ps↑.som] ← i
fin algorithme procedure ajout_modif
2
Algorithmique
td no 7+ – mars 2014
Info-Spé Api
Epita
4. Suppression du minimum :
Pour conserver la propriété d’arbre parfait, la dernière feuille du dernier niveau doit disparaître :
l’élément contenu dans cette feuille remplace la racine (l’élément minimum). Ensuite, la méthode
est similaire à celle de l’ajout ; on échange cette valeur avec la plus petite de ses deux fils jusqu’à
trouver sa place.
Spécifications :
La fonction supprime_min (t_tas T , t_vectReels dist) retourne la valeur de l’élément
minimum du tas T qu’elle a supprimé. Le vecteur dist contient les distance pour la relation
d’ordre dans le tas.
On suppose que le tas n’est pas vide.
algorithme fonction supprime_min : t_element
parametres globaux
t_tas
T
parametres locaux
t_vectReels dist
variables
reel
val
t_listsom
ps_min, ps
entier
i, j
debut
ps_min ← T.tas[1]
ps ← T.tas[T.taille]
val ← dist[T.tas[T.taille]]
T.taille ← T.taille - 1
i ← 1
tant que i <= T.taille div 2 faire
/* pas une feuille */
j ← 2*i
si (j+1 <= T.taille) et (dist[T.tas[j+1]] < dist[T.tas[j]]) alors
j ← j+1
fin si
si val > dist[T.tas[j]] alors
T.tas[i] ← T.tas[j]
T.index[T.tas[i]↑.som] ← i
i ← j
sinon
i ← T.taille
fin si
fin tant que
T.tas[j div 2] ← T.tas[T.taille+1]
index[ps↑.som] ← j div 2
retourne ps_min
fin algorithme fonction supprime_min
Remarque : Ici aussi, les échanges sont "virtuels" !
3