Rappel : File (classique)¶
"First In - First Out"
mettre_en_file(File, T) -> void
sortir_de_file(File) -> T
est_vide(File) -> bool
Exemple : tâches à accomplir
- Trouver un sujet TIPE
- Préparer la colle de maths
- Faire les exercices de physique
- Faire le DM d'informatique
FIFO ?
Exemple : tâches à accomplir avec un niveau de priorité
- Trouver un sujet TIPE, Ã faire
- Préparer la colle de maths, très urgent
- Faire les exercices de physique, urgent
- Faire le DM d'informatique, extrèmement urgent
Type de données abstrait FileDePriorité et opérations¶
- Type paramétrique
FilePrio<Prio,T>
avecPrio
type des priorités (souventint
),T
type des tâches
création, destruction
ajouter(FilePrio,Prio,T) -> void
retirer_max(FilePrio) -> Prio, T
est_vide(FilePrio) -> bool
Implémentation possible (1)¶
Avec une liste de couples (priorité, tâche) non triée
- liste chaînée ou tableau extensible
Complexité des opérations ?¶
ajouter
en $\mathcal{O}(1)$retirer_max
en $\mathcal{O}(n)$ (on doit parcourir toute la liste)
Implémentation possible (2)¶
Avec une liste de couples (priorité, tâche) maintenue triée
- liste chaînée ou tableau extensible
Complexité des opérations ?¶
ajouter
en $\mathcal{O}(n)$ (insérer au bon endroit)retirer_max
en en $\mathcal{O}(1)$
Implémentation possible (3)¶
Avec un ABR équilibré
Complexité des opérations ?¶
ajouter
en $\mathcal{O}(\log n)$retirer_max
en en $\mathcal{O}(\log n)$ (on va chercher à droite toute)
Implémentation avec un "Tas"¶
cf cours à suivre ...
Idée : secouer un tas de graviers
Les gros au-dessus, les petits en-dessous
Les gros au-dessus, les petits en-dessous
Un exemple de tas :