La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

LISTES.

Présentations similaires


Présentation au sujet: "LISTES."— Transcription de la présentation:

1 LISTES

2 OBJECTIFS Apprendre à utiliser les listes fournies dans la librairie standard de Java (interface List) Apprendre à utiliser les « itérateurs » pour parcourir des listes Comprendre l’implantation des listes chaînées Faire la différence entre types de données abstraits et concrets Connaître l’efficacité des opérations fondamentales des listes et des tableaux Se familiariser avec les types pile et queue 4/20/2019 IFT1020

3 CODES List.java (interface) ArrayList.java LinkedList.java Stack.java
SLLNode.java DLLNode.java Stack.java Queue.java Ainsi que plusieurs tests 4/20/2019 IFT1020

4 Types Abstraits de Données (Abstrat Data Types – ADT)
Le type abstrait de données définit les opérations fondamentales sur les données (concept d’interface) Le type abstrait de données ne spécifie par l’implantation. 4/20/2019 IFT1020

5 ADT Liste abstraite Une séquence ordonnée d’éléments pouvant être parcourue dans l’ordre, permettant l’insertion et le retrait d’éléments à n’importe quelle position, … Tableau abstrait Une séquence ordonnée d’éléments permettant des accès directs en spécifiant la position par un index entier. 4/20/2019 IFT1020

6 Vue abstraite d’une liste implantée avec un tableau
Premier élément Dernier élément 4/20/2019 IFT1020

7 Vue concrète d’une liste implantée avec un tableau
4/20/2019 IFT1020

8 Allons voir le code de List.java et de ArrayList.java…
4/20/2019 IFT1020

9 Efficacité des opérations principales de ArrayList
Ajouter et retirer un élément En moyenne n/2 éléments doivent être déplacés Dans la notation grand-O, O(n) Accès aléatoires Direct avec des index dans le tableau. Dans la notation grand-O, O(1) 4/20/2019 IFT1020

10 Coût pour agrandir le tableau dynamiquement
Pour n insertions, on a agrandi le tableau lorsque nous avions n/2, n/4, n/8, … éléments Il a fallu mettre dans un nouveau tableau ces éléments chaque fois, càd n/2 + n/4 + n/8 + … n(1/2 + 1/4 + 1/8 +…) Lorsque n tend vers l’infini, la série ½ + ¼ + … tend vers 1, pour n éléments on a donc recopié n(1) = n éléments. Conséquemment, le coût associé pour agrandir le tableau dynamiquement, lorsque n est grand, est dans O(n). Ce coût, amorti sur les n éléments insérés, est de n/n, soit sans la notation grand-O, O(1). 4/20/2019 IFT1020

11 Iterator… La classe interne (inner) GDIterator donne accès aux éléments de la liste en les parcourant de gauche à droite. GDIterator « protège » la liste tout en permettant d’accéder à ses éléments. GDIterator « encapsule » les positions des éléments de la liste. 4/20/2019 IFT1020

12 Vue conceptuelle de GDIterator
next next next next GDIterator 4/20/2019 IFT1020

13 Iterator… La méthode iterator de la classe ArrayList retourne un object de la classe GDIterator. ArrayList liste = . . . Iterator iterateur = liste.iterator(); 4/20/2019 IFT1020

14 Iterator… La méthode next déplace l’itérateur vers la droite
iterateur.next(); next jète (throws) une NoSuchElementException si l’itérateur est à la fin de la liste (car il n’y a plus d’élément suivant) 4/20/2019 IFT1020

15 Iterator… hasNext retourne true s’il existe un élément suivant
if(iterateur.hasNext()) iterateur.next(); 4/20/2019 IFT1020

