• Aucun résultat trouvé

Chapitre 1: Listes

N/A
N/A
Protected

Academic year: 2022

Partager "Chapitre 1: Listes"

Copied!
53
0
0

Texte intégral

(1)

Chapitre 1: Listes

Christophe Morvan

Universit´e Paris-est, Marne-la-Vall´ee

8 septembre 2015

(2)

Plan

1 Exemples

2 D´efinition – Interface

3 Impl´ementations

4 Algorithmes classiques

5 Utilisation (Exemples)

(3)

Pr´ eambule

La plupart des chapitres reprendront une structure similaire au plan indiqu´e pr´ec´edemment.

Nous utiliserons une syntaxe semblable `a celle de Java pour pr´esenter les exemples ou les signatures de fonctions. N´eanmoins, le contenu de ce cours n’est pas propre `a Java.

Les types g´en´eriques seront beaucoup utilis´es.

(4)

Exemples

Progression

1 Exemples

2 D´efinition – Interface

3 Impl´ementations

4 Algorithmes classiques

5 Utilisation (Exemples)

(5)

Exemples

Premier exemple

Types de base

Caract`eres

Entier (diff´erentes tailles)

Flottants

Autres...

La structure la plus simple pour m´emorier des collections est constitu´ee du tableau, une s´erie d’enregistrements contigusen m´emoire.

(6)

Exemples

Premier exemple

Types de base

Caract`eres

Entier (diff´erentes tailles)

Flottants

Autres...

Tableau

La structure la plus simple pour m´emorier des collections est constitu´ee du tableau, une s´erie d’enregistrements contigusen m´emoire.

(7)

Exemples

Probl` emes des tableaux

Probl`emes des tableaux

Agrandir/r´eduire

Insertion

Solution : la liste

La liste est une structure de donn´eepermettant de stocker des collection d’objets (en g´en´eral de mˆeme type).

(8)

Exemples

Probl` emes des tableaux

Probl`emes des tableaux

Agrandir/r´eduire

D´ecalage

Insertion

Solution : la liste

La liste est une structure de donn´eepermettant de stocker des collection d’objets (en g´en´eral de mˆeme type).

(9)

Exemples

Probl` emes des tableaux

Probl`emes des tableaux

Agrandir/r´eduire

D´ecalage

Insertion

La liste est une structure de donn´eepermettant de stocker des collection d’objets (en g´en´eral de mˆeme type).

(10)

Exemples

Probl` emes des tableaux

Probl`emes des tableaux

Agrandir/r´eduire

D´ecalage

Insertion

Solution : la liste

La liste est une structure de donn´eepermettant de stocker des collection d’objets (en g´en´eral de mˆeme type).

(11)

Progression

1 Exemples

2 D´efinition – Interface

3 Impl´ementations

4 Algorithmes classiques

5 Utilisation (Exemples)

(12)

efinition – Interface

D´ efinitions

Soit Tun type quelconque.

D´efinition 1 (R´ecursive)

Une liste de Test, soit laliste vide, soit compos´ee d’unetˆete de liste de type Tavec unequeue de liste, de type liste de T.

D´efinition 2 (s´equentielle)

Une liste deTest une suite d’´el´ements de typeT, ainsi qu’un pointeur vers un ´el´ement distingu´e, l’´el´ement courant.

(13)

D´ efinitions

Soit Tun type quelconque.

D´efinition 1 (R´ecursive)

Une liste de Test, soit laliste vide, soit compos´ee d’unetˆete de liste de type Tavec unequeue de liste, de type liste de T.

D´efinition 2 (s´equentielle)

Une liste deTest une suite d’´el´ements de typeT, ainsi qu’un pointeur vers un ´el´ement distingu´e, l’´el´ement courant.

(14)

efinition – Interface

Interface r´ ecursive

Interface r´ecursive –ListR<T>

static nil: la liste vide

