LISTES - PowerPoint PPT Presentation

About This Presentation
Title:

LISTES

Description:

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 ... – PowerPoint PPT presentation

Number of Views:67
Avg rating:3.0/5.0
Slides: 54
Provided by: Facul253
Category:
Tags: listes | concrets

less

Transcript and Presenter's Notes

Title: LISTES


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 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

3
CODES
  • List.java (interface)
  • ArrayList.java
  • LinkedList.java
  • SLLNode.java
  • DLLNode.java
  • Stack.java
  • Queue.java
  • Ainsi que plusieurs tests

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
    dinterface)
  • Le type abstrait de données ne spécifie par
    limplantation.

5
ADT
  • 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.

6
Vue abstraite dune liste implantée avec un
tableau
Premier élément
Dernier élément
7
Vue concrète dune liste implantée avec un tableau
8
Allons voir le code de List.java et de
ArrayList.java
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)

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 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).

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 daccéder à ses éléments.
  • GDIterator  encapsule  les positions des
    éléments de la liste.

12
Vue conceptuelle de GDIterator
next
next
next
next

13
Iterator
  • La méthode iterator de la classe ArrayList
    retourne un object de la classe GDIterator.
  • ArrayList liste . . .
  • Iterator iterateur liste.iterator()

14
Iterator
  • 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)

15
Iterator
  • hasNext retourne true sil existe un élément
    suivant
  • if(iterateur.hasNext())
  • iterateur.next()

16
Iterator
  • 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

17
Allons voir le code de TestArrayList.java
18
On peut implanter equals avec deux itérateurs
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 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).

20
Vue abstraite dune liste chaînée
0 1 2 3 n-1
21
Vue concrète dune liste chaînée
LinkedList
0 1 2
SLLNode
SLLNode
SLLNode
Object
Object
Object
22
Allons voir le code de SLLNode.java
23
SLLNode
SLLNode
Object
element
SLLNode
successeur
24
Allons voir le code de LinkedList.java
25
LinkedList
LinkedList
int
longueur
SLLNode
premier
SLLNode
dernier
26
constructeur
27
add(0, x)
premier
node(0)
node(1)
nouveau
SLLNode nouveau new SLLNode(x, null)
nouveau.successeur premier
premier nouveau
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
29
add(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
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
31
add(x)
dernier nouveau
dernier
dernier
nouveau
SLLNode nouveau new SLLNode(x, null)
dernier.successeur nouveau
32
add(x) cas premier null
dernier nouveau
premier
dernier
nouveau
SLLNode nouveau new SLLNode(x, null)
premier nouveau
33
remove(0)
node(1)
node(0)
premier
node(0)
vieilElement
vieilElement premier.element
premier premier.successeur
return vieilElement
34
remove(0) cas premier dernier
node(0)
premier
dernier
vieilElement
vieilElement premier.element
dernier null
premier premier.successeur
return vieilElement
35
remove(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
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
37
constructeur de litérateur
prochain
premier
courant
prochain premier
precedent
courant precedent null
38
next de litérateur premier appel
prochain
premier
elementSuivant
Object elementSuivant prochain.element
precedent courant
courant
courant prochain
precedent
prochain prochain.successeur
39
next de litérateur deuxième appel
courant
prochain
premier
elementSuivant
courant
precedent
Object elementSuivant prochain.element
precedent courant
courant prochain
precedent
prochain prochain.successeur
40
next de litérateur appels subséquents
courant
precedent
prochain
courant
precedent
Object elementSuivant prochain.element
precedent courant
courant prochain
prochain prochain.successeur
41
remove de litérateur precedent null
prochain
premier
courant
premier premier.successeur
courant precedent
precedent
42
remove de litérateur
courant
prochain
precedent
precedent.successeur courant.successeur
courant precedent
43
Retirer 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()

44
Allons voir le code de TestLinkedList.java
45
Vue abstraite dune liste doublement chaînée
0 1 2 3 n-1
46
Allons voir le code de DLLNode.java
47
add(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
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 dassiettes ou de livres

49
Allons voir le code de Stack.java et
testStack.java
50
Applications 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.

51
Allons voir le code de Accolades.java
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 dattente

53
Allons voir le code de Queue.java et
TestQueue.java
Write a Comment
User Comments (0)
About PowerShow.com