Vous êtes sur la page 1sur 67

Structures de donnees elementaires

Algorithmique Avancée et Complexité-Structure de


données

Chapitre 3

Ecole Nationale des Sciences Appliquées de Marrakech


Université Cadi Ayyad
Benchikhi Loubna : l.benchikhi@uca.ma

November 19, 2018

Chapitre 3 Algorithmique Avancée et Compléxité


Structures de donnees elementaires

Plan I

1 Structures de donnees elementaires


Introduction
Generalites
Tableaux
Pointeurs
Structures
Liste chainee
Liste simplement chainee
Liste doublement chainee
Algorithmes de manipulation des listes chainees
Complexite : tableau VS liste
Manipulation des listes chainée en C

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Introduction

En informatique, il existe plusieurs manieres de representer la


notion mathematique d’ensemble.
Il n’existe aucune representation qui soit « meilleure » que les
autres dans l’absolu
pour un probleme donne, la meilleure representation sera celle qui
permettra de concevoir le « meilleur » algorithme, c’est-a-dire celui
le plus esthetique et de moindre complexite.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Introduction

Le principe de base d’une structure de donnees, c’est de stocker des


elements auxquels le programmeur veut pouvoir acceder plus tard.
On appelle les differentes utilisations possibles de la structure de
donnees des operations.
Par exemple, une operation courante est la lecture : recuperer un
element stocke dans la structure.
Il existe de nombreuses autres operations, comme l’insertion, qui
rajoute un nouvel element dans la structure de donnees, ou la
suppression, qui en enleve.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Introduction

Toutes les structures de donnees ne permettent pas les memes


operations, et surtout elles n’ont pas toujours le meme cout.
Par exemple, sur certaines structures, il est tres rapide d’ajouter un
element, dans d’autres c’est difficile et cela peut demander une
reorganisation complete.
Le cout des structures de donnees peut se mesurer assez finement,
mais ce qui nous interesse dans ce cours, c’est la complexite :
pour chaque structure de donnees utilisee, on essaiera d’avoir une
bonne idee de la complexite des operations que l’on effectue.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Generalites

Les structures de donnees sont une part essentielle de la


programmation.
Une structure de donnees correspond a un ensemble de deux
ou plusieurs donnees, formant ainsi un groupe ou un ensemble
que l’on peut traiter a loisir.
Cet ensemble de donnees peut-etre constitue de differentes
sortes d’elements : des entiers, reels, caracteres, comptes
bancaires etc.
On ne s’interesse pas aux elements de l’ensemble (a leur
implementation) mais aux operations que nous pouvons
realiser sur cet ensemble.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Generalites

Les operations de base definies sur cet ensemble sont comme


suit:
1 Tester si l’ensemble est vide.
2 Ajouter un element a l’ensemble.
3 Verifier si un element appartient a l’ensemble.
4 Supprimer un element de l’ensemble.
La gestion de cet ensemble doit tenir compte de deux criteres
essentiels
1 Un minimum de place memoire utilisee.
2 Un minimum d’operations i.e. reduire le temps de traitement
des operations.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Tableaux

Un tableau de taille N est une structure tres simple constituee


d’emplacements consecutifs en memoire.
Il est donc possible d’acceder a un element d’un tableau en temps
constant pourvu que l’on connaisse sa position (ou indice).
Un tableau est donc une structure tres simple et tres efficace.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Tableaux
Attention
Il n’est cependant pas possible de modifier la taille d’un tableau, ce
qui est genant pour un certain nombre d’algorithme.

Tableau statique
Les tableaux représentent une structure statique.
Le nombre d’elements qu’elle contient ne peut pas varier.
Chapitre 3 Algorithmique Avancée et Compléxité
Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Tableaux

Le temps de creation du tableau depend des langages. En general,


la fonction de creation met dans chaque case une valeur par defaut,
et son temps d’execution est alors proportionnel a la longueur du
tableau:
Donc en complexite : O(N) si N est la taille du tableau.
Cependant, il est possible dans certains langages de creer des
tableaux "non initialises" (avec des valeurs inconnues pour chaque
case) plus rapidement.
C’est une pratique qui peut etre dangereuse car on a alors parfois
des valeurs qui n’ont aucun sens dans notre tableau.
On considerera dans ce qui suit que tous les tableaux sont initialises
des leur creation, et donc que la complexité est toujours en O(N).

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Pointeurs