static ListR<T> cons (T head , ListR<T> tail) : construit la liste avechead comme tˆete de liste et tail comme queue de liste.

boolean isEmpty() : fournit truelorsque la liste courante est vide

T car() : fournit comme r´esultat la tˆete de liste de la liste courante.

ListR<T> cdr (): fournit comme r´esultat la queue de liste de la liste courante.

Exemple

ListR<Integer> l 1=ListR.nil(), l 2=ListR.cons(59, l 1);

l 2 = ListR.cons(32, l 2); l 1 = l 2.cdr();

int val = 17 + l 2.car());

(15)

Interface s´ equentielle

Interface S´equentielle –ListS<T>

Constructeur classique.

boolean isEmpty() : fournit truelorsque la liste courante est vide

void add(T elem) : ajouteelem apr`es l’´el´ement courant

T current(): fournit l’´el´ement courant

boolean hasNext() / boolean hasPred() : fournit true lorsque l’´el´ement courant poss`ede un successeur/pr´ed´ecesseur

void next() / void pred() : d´eplace l’´el´ement courant sur son successeur/pr´ed´ecesseur

void remove() : supprime l’´el´ement courant, le nouvel ´el´ement courant est son pr´ed´ecesseur, `a d´efaut son successeur.

void onHead() / void onTail() : l’´el´ement courant devient la tˆete/queue de la liste.

(16)

efinition – Interface

Exemple

Exemples s´equentiels

ListeS<Integer> l 1=new ListeS<Integer>();

l 1.add(59); l 1.add(32);

l 1.pred(); l 1.remove();

System.out.println(l 1.current());

Affichage ?

32

(17)

Exemple

Exemples s´equentiels

ListeS<Integer> l 1=new ListeS<Integer>();

l 1.add(59); l 1.add(32);

l 1.pred(); l 1.remove();

System.out.println(l 1.current());

Affichage ? 32

(18)

efinition – Interface

Variantes classiques

Pile (Stack) – LIFO

Les piles des cas particuliers de listes avec des acc`es restreints. Ajoutet retrait d’´el´ementexclusivement en tˆete de liste. En g´en´eral pas de navigation dans la pile.

LIFO : Last In Fist Out

File (Queue) – FIFO

Les files sont des cas particuliers de listes avec des acc`es restreints. Les insertions sont faites en tˆete de liste et les retraits sont faits en queue de liste. En g´en´eral pas de navigation dans la file.

FIFO : First In First Out

(19)

Variantes classiques

Pile (Stack) – LIFO

Les piles des cas particuliers de listes avec des acc`es restreints. Ajoutet retrait d’´el´ementexclusivement en tˆete de liste. En g´en´eral pas de navigation dans la pile.

LIFO : Last In Fist Out File (Queue) – FIFO

Les files sont des cas particuliers de listes avec des acc`es restreints. Les insertions sont faites en tˆete de liste et les retraits sont faits en queue de liste. En g´en´eral pas de navigation dans la file.

FIFO : First In First Out

(20)

efinition – Interface

API Java : les collections

Collection

Queue

PriorityQueue Deque

ArrayDeque LinkedList

List

ArrayList Vector

Stack

Set

HashSet

LinkedHashSet

SortedSet

TreeSet Classe concr`ete

interface

(21)

efinition – Interface

Vue d’ensemble

Les collections sont rassembl´ees dans java.util

Interfaces

G´en´erale :Collection<T> ensembles d’objets avec ou sans r´ep´etitions

Sp´ecifiques :

SortedSet<T> : ensembles tri´es

Queue<T>/Dequeue<T> : files (simple/double)

Set<T>: ensembles (pas de r´ep´etitions)

Exemple

Collection<Integer> col = new ArrayList<Integer>(); List<String> li = new LinkedList<String>();

(22)

efinition – Interface

Vue d’ensemble

Les collections sont rassembl´ees dans java.util Interfaces