16 Iterator… La méthode next retourne l’objet parcouru de manière à effectuer un traitement sur cet objet while iterateur.hasNext() { Object obj = iterateur.next(); //faire quelque chose avec l’objet } 4/20/2019 IFT1020

17 Allons voir le code de TestArrayList.java…
4/20/2019 IFT1020

18 On peut implanter equals avec deux itérateurs…
4/20/2019 IFT1020

19 Listes chaînées La liste chaînée est une implantation alternative au tableau pour des listes. Une liste chaînée est composée d’un certain nombre de nœuds (nodes), ou liens (links), dont chacun possède une référence sur le noeud suivant. Ajouter et retirer un noeud au milieu d’une liste chaînée est efficace, O(1), comparativement à une implantation avec tableau, O(n). Visiter les noeuds d’une liste chaînée séquentiellement est efficace. Par contre, l’accès aléatoire à un noeud quelconque n’est pas efficace, O(n). 4/20/2019 IFT1020

20 Vue abstraite d’une liste chaînée
4/20/2019 IFT1020

21 Vue concrète d’une liste chaînée
LinkedList SLLNode SLLNode SLLNode Object Object Object 4/20/2019 IFT1020

22 Allons voir le code de SLLNode.java…
4/20/2019 IFT1020

23 SLLNode SLLNode Object element SLLNode successeur 4/20/2019 IFT1020

24 Allons voir le code de LinkedList.java…
4/20/2019 IFT1020

25 LinkedList LinkedList int longueur SLLNode premier SLLNode dernier
4/20/2019 IFT1020

26 constructeur LinkedList int SLLNode null 4/20/2019 IFT1020

27 add(0, x) node(0) nouveau premier node(1)
SLLNode nouveau = new SLLNode(x, null); nouveau.successeur = premier; premier = nouveau; 4/20/2019 IFT1020

28 add(0, x) : cas premier == null
if(nouveau.successeur == null) dernier = nouveau; premier dernier nouveau SLLNode nouveau = new SLLNode(x, null); nouveau.successeur = premier; premier = nouveau; 4/20/2019 IFT1020

29 add(i, x) node(i-1) node(i) nouveau node(i+1) predecesseur
SLLNode nouveau = new SLLNode(x, null); SLLNode predecesseur = noeud(i-1); nouveau.successeur = predecesseur.successeur; predecesseur.successeur = nouveau; 4/20/2019 IFT1020

30 add(i, x) : cas du dernier
if(nouveau.successeur == null) dernier = nouveau; node(i-1) predecesseur dernier dernier nouveau SLLNode nouveau = new SLLNode(x, null); SLLNode predecesseur = noeud(i-1); nouveau.successeur = predecesseur.successeur; predecesseur.successeur = nouveau; 4/20/2019 IFT1020

31 add(x) dernier nouveau dernier = nouveau; dernier
SLLNode nouveau = new SLLNode(x, null); dernier.successeur = nouveau; 4/20/2019 IFT1020

32 add(x) : cas premier == null
dernier = nouveau; premier dernier nouveau SLLNode nouveau = new SLLNode(x, null); premier = nouveau; 4/20/2019 IFT1020

33 remove(0) vieilElement premier node(0) node(0) node(1)
vieilElement = premier.element; premier = premier.successeur; return vieilElement; 4/20/2019 IFT1020

34 remove(0) : cas premier == dernier
node(0) dernier vieilElement vieilElement = premier.element; dernier = null; premier = premier.successeur; return vieilElement; 4/20/2019 IFT1020

35 remove(i) vieilElement node(i-1) predecesseur vieux node(i) node(i+1)
SLLNode predecesseur = noeud(i-1); SLLNode vieux = predecesseur.successeur; vieilElement = vieux.element; predecesseur.successeur = vieux.successeur; return vieilElement; 4/20/2019 IFT1020

36 remove(i) : cas vieux == dernier
node(i-1) predecesseur vieux node(i) dernier vieilElement SLLNode predecesseur = noeud(i-1); SLLNode vieux = predecesseur.successeur; vieilElement = vieux.element; predecesseur.successeur = vieux.successeur; dernier = predecesseur; return vieilElement; 4/20/2019 IFT1020

37 constructeur de l’itérateur
prochain premier courant prochain = premier; precedent courant = precedent = null; 4/20/2019 IFT1020

38 next de l’itérateur : premier appel
prochain premier elementSuivant Object elementSuivant = prochain.element; precedent = courant; courant courant = prochain; precedent prochain = prochain.successeur; 4/20/2019 IFT1020

39 next de l’itérateur : deuxième appel
prochain courant premier elementSuivant precedent courant Object elementSuivant = prochain.element; precedent = courant; courant = prochain; precedent prochain = prochain.successeur; 4/20/2019 IFT1020

40 next de l’itérateur : appels subséquents
courant precedent courant prochain precedent Object elementSuivant = prochain.element; precedent = courant; courant = prochain; prochain = prochain.successeur; 4/20/2019 IFT1020

41 remove de l’itérateur : precedent == null
prochain premier courant premier = premier.successeur; courant = precedent; precedent 4/20/2019 IFT1020

42 remove de l’itérateur courant prochain precedent
precedent.successeur = courant.successeur; courant = precedent; 4/20/2019 IFT1020

43 Retirer des éléments d’une liste
Cette boucle retire tous les objets qui satisfont une condition while(iterator.hasNext()) { Object obj = iterator.next(); if(obj rempli condition) iterator.remove(); } 4/20/2019 IFT1020

44 Allons voir le code de TestLinkedList.java…
4/20/2019 IFT1020

45 Vue abstraite d’une liste doublement chaînée
4/20/2019 IFT1020

46 Allons voir le code de DLLNode.java…
4/20/2019 IFT1020

47 add(i, x) // dans une liste doublement chaînée
node(i-1) predecesseur node(i) node(i+1) nouveau DLLNode nouveau = new DLLNode(x, null, null); DLLNode predecesseur = noeud(i-1); nouveau.successeur = predecesseur.successeur; nouveau.predecesseur = predecesseur; predecesseur.successeur.predecesseur = nouveau; predecesseur.successeur = nouveau; 4/20/2019 IFT1020

48 ADT Stack Insertion et suppression d’éléments à une seule extrémité de la liste Appelé traditionnellement le top (dessus) de la pile Les nouveaux éléments sont ajoutés sur le top de la pile (push) et les éléments sont retirés du top de la pile (pop) La pile est une structure LIFO : last in, first out Pensez à une pile d’assiettes ou de livres 4/20/2019 IFT1020

49 Allons voir le code de Stack.java et testStack.java…
4/20/2019 IFT1020

50 Applications pour des piles
Récursivité. Vérification du balancement de parenthèses ou d’accolades dans les programmes. Évaluation d’expressions arithmétiques. Vérification de palindromes. 4/20/2019 IFT1020

51 Allons voir le code de Accolades.java…
4/20/2019 IFT1020

52 ADT Queue (File) Les éléments sont ajoutés à la queue (tail) de la liste Les éléments sont retirés à la tête (head) de la liste Appelée FIFO, first in, first out Pensez à une file d’attente 4/20/2019 IFT1020

53 Allons voir le code de Queue.java et TestQueue.java…
4/20/2019 IFT1020


Télécharger ppt "LISTES."

Présentations similaires


Annonces Google