CSI2510 Structures des Données et Algorithmes CSI2510 - Paola Flocchini
Structures de données? Comment organiser les données pour optimiser l’efficacité des opérations qu’il faut effectuer sur les données CSI2510 CSI2510 - Paola Flocchini
Structures de données? Exemple: Contient des données différents: l‘annuaire de téléphone électronique Pierre 622-9823 Contient des données différents: - Des noms Des numéro de téléphone Des adresses Michele 75 Bronson Sylvie 110 Bank Paola 112-4433 OPERATIONS: - ajouter - effacer chercher un numéro de téléphone chercher une adresse CSI2510 CSI2510 - Paola Flocchini
Structures de données? Exemple: Lisa 223-4433 Pierre 543-1234 Michael Michele John 110 Bank 622-9823 112-4433 75 Bronson Paola Lisa 223-4433 Pierre 543-1234 Michael 123-4567 Anne 321-6745 Lisa 223-4433 Pierre 543-1234 Michael 123-4567 Anne 321-6745 Lisa 223-4433 Pierre 543-1234 Michael 123-4567 Anne 321-6745 CSI2510 CSI2510 - Paola Flocchini
Structures de données? Exemple: Anne 321-6745 Lisa 223-4433 Pierre Michele John 110 Bank 622-9823 112-4433 75 Bronson Paola Anne 321-6745 Lisa 223-4433 Pierre 543-1234 Michael 123-4567 CSI2510 CSI2510 - Paola Flocchini
Structures de données? Penser aux opérations que vous avez besoin d’exécuter. Choisir la meilleure structure pour vos données. Nous allons étudier les différentes structures de données. Comment savoir si une structure de données est bonne ? CSI2510 CSI2510 - Paola Flocchini
Les objectifs du cours Présenter, de façon systématique, les structures de données le plus utilisées, en soulignant leurs propriétés abstraites. Discuter des algorithmes typiques qui traitent chaque type de structure, et analyser leur performance. Comparer les différentes structures de données pour résoudre des problèmes similaires, et choisir la meilleure CSI2510 CSI2510 - Paola Flocchini
Rappel Tableaux Structures chaînées CSI2510 1 2 3 4 5 6 7 1 2 3 4 5 6 7 NULL CSI2510 CSI2510 - Paola Flocchini
Opérations typiques sur les objets Insérer un objet Supprimer un objet Chercher un objet CSI2510 CSI2510 - Paola Flocchini
Tableau A: structure statique accès direct aux cellules 1 2 3 4 5 6 7 A: Ensemble de longueur fixe, composé de cellules indexées contenant des variables du même type. structure statique accès direct aux cellules Insertion ? Suppression ? CSI2510 CSI2510 - Paola Flocchini
Tableau a c d m o f Un exemple d’insertion dans un tableau trié 1 2 3 1 2 3 4 5 6 7 f Un exemple d’insertion dans un tableau trié CSI2510 CSI2510 - Paola Flocchini
Tableau a c d m o a c d m o a c d m o a c d f m o f Déplacer ‘m’ et ‘o’ pour faire de la place pour ‘f’ f a c d m o 1 2 3 4 5 6 7 a c d m o 1 2 3 4 5 6 7 a c d m o 1 2 3 4 5 6 7 a c d f m o 1 2 3 4 5 6 7 CSI2510 CSI2510 - Paola Flocchini
Tableau a c d f m o p z 1) Pour des insertions et des suppressions, 1 2 3 4 5 6 7 1) Pour des insertions et des suppressions, les éléments doivent être déplacés. 2) et si le tableau est plein? CSI2510 CSI2510 - Paola Flocchini
Structures chaînées Structure dynamique Accès séquentiel aux éléments NULL Structure dynamique Accès séquentiel aux éléments Ajout et suppression sans déplacer les éléments CSI2510 CSI2510 - Paola Flocchini
Liste simplement chaînée NULL Nœud v Suivant (next) Objet élément Nœud suivant v élément CSI2510 CSI2510 - Paola Flocchini
Liste simplement chaînée L’implémentation en Java sera traitée durant les séances de laboratoire Une liste chaînée possède normalement ces méthodes: setElement(Object e) setNext(Object newNext) getElement() getNext() La liste chaînée (SlinkedList) est définie par le nœud tête (head) et par sa taille (size) CSI2510 CSI2510 - Paola Flocchini
Liste simplement chaînée - Insertion Configuration originale: head NULL v But: insérer l’élément v dans la liste. CSI2510 CSI2510 - Paola Flocchini
Insertion au début d’une liste simplement chaînée head head v size size+1 NULL v.setNext(head) v (facile) … Nous utilisons pseudocode … head v == la variable head aura la valeur de la variable v CSI2510 - Paola Flocchini CSI2510 - Paola Flocchini
Liste simplement chaînée : Insertion après r w r head NULL v w getNext(r ) v.setNext(w) r.setNext(v) size size+1 Facile CSI2510 CSI2510 - Paola Flocchini
r h v Liste simplement chaînée : Insertion avant r NULL v Maintenir un pointeur à l’élément précédant (parcourir le liste) ou Échanger les contenus pointés par r et v et insérer v après r. (plus difficile) CSI2510 CSI2510 - Paola Flocchini
Liste simplement chaînée - Recherche head NULL tmp Traverser la liste Node tmp; tmp firstnode; while (tmp != null ) { if (tmp .element = élément qu’on recherche) return tmp ; } else {………..} CSI2510 CSI2510 - Paola Flocchini 21
Liste simplement chaînée - Recherche head NULL tmp Node tmp; tmp firstnode; while (tmp != null ) { if (tmp.element = élément qu’on recherche) return tmp ; } else { tmp tmp.getNext() } Traverser la liste CSI2510 CSI2510 - Paola Flocchini 22
Liste simplement chaînée - Suppression head NULL Premier élément (facile) Élément après r (facile) Élément à r (difficile) head head.getNext() … w r.getNext() r.setNext(w.getNext()) ….. Utiliser un pointeur à l’élément précédant, ou Échanger les contenus de l’élément à r avec les contenus de l’élément suivant, et effacer l’élément après r. **Très difficile si r indique dernier élément! CSI2510 CSI2510 - Paola Flocchini
Liste doublement chaînée trailer header Suivant(next) Précédent (prev) Chaque nœud (Dnode) contient: Un élément (element) Un lien vers le nœud précédent (prev) Un lien vers le nœud suivant (next) Noeud(DNode) CSI2510 CSI2510 - Paola Flocchini
Liste doublement chaînée trailer header Méthodes de la classe Dnode: void setElement(Object e) void setPrev(DNode newPrev) void setNext(DNode newNext) Object getElement() DNode getPrev() DNode getNext() La liste doublement chaînée (DList) est définie par les deux nœuds spéciaux tête (header) et queue (trailer) et par sa taille (size) CSI2510 CSI2510 - Paola Flocchini
Liste doublement chaînée –Suppression (début) Supprimer v u v.getPrev() u w v.getNext() w v u.setNext(w) trailer header w.setPrev(u) v.setPrev(null) v.setNext(null) size size-1 CSI2510 CSI2510 - Paola Flocchini
Liste doublement chaînée –Suppression (milieu) w Supprimer v u v trailer header u v.getPrev() w v.getNext() w.setPrev(u) u.setNext(w) v.setPrev(null) v.setNext(null) size size-1 CSI2510 CSI2510 - Paola Flocchini 27
Liste doublement chaînée - Insertion (début) w Insérer v header trailer v w header.getNext() v.setNext(w) v.setPrev(header) w.setPrev(v) header.setNext(v) Size size+1 CSI2510 CSI2510 - Paola Flocchini 28
Liste doublement chaînée - Insertion (après p) w header Insérer v après p trailer v w p.getNext() v.setNext(w) v.setPrev(p) w.setPrev(v) p.setNext(v) size size+1 CSI2510 CSI2510 - Paola Flocchini 29
Liste doublement chaînée - Insertion (avant p) Insérer v avant p header trailer v p header trailer v CSI2510 CSI2510 - Paola Flocchini 30
Conclusion: Structures chaînées vs Tableaux trailer header 1 2 3 4 5 6 7 Structure Chaînée Tableau Structure dynamique (jamais pleine) Structure figée Pas besoin de déplacer les éléments lors des insertions - suppressions Insertions suppressions des éléments plus laborieuses Pas d’accès direct à un élément donné de la structure (parcours de la structure obligatoire) Accès direct à une cellule donnée CSI2510 - Paola Flocchini CSI2510 - Paola Flocchini 31