G´en´erale :Collection<T>ensembles d’objets avec ou sans r´ep´etitions

Sp´ecifiques :

List<T> : listes (r´ep´etitions)

SortedSet<T> : ensembles tri´es

Queue<T>/Dequeue<T> : files (simple/double)

Set<T>: ensembles (pas de r´ep´etitions)

Exemple

Collection<Integer> col = new ArrayList<Integer>(); List<String> li = new LinkedList<String>();

(23)

efinition – Interface

Vue d’ensemble

Les collections sont rassembl´ees dans java.util Interfaces

G´en´erale :Collection<T>ensembles d’objets avec ou sans r´ep´etitions Sp´ecifiques :

List<T> : listes (r´ep´etitions)

SortedSet<T> : ensembles tri´es

Queue<T>/Dequeue<T> : files (simple/double)

Set<T>: ensembles (pas de r´ep´etitions)

Collection<Integer> col = new ArrayList<Integer>(); List<String> li = new LinkedList<String>();

(24)

efinition – Interface

Vue d’ensemble

Les collections sont rassembl´ees dans java.util Interfaces

G´en´erale :Collection<T>ensembles d’objets avec ou sans r´ep´etitions Sp´ecifiques :

List<T> : listes (r´ep´etitions)

SortedSet<T> : ensembles tri´es

Queue<T>/Dequeue<T> : files (simple/double)

Set<T>: ensembles (pas de r´ep´etitions) Exemple

Collection<Integer> col = new ArrayList<Integer>();

List<String> li = new LinkedList<String>();

(25)

Collection<T>

M´ethodes

boolean add (T elem): ajoute l’´el´ementelem

boolean remove (Object o): supprime une instance de l’´el´ement ode la collection

boolean contains (Object o): v´erifie la pr´esence de o

int size(): donne la taille

boolean isEmpty() : est-elle vide ?

Iterator<T> iterator() : fournit un it´erateur sur la collection courante.

(26)

efinition – Interface

List<T>

M´ethodes

int indexOf (Object o) : position de l’´el´emento(−1 si absent)

T get (int i): fournit l’´el´ement `a la position i

T set (int i, T elem) : fournit l’´el´ement `a la position iet le remplace parelem

Exemple

List<String> li = new LinkedList<String>(); li.add("Bonjour");li.add("Bonsoir");

li.set(1,"Bye");

(27)

List<T>

M´ethodes

int indexOf (Object o) : position de l’´el´emento(−1 si absent)

T get (int i): fournit l’´el´ement `a la position i

T set (int i, T elem) : fournit l’´el´ement `a la position iet le remplace parelem

Exemple

List<String> li = new LinkedList<String>();

li.add("Bonjour");li.add("Bonsoir");

li.set(1,"Bye");

(28)

Impl´ementations

Progression

1 Exemples

2 D´efinition – Interface

3 Impl´ementations

4 Algorithmes classiques

5 Utilisation (Exemples)

(29)

Impl´ementations

Impl´ ementations

Deux grandes familles d’impl´ementations.

Id´ee : un tableau contient les ´el´ements de la liste, accompagn´e de quelques autres attributs : la taille du tableau et celle de la liste, l’indice de

l’´el´ement courant.

Point cl´e : lorsqu’on ajoute un nouvel ´el´ement dans la liste et que le tableau est satur´e, on agrandit la taille du tableau. On diminue sa taille lorsque le nombre d’´el´ements dans la liste est trop petit.

Par chaine (liste – doublement – chaˆın´ee)

Id´ee : chaque ´el´ement de la liste connaˆıt l’adresse de son successeur.

(30)

Impl´ementations

Impl´ ementations

Deux grandes familles d’impl´ementations.

Par tableau

Id´ee : untableaucontient les ´el´ements de la liste, accompagn´e de quelques autres attributs : la taille du tableau et celle de la liste, l’indice de

l’´el´ement courant.

