Title: LISTES
1LISTES
2OBJECTIFS
- Apprendre à utiliser les listes fournies dans la
librairie standard de Java (interface List) - Apprendre à utiliser les itérateurs pour
parcourir des listes - Comprendre limplantation des listes chaînées
- Faire la différence entre types de données
abstraits et concrets - Connaître lefficacité des opérations
fondamentales des listes et des tableaux - Se familiariser avec les types pile et queue
3CODES
- List.java (interface)
- ArrayList.java
- LinkedList.java
- SLLNode.java
- DLLNode.java
- Stack.java
- Queue.java
- Ainsi que plusieurs tests
4Types 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
dinterface) - Le type abstrait de données ne spécifie par
limplantation.
5ADT
- Liste abstraite
- Une séquence ordonnée déléments pouvant être
parcourue dans lordre, permettant linsertion et
le retrait déléments à nimporte 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.
6Vue abstraite dune liste implantée avec un
tableau
Premier élément
Dernier élément
7Vue concrète dune liste implantée avec un tableau
8Allons voir le code de List.java et de
ArrayList.java
9Efficacité 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)
10Coû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 linfini, 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).
11Iterator
- 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 daccéder à ses éléments. - GDIterator encapsule les positions des
éléments de la liste.
12Vue conceptuelle de GDIterator
next
next
next
next
13Iterator
- La méthode iterator de la classe ArrayList
retourne un object de la classe GDIterator. - ArrayList liste . . .
- Iterator iterateur liste.iterator()
14Iterator
- La méthode next déplace litérateur vers la
droite - iterateur.next()
- next jète (throws) une NoSuchElementException si
litérateur est à la fin de la liste (car il ny
a plus délément suivant)
15Iterator
- hasNext retourne true sil existe un élément
suivant - if(iterateur.hasNext())
- iterateur.next()
16Iterator
- La méthode next retourne lobjet parcouru de
manière à effectuer un traitement sur cet objet - while iterateur.hasNext()
- Object obj iterateur.next()
- //faire quelque chose avec lobjet
-
17Allons voir le code de TestArrayList.java
18On peut implanter equals avec deux itérateurs
19Listes 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 dun certain
nombre de nuds (nodes), ou liens (links), dont
chacun possède une référence sur le noeud
suivant. - Ajouter et retirer un noeud au milieu dune liste
chaînée est efficace, O(1), comparativement à une
implantation avec tableau, O(n). - Visiter les noeuds dune liste chaînée
séquentiellement est efficace. - Par contre, laccès aléatoire à un noeud
quelconque nest pas efficace, O(n).
20Vue abstraite dune liste chaînée
0 1 2 3 n-1
21Vue concrète dune liste chaînée
LinkedList
0 1 2
SLLNode
SLLNode
SLLNode
Object
Object
Object
22Allons voir le code de SLLNode.java
23SLLNode
SLLNode
Object
element
SLLNode
successeur
24Allons voir le code de LinkedList.java
25LinkedList
LinkedList
int
longueur
SLLNode
premier
SLLNode
dernier
26constructeur
27add(0, x)
premier
node(0)
node(1)
nouveau
SLLNode nouveau new SLLNode(x, null)
nouveau.successeur premier
premier nouveau
28add(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
29add(i, x)
node(i-1) predecesseur
node(i)
node(i1)
nouveau
SLLNode nouveau new SLLNode(x, null)
SLLNode predecesseur noeud(i-1)
nouveau.successeur predecesseur.successeur
predecesseur.successeur nouveau
30add(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
31add(x)
dernier nouveau
dernier
dernier
nouveau
SLLNode nouveau new SLLNode(x, null)
dernier.successeur nouveau
32add(x) cas premier null
dernier nouveau
premier
dernier
nouveau
SLLNode nouveau new SLLNode(x, null)
premier nouveau
33remove(0)
node(1)
node(0)
premier
node(0)
vieilElement
vieilElement premier.element
premier premier.successeur
return vieilElement
34remove(0) cas premier dernier
node(0)
premier
dernier
vieilElement
vieilElement premier.element
dernier null
premier premier.successeur
return vieilElement
35remove(i)
node(i-1) predecesseur
node(i1)
vieux
node(i)
vieilElement
SLLNode predecesseur noeud(i-1)
SLLNode vieux predecesseur.successeur
vieilElement vieux.element
predecesseur.successeur vieux.successeur
return vieilElement
36remove(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
37constructeur de litérateur
prochain
premier
courant
prochain premier
precedent
courant precedent null
38next de litérateur premier appel
prochain
premier
elementSuivant
Object elementSuivant prochain.element
precedent courant
courant
courant prochain
precedent
prochain prochain.successeur
39next de litérateur deuxième appel
courant
prochain
premier
elementSuivant
courant
precedent
Object elementSuivant prochain.element
precedent courant
courant prochain
precedent
prochain prochain.successeur
40next de litérateur appels subséquents
courant
precedent
prochain
courant
precedent
Object elementSuivant prochain.element
precedent courant
courant prochain
prochain prochain.successeur
41remove de litérateur precedent null
prochain
premier
courant
premier premier.successeur
courant precedent
precedent
42remove de litérateur
courant
prochain
precedent
precedent.successeur courant.successeur
courant precedent
43Retirer des éléments dune liste
- Cette boucle retire tous les objets qui satisfont
une condition - while(iterator.hasNext())
- Object obj iterator.next()
- if(obj rempli condition)
- iterator.remove()
-
44Allons voir le code de TestLinkedList.java
45Vue abstraite dune liste doublement chaînée
0 1 2 3 n-1
46Allons voir le code de DLLNode.java
47add(i, x) // dans une liste doublement chaînée
node(i-1) predecesseur
node(i)
node(i1)
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
48ADT 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 dassiettes ou de livres
49Allons voir le code de Stack.java et
testStack.java
50Applications pour des piles
- Récursivité.
- Vérification du balancement de parenthèses ou
daccolades dans les programmes. - Évaluation dexpressions arithmétiques.
- Vérification de palindromes.
51Allons voir le code de Accolades.java
52ADT 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 dattente
53Allons voir le code de Queue.java et
TestQueue.java