Vous êtes sur la page 1sur 16

Structures de données

Introduction
Théorie et pratique de la programmation
Pascal Fua
Structures de données
Le terme structure de données (data structure) décrit à la
fois :
1. un moyen pour organiser les données en mémoire, et
2. des algorithmes pour manipuler ces données (accès,
ajout, suppression, etc.).
Exemples:
• tableaux
• listes
• ensembles
• tables associatives

2
Pourquoi étudier ce sujet ?

Il est intéressant d’étudier les structures de données car :


• leur utilisation judicieuse est à la base de tout
programme non-trivial,
• on retrouve le même genre de structures de données
dans tous les langages,
• les algorithmes permettant leur mise en œuvre sont
intéressants.

3
Choix d'une structure

Le choix du type de structure de données à utiliser dans un


cas particulier – tableau, liste, ou autre – dépend
principalement de
• l’efficacité des opérations fréquemment utilisées;
• de la facilité de les mettre en oeuvre.
Si on ne se souciait pas de l’efficacité, il serait possible
d’utiliser un seul type de structures de données, par ex. les
listes, dans tous les cas !

4
Interaction avec la généricité

Les structures de données et la généricité sont intimement


liées : lorsqu’on définit une structure de données, on veut
faire abstraction du type exact des données stockées. Pour
ce faire, on utilise naturellement la généricité.
Exemple : Le type des listes est List<E> où E représente le
type des éléments de la liste.

5
Tableaux en Java
Tableaux
Les tableaux sont la seule structure de données intégrée au
langage Java lui-même.

Point fort:
• l'accès et la modification d’un élément quelconque se fait
en O(1).

Points faibles:
• les programmes doivent gérer explicitement les indices.
• la taille est fixée définitivement au moment de la création.
• l’interaction avec la généricité n’est pas naturelle.

7
Intersection & Union
public class TestArray {
! public static void Print(Double[] A){
! ! for (int i=0;i<A.length;i++)
! ! ! System.out.print(A[i]+" ");
! ! System.out.println("\n");
! }
! public static Double[] Intersect(Double[] A1,Double[] A2){
! ! .....
! }
public static Double[] Union(Double[] A1,Double[] A2){ Output:

.....
1.0 3.0 5.0 6.0
}
public static void main (String[] args) { 2.0 3.0 4.0 5.0
! !
! ! Double A1[]={1.0,2.0,3.0,5.0}; 3.0 5.0

! ! Double A2[]={1.0,3.0,4.0,6.0};
1.0 3.0 5.0 6.0 2.0 4.0
! ! Double A3[];
! !
! ! Print(A1);
! ! Print(A2);
! ! A3=Intersect(A1,A2);
! ! Print(A3);
! ! A3=Union(A1,A2);
! ! Print(A3);
! }
8
}
Intersection
public static Boolean Member(Double x,Double[] A){
! ! for(int i=0;i<A.length;i++){
! ! ! if(x.equals(A[i]))
! ! ! ! return(true);
! ! }
! ! return(false);
! }

public static Double[] Intersect(Double[] A1,Double[] A2){


! ! int i,n=0;
! ! Double[] Aux=new Double[A1.length];
! ! for(i=0;i<A1.length;i++){
! ! ! Double x=A1[i];
! ! ! if(Member(x,A2)){
! ! ! ! Aux[n]=x;
! ! ! ! n++;
! ! ! }
! ! }! ! !
! ! Double A3[]=new Double[n];
! ! for(i=0;i<n;i++)
! ! ! A3[i]=Aux[i];
! ! return(A3);
! }
9
Union
public static Double[] Union(Double[] A1,Double[] A2){
! ! int i,n=0;
! ! Double[] Aux=new Double[A1.length];
! ! for(i=0;i<A1.length;i++){
! ! ! Double x=A1[i];
! ! ! if(!Member(x,A2)){
! ! ! ! Aux[n]=x;
! ! ! ! n++;
! ! ! }
! ! }! ! !
! ! Double A3[]=new Double[n+A2.length];
! ! for(i=0;i<n;i++)
! ! ! A3[i]=Aux[i];
! ! for(i=0;i<A2.length;i++)
! ! ! A3[i+n]=A2[i];
! ! return(A3);
! }

10
Intersection & Union

Utiliser des tableaux standards conduit à écrire un code

•relativement compliqué pour une opération très simple,


•qui n’est pas d’une lecture particulièrement facile.

--> L’utilisation de structures appropriées va nous permettre


d’y remédier.

11
Structures de données
dans l'API Java
Le Java collections framework

Toutes les structures de données que nous allons examiner


existent dans la bibliothèque standard Java, regroupées
dans le paquetage java.util. Elles constituent ce qu'on
appelle le «!collections framework!».
La plupart des langages modernes fournissent le même
genre de structures de données dans leur bibliothèque
standard.
Après avoir examiné la mise en œuvre d’une structure de
données, nous étudierons toujours rapidement la version
disponible dans la bibliothèque Java.

13
Organisation de java.util
Le paquetage java.util définit trois familles de
structures de données : les listes, les ensembles, et les
tables associatives.
A chaque genre de structure de données correspond une
interface. Chaque interface est implémentée par une ou
plusieurs classes, qui mettent en œuvre la structure de
données d’une certaine manière.
Par exemple, l'interface générique List<E> représente le
concept de liste. Les opérations déclarées dans cette
interface permettent de manipuler les éléments de la liste.
Deux classes implémentent cette interface :
• ArrayList, les éléments sont stockés dans un tableau;
• LinkedList, les éléments sont chaînés.
14
Hiérarchie de java.util
table
Collection
liste ensemble associative

List Set Map

LinkedHashSet

LinkedHashMap
LinkedList
ArrayList

TreeSet

HashSet

TreeMap

HashMap
15
Classes historiques

Pour des raisons historiques, certaines structures de


données existent à deux exemplaires.
Par exemple, les classes Vector et ArrayList
représentent la même structure de données. Vector date
de Java 1.0, ArrayList de Java 1.2.
Le même genre de situation existe avec les classes
Hashtable (ancienne version) et HashMap (nouvelle
version).
De manière générale, nous n'examinerons que les versions
récentes, en ignorant totalement les versions historiques.

16