Point cl´e : lorsqu’on ajoute un nouvel ´el´ement dans la liste et que le tableau est satur´e, on agrandit la taille du tableau. On diminue sa taille lorsque le nombre d’´el´ements dans la liste est trop petit.

Par chaine (liste – doublement – chaˆın´ee)

Id´ee : chaque ´el´ement de la liste connaˆıt l’adresse de son successeur.

(31)

Impl´ ementations

Deux grandes familles d’impl´ementations.

Par tableau

Id´ee : un tableau contient les ´el´ements de la liste, accompagn´e de quelques autres attributs : la taille du tableau et celle de la liste, l’indice de

l’´el´ement courant.

Point cl´e : lorsqu’on ajoute un nouvel ´el´ement dans la liste et que le tableau est satur´e, on agrandit la taille du tableau. On diminue sa taille lorsque le nombre d’´el´ements dans la liste est trop petit.

Par chaine (liste – doublement – chaˆın´ee)

Id´ee : chaque ´el´ement de la liste connaˆıtl’adresse de son successeur.

(32)

Impl´ementations

Sch´ ema d’impl´ ementation – 1

Un maillon

class Link<T>{

/* En g´en´eral, c’est une classe interne */

T elem;

Link<T> next;

/* Liste doublement chain´ee : deux liens par maillon next - pred */

public Link(T elem){

this.elem =elem;

next=null;

}

public Link(T elem, Link<T> next){

this.elem =elem;

this.next=next;

}

/* Accesseurs publics : getElem()/getNext()

setElem(T elem)/setNext(Link<T> next;)

*/

}

(33)

Sch´ ema d’impl´ ementation – 2

Une liste

class ListC<T>{

Link<T> head,tail,current;

int size;

public List<T>(){

head=current=tail=null; size=0;

}

public boolean isEmpty(){

return head==null;

}

public void add (T elem){ /* Apr`es current */

this.size++;

if (this.isEmpty())head=current=tail=new Link<T>(elem);

else {

current.next = new Link<T>(elem, current.next);

if (current==tail) tail=current.next;

}

/* Autres m´ethodes */ }

(34)

Algorithmes classiques

Progression

1 Exemples

2 D´efinition – Interface

3 Impl´ementations

4 Algorithmes classiques

5 Utilisation (Exemples)

(35)

Algorithmes classiques

R´ ecursivit´ e

Observation

Lorsqu’une structure peut se d´efinir de fa¸con r´ecursive, il est int´eressant de formuler les algorithmes de fa¸con r´ecursive.

Sch´ema g´en´eral algorithme (objetRec)

Cas d’arrˆet, valeur de retour sans appel r´ecursif

Cas r´ecurrent, appel r´ecursif sur la sous-stucture de objetRec

Synth`ese du r´esultat avec le r´esultat r´ecursif etl’´el´ement courant.

boolean rechRec(ListR<T> list, T elem){ if (list.isEmpty())return false; if (elem == list.car())return true; else return rechRec(list.cdr(), elem);}

/*return (!list.isEmpty())&&((elem == list.car())||

rechRec(list.cdr(), elem))*/

(36)

Algorithmes classiques

R´ ecursivit´ e

Observation

Lorsqu’une structure peut se d´efinir de fa¸con r´ecursive, il est int´eressant de formuler les algorithmes de fa¸con r´ecursive.

Sch´ema g´en´eral algorithme (objetRec)

Cas d’arrˆet, valeur de retour sans appel r´ecursif

Cas r´ecurrent, appel r´ecursif sur la sous-stucture de objetRec

Synth`ese du r´esultat avec le r´esultat r´ecursif etl’´el´ement courant.

Recherche simple

boolean rechRec(ListR<T> list, T elem){

if (list.isEmpty())return false;

if (elem == list.car())return true;

else return rechRec(list.cdr(), elem);}

/*return (!list.isEmpty())&&((elem == list.car())||

rechRec(list.cdr(), elem))*/

(37)

Algorithmes classiques

Tri ` a bulles

Tri le plus na¨ıf

Performances m´ediocres (pour un algorithme de tri)

Sch´ema

On posen ´egal `a la taille de la liste

1) Chercher l’´el´ement le plus grand de la liste parmis lesn premi`eres positions

2) D´eplacer cet ´el´ement `a la position n