Définition
Une variable est un espace memoire nomme, de taille fixee.
Il est donc possible de parler de l’adresse d’une variable.
L’adresse d’une variable etant une valeur, elle a donc un type :
c’est un pointeur.
Un pointeur particulier est le pointeur NIL (NULL en C). Il
represente une adresse inaccessible et c’est donc une valeur que l’on
utilise pour dire que le pointeur n’a pas de valeur determinee

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures

Définition
Une structure est comme un tableau, constitué de la réunion d’un
ensemble de valeurs.
Mais à la différence des tableaux, ces valeurs ne sont pas
nécessairement de même type.
L’accès à une valeur de la structure ne se fait pas avec l’aide
d’indice, mais grâce à son nom.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures

Exemples
Le type structure permet de rassembler des informations sous un
type que vous aurez créé.
Par exemple vous créez le type Personne qui possède un nom, un
prénom et un âge.
Ou bien un type Point qui a une abscisse x et une ordonnée y.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures-Déclaration

Pour définir un type structure personne, composée de trois champs


: nom, prenom et age, il suffit d’écrire les instructions suivantes :
struct personne{
char nom[20];
char prenom[15];
int age ;
};
Attention
le point-virgule est nécessaire après l’accolade fermante de la
déclaration de la structure.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures-Déclaration

Personne est le nom du type créé.


Nom, prenom et age sont les champs de ce type.
Nous utilisons ensuite ce type pour déclarer des variables :
struct personne mere;
struct personne pere;

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures-Déclaration

Les champs d’une structure peuvent être :


de n’importe quel type de base
des tableaux d’éléments de type quelconque
des pointeurs
des structures.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures-Déclaration

Attention
Une structure peut comporter des champs de son type mais il faut
le déclarer au préalable de cette façon :
typedef struct personne pers ;
struct personne{
char nom[20];
char prenom[15];
int age ;
pers * pere ; };

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Structures-Déclaration

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee
Une liste chainee est :
soit la liste vide
soit une cellule a deux champs, un champ tete contenant un
element, et un champ queue contenant l’adresse d’une autre
liste.
Autrement dit, une liste est "soit vide, soit un element suivi d’une
liste".
Cette definition est amusante car elle est recursive : elle utilise le
mot "liste". La definition d’une liste utilise la definition d’une liste !
Mais, de meme que les programmes recursifs, qui ne tournent pas
en boucle a l’infini, cette definition n’est pas un cercle vicieux, et
elle est tout a fait correcte (vous le verrez a l’usage).
Chapitre 3 Algorithmique Avancée et Compléxité
Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

Il existe différents type de listes chainées :


Les listes simplement chainées
Les listes doublement chainées
Les listes circulaires
Les piles
Les files

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

Une liste chainee est une structure de donnees dans laquelle les
elements sont ranges lineairement. Chaque element est lie a son
successeur.

il n’est donc pas possible d’acceder directement a un element


quelconque de la liste.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

cette linearite est purement virtuelle. A la difference du tableau, les


elements n’ont aucune raison d’etres contigus ni ordonnes en
memoire.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

En terme de pointeurs et de structures, une liste d’entier peut se


representer grace au type suivant:

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee

La manipulation d’une liste peut donc se faire grace aux fonctions


suivantes :
initialiser la liste ;
ajouter un élément ;
supprimer un élément ;
afficher le contenu de la liste ;
supprimer la liste entière.
...

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee en C
Un élément de la liste
Pour nos exemples, nous allons créer une liste chaînée de nombres
entiers. Chaque élément de la liste aura la forme de la structure
suivante :

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee en C

Initialiser la liste
Liste ∗ initialisation()
{
Element *element = malloc(sizeof(*element));
if ( element == NULL)
exit(EXITF AILURE );
element->val = 0;
element->next = NULL;
return element;
}

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee en C

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee complexité

Cette operation se fait en un temps constant (revient a creer une


cellule), Donc sa complexite est en O(1).

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste doublement chainee

Une liste doublement chainee est similaire a une liste chainee, a


ceci s’ajoute le fait qu’il est egalement possible d’acceder a son
predecesseur.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste doublement chainee

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste doublement chainee

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Insertion

Etant donne un element x et une liste L, l’algorithme INSERTION-


LISTE insere x en tete de L.

Cet algorithme est ecrit pour les listes doublement chainees. Il


suffit d’ignorer les deux instructions concernant le champ
predecesseur pour obtenir l’algorithme equivalent pour les listes
simplement chainees.
Chapitre 3 Algorithmique Avancée et Compléxité
Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Suppression
L’algorithme SUPPRESSION-LISTE elimine un element x d’une
liste chainee L. Cet algorithme a besoin d’un pointeur sur l’element
x a supprimer. Si on ne possede que la cle de cet element, il faut
prealablement utiliser l’algorithme RECHERCHE-LISTE pour
obtenir le pointeur necessaire.