3) Si n>1, reprendre l’´etape1)avec n=n−1 Complexit´e ?

n+ (n−1) +· · ·+ 2 =

(38)

Algorithmes classiques

Tri ` a bulles

Tri le plus na¨ıf

Performances m´ediocres (pour un algorithme de tri) Sch´ema

On posen ´egal `a la taille de la liste

1) Chercher l’´el´ement le plus grand de la liste parmis lesn premi`eres positions

2) D´eplacer cet ´el´ement `a la position n

3) Si n>1, reprendre l’´etape1)avec n=n−1

Complexit´e ?

n+ (n−1) +· · ·+ 2 =

(n(n+ 1)/2)−1

(39)

Algorithmes classiques

Tri ` a bulles

Tri le plus na¨ıf

Performances m´ediocres (pour un algorithme de tri) Sch´ema

On posen ´egal `a la taille de la liste

1) Chercher l’´el´ement le plus grand de la liste parmis lesn premi`eres positions

2) D´eplacer cet ´el´ement `a la position n

3) Si n>1, reprendre l’´etape1)avec n=n−1 Complexit´e ?

n+ (n−1) +· · ·+ 2 =

(40)

Algorithmes classiques

Tri ` a bulles

Tri le plus na¨ıf

Performances m´ediocres (pour un algorithme de tri) Sch´ema

On posen ´egal `a la taille de la liste

1) Chercher l’´el´ement le plus grand de la liste parmis lesn premi`eres positions

2) D´eplacer cet ´el´ement `a la position n

3) Si n>1, reprendre l’´etape1)avec n=n−1 Complexit´e ?

n+ (n−1) +· · ·+ 2 =

(n(n+ 1)/2)−1

(41)

Tri ` a bulles

Tri le plus na¨ıf

Performances m´ediocres (pour un algorithme de tri) Sch´ema

On posen ´egal `a la taille de la liste

1) Chercher l’´el´ement le plus grand de la liste parmis lesn premi`eres positions

2) D´eplacer cet ´el´ement `a la position n

3) Si n>1, reprendre l’´etape1)avec n=n−1 Complexit´e ?

n+ (n−1) +· · ·+ 2 =(n(n+ 1)/2)−1

(42)

Algorithmes classiques

Tri fusion

Forme de tri particuli`erement adapt´e aux listes.

Exemple typique de diviser pour r´egner.

Sch´ema – Tri

On posen ´egal `a la taille de la liste 1) Si n== 1 la liste est tri´ee.

2) Sinon, partager la liste en deux listes den/2 ´el´ements 3) Trier chacune des deux listes (appel r´ecursif)

4) Fusionner les deux listestri´ees Sch´ema – Fusion

1) R´ealiser un parcours simultan´e des deux listes. Ajouter en fin de liste r´esultat le plus petit des deux.

2) Lorsqu’une des deux listes est termin´ee ajouter la seconde liste `a la suite de la liste r´esultat.

(43)

Algorithmes classiques

Tri fusion

Forme de tri particuli`erement adapt´e aux listes.

Exemple typique de diviser pour r´egner.

Sch´ema – Tri

On posen ´egal `a la taille de la liste 1) Si n== 1 la liste est tri´ee.

2) Sinon, partager la liste en deux listes den/2 ´el´ements 3) Trier chacune des deux listes (appel r´ecursif)

4) Fusionner les deux listestri´ees

1) R´ealiser un parcours simultan´e des deux listes. Ajouter en fin de liste r´esultat le plus petit des deux.

2) Lorsqu’une des deux listes est termin´ee ajouter la seconde liste `a la suite de la liste r´esultat.

(44)

Algorithmes classiques

Tri fusion

Forme de tri particuli`erement adapt´e aux listes.

Exemple typique de diviser pour r´egner.

Sch´ema – Tri

On posen ´egal `a la taille de la liste 1) Si n== 1 la liste est tri´ee.

2) Sinon, partager la liste en deux listes den/2 ´el´ements 3) Trier chacune des deux listes (appel r´ecursif)

4) Fusionner les deux listestri´ees Sch´ema – Fusion

1) R´ealiser un parcours simultan´e des deux listes. Ajouter en fin de liste r´esultat le plus petit des deux.

2) Lorsqu’une des deux listes est termin´ee ajouter la seconde liste `a la suite de la liste r´esultat.

(45)

Algorithmes classiques

Complexit´ e fusion

Analyse

1) Partages de la liste

O(ln(n)) 2) Fusion

3) Au total

O(nln(n))

(46)

Algorithmes classiques

Complexit´ e fusion

Analyse

1) Partages de la liste O(ln(n))

2) Fusion

O(n)

3) Au total

O(nln(n))

(47)

Algorithmes classiques

Complexit´ e fusion

Analyse

1) Partages de la liste O(ln(n))

2) Fusion

O(n) 3) Au total

(48)

Algorithmes classiques

Complexit´ e fusion

Analyse

1) Partages de la liste O(ln(n))

2) Fusion O(n)

3) Au total

O(nln(n))

(49)

Algorithmes classiques

Complexit´ e fusion

Analyse

1) Partages de la liste O(ln(n))

2) Fusion O(n)

3) Au total

(50)

Algorithmes classiques

Complexit´ e fusion

Analyse

1) Partages de la liste O(ln(n))

2) Fusion O(n)

3) Au total O(nln(n))

(51)

Progression

1 Exemples

2 D´efinition – Interface

3 Impl´ementations

4 Algorithmes classiques

5 Utilisation (Exemples)

(52)

Utilisation (Exemples)

Quelques exemples

Liste

Liste de clients

Liste d’items s´electionn´es

Liste d’observateursdans un patron observateur

Listes descomposants dans le patron composite

...

Pile/File

Files d’attentes

Files de priorit´es

File de successeurs (parcours en largeur)

Pile de successeurs (parcours en profondeur)

(53)

Quelques exemples

Liste

Liste de clients

Liste d’items s´electionn´es

Liste d’observateursdans un patron observateur

Listes descomposants dans le patron composite

...

Pile/File

Files d’attentes

Files de priorit´es

File de successeurs (parcours en largeur)

Pile de successeurs (parcours en profondeur)

Références

Documents relatifs

Cet ´ ecart peut s’expliquer en partie par le fait que la masse du fil (qui n’a pas ´ et´ e prise en compte) n’est pas n´ egligeable par rapport ` a la masse

[r]

K d´esignant le corps des r´eels ou celui des complexes, on note M n,p (K) le K-espace vectoriel des matrices `a coefficients dans K ayant n lignes et p colonnes.. On lui donne le

Q 1.1 Ecrivez une fonction RechSeq qui, ´ etant donn´ ee une plage de cellules et un ´ el´ ement x, retourne vrai si x est pr´ esent dans la plage, et faux sinon.. On cherche `

(2) En d´ eduire la fonction supprime qui prend en arguments une liste L et un nombre n et supprime le premier ´ el´ ement de la liste ´ egal ` a n... Avec la fonction random

Le but de cet exercice est donc de rechercher s’il existe une position du point T sur le segment [EM] pour laquelle l’angle ATB est maximum et, si c’est le cas, de d´ [ eterminer

Observons que chaque classe est non vide ; que deux classes sont disjointes ou confondues ; et que la r´eunion de toutes les classes est E.. Dans cette situation, nous dirons que

[r]