Cet algorithme est ecrit pour les listes doublement chainees.


Chapitre 3 Algorithmique Avancée et Compléxité
Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Suppression

L’algorithme equivalent pour les listes simplement chainees est plus


complique puisqu’avec les listes simplement chainees nous n’avons
pas de moyen simple de recuperer un pointeur sur l’element qui
precede celui a supprimer....

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Recherche
L’algorithme RECHERCHE-LISTE(L, k) trouve le premier element
de cle k dans la liste L par une simple recherche lineaire, et
retourne un pointeur sur cet element. Si la liste ne contient aucun
objet de cle k, l’algorithme renvoie NIL.

Cet algorithme manipule aussi bien des listes simplement que


doublement chainees.
Chapitre 3 Algorithmique Avancée et Compléxité
Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

Ajout - retrait
Liste : O(1)
Tableau : La taille d’un tableau etant fixee a l’avance, il n’est
pas possible de rajouter des elements (creer un tableau plus
grand et y copier les N elements du tableau initial : O(N))

Taille
Tableau : toujours connue O(1)
Liste : on parcourt la liste jusqu’a tomber sur la liste vide O(N)

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

Acces a un element
Tableau : toujours connue O(1).
Liste : on accede directement a la premiere cellule O(1) sinon,
il faut parcourir la liste au pire des cas jusqu’a la fin O(N)

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

Concatenation
Tableau :
Si le premier tableau est A, et le deuxieme B, et que l’on note L la
taille de A et L0 la taille de B, on cree un tableau de taille L+L0 , ou
l’on recopie tous les elements de A, puis tous les elements de B.
Cela demande L + L0 copies (et la creation de L + L0 cases) :

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

l’operation est en O(L + L0 ).

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

Concatenation
Liste :
Comme on peut facilement ajouter un element en tete de liste, on
peut aussi ajouter une suite d’elements. Il suffit donc d’ajouter tous
les elements de A en tete de la liste B. Cela revient a faire une
copie de A devant B. Cela revient a ajouter L (la taille de A)
elements en tete de B.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

la complexite sera en O(L)

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste

Filtrage
Etant donne une collection (liste ou tableau) contenant des
elements, et une fonction de choix sur ces elements, le filtrage
consiste a recuperer seulement les elements pour lesquels la
fonction de choix renvoie vrai(est verifiee).
Tableau : O(N)
Liste : O(N)

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Complexite : tableau VS liste - Synthese

la liste est une structure a laquelle il est tres facile d’ajouter ou


d’enlever des elements, alors que le tableau est tres efficace quand
le nombre d’elements ne change pas et qu’on veut l’acces arbitraire.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainee en C

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Creation d’une liste chainee vide

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Ajout en tete

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Ajout en Fin

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Ajout en Fin

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Ajout en Fin - suite

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Afficher les elements d’une liste

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Exercice

En utilisant les trois fonctions que nous avons vues jusqu’a present :
ajouterEnTete
ajouterEnFin
afficherListe
Ecrire le main permettant de remplir et afficher la liste chainee
ci-dessous. Vous ne devrez utiliser qu’une seule bouclefor.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Supprimer un element en tete

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Supprimer un element en fin de liste

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Supprimer un element en fin de liste

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Rechercher un element dans une liste

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Compter le nombre d’occurrences d’une valeur

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Compter le nombre d’elements d’une liste chainee

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Inverse d’une liste chainée

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Inverse d’une liste chainée

... ...
Chapitre 3 Algorithmique Avancée et Compléxité
Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Inverse d’une liste chainée-Algorithme

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainée triée

Nous nous intéressons maintenant aux listes chaînées dans


lesquelles les éléments respectent un ordre croissant.
Dans ce cas, les méthodes de recherche, d’insertion et de
suppression sont différentes.
L’ordre des éléments permet d’arrêter plus tôt la recherche d’un
élément qui n’existe pas dans la liste. Aussi, l’insertion ne se fait
plus en début de liste, mais à la place qui préserve l’ordre des
éléments.

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainée triée

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainée triée

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste chainée triée

Chapitre 3 Algorithmique Avancée et Compléxité


Introduction
Generalites
Tableaux
Structures de donnees elementaires
Pointeurs
Structures
Liste chainee

Liste doublement chainée triée - Exercice

Chapitre 3 Algorithmique Avancée et Compléxité

Vous aimerez peut-être aussi