Algorithmique Structures de données
Structures séquentielles : les tableaux. 5 de 87. Structure de donnée séquentielle (tableau). En anglais : array vector. Définition.
Cours de structures de données licence 2 - Université CLERMONT 2
Dans ce cours on va étudier certaines méthodes pour manipuler les données de l'informatique c'était la manière que l'on avait de programmer avec les ...
Algorithmique Structures de données : Les tableaux
Un tableau est une structure de donnée T qui permet de stocker un certain nombre d'éléments T[i] repérés par un index i. Les tableaux vérifient généralement
Structures de données et algorithmes
Transparents disponibles sur la page web du cours avant chaque cours. Pas de livre de référence par un programme écrit dans un langage informatique.
Cours Structures de données Objectifs du Cours
Cours. Structures de données. 2ème année SMI Semestre ème année SMI
Structure de Données Introduction
“ L'informatique n'est pas plus la science des ordinateurs que Dans ce cours on considérera que les structures de données sont.
Cours dAlgorithmique et structures de données 1
Chargé du cours : Dr. Abdelhamid DJEFFAL 1.1 Résolution d'un problème en informatique ... Initiation à l'algorithmique et aux structures de données.
Structures de données et méthodes formelles
Abrial The B-Book
Algorithmique Types de données abstraits
Lors du passage à la programmation : Les TDA sont implantés par des types de données (classes si programmation orientée objets) ;. Les opérations sont implantés
1 de 87
Algorithmique
Structures de données
Florent Hivert
Mél :Florent.Hivert@lri.fr
Page personnelle :http://www.lri.fr/˜hivert
2 de 87
Types de données
Retenir
Avoir choisi les bons types de données permet d"avoir un programmeplus lisible car auto documenté plus facile à maintenir souvent plus rapide, en tout cas plus facile à optimiser " I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structures more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships. " - Linus Torvalds (creator of Linux)3 de 87
Algorithmes et structures de données
La plupart des bons algorithmes fonctionnent grâce à une méthode astucieuse pour organiser les données. Nous allons étudier quatregrandes classes de structures de données :Les structures de données séquentielles (tableaux);
Les structures de données linéaires (liste chaînées);Les arbres;
Les graphes.
Structures séquentielles : les tableaux
4 de 87Structures
séquentielles : les tableauxStructures séquentielles : les tableaux
5 de 87Structure de donnée séquentielle (tableau)
En anglais : array, vector.Définition
Untableauest une structure de donnéeTqui permet de stocker un certain nombre d"élémentsT[i]repérés par un indexi. Lestableaux vérifient généralement les propriétés suivantes :tous les éléments ont le même type de base;
le nombre d"éléments stockés est fixé; l"accès et la modification de l"élément numéroiest en temps constant(1), indépendant deiet du nombre d"éléments, le tableau.Structures séquentielles : les tableaux
6 de 87Un tableau en mémoire
Définition
Dans le tableau, tous les éléments ont la même taille mémoire. Nombre d"élément :n, taille d"un élémentt:T[0]T[1]T[2]...T[n-1]On suppose que le tableau commence à l"adressedT[0]occupe les casesdàd+t1;T[1]occupe les casesd+tàd+2t1;T[i]occupe les casesd+itàd+ (i+1)t1;Le tableau entier occupe les casesdàd+nt1.
Note : indirection (pointeur) possible si taille variable (par exemple classe virtuelle).Structures séquentielles : les tableaux
6 de 87Un tableau en mémoire
Définition
Dans le tableau, tous les éléments ont la même taille mémoire. Nombre d"élément :n, taille d"un élémentt:T[0]T[1]T[2]...T[n-1]On suppose que le tableau commence à l"adressedT[0]occupe les casesdàd+t1;T[1]occupe les casesd+tàd+2t1;T[i]occupe les casesd+itàd+ (i+1)t1;Le tableau entier occupe les casesdàd+nt1.Note : indirection (pointeur) possible si taille variable (par exemple
classe virtuelle).Structures séquentielles : les tableaux
7 de 87Structure de donnée séquentielle (tableau)
On encapsule souvent le tableau dans une structure qui permet defaire varier la taille :Java : tableauint[](taille fixe),ArrayList(taille variable)C : tableauint[](taille fixe), pointeur (taille variable)C++ :std::array(taille fixe),std::vector(taille variable)Python :list(taille variable,6=liste chaînée)
Structures séquentielles : les tableaux
8 de 87Exemple : Tableau en C (bas niveau)
On suppose déclaré un typeelempour les éléments.Espace mémoire nécessaire au stockage d"un élément exprimé
en mots mémoire (octets en général) :sizeof(elem).définitionstatique:elem t[taille];définitiondynamiqueen deux temps (déclaration, allocation) :
#includeAddr(t[i]) = Addr(t[0]) +sizeof(elem)i
Structures séquentielles : les tableaux
8 de 87Exemple : Tableau en C (bas niveau)
On suppose déclaré un typeelempour les éléments.Espace mémoire nécessaire au stockage d"un élément exprimé
en mots mémoire (octets en général) :sizeof(elem).définitionstatique:elem t[taille];définitiondynamiqueen deux temps (déclaration, allocation) :
#includeAddr(t[i]) = Addr(t[0]) +sizeof(elem)i
Structures séquentielles : les tableaux
8 de 87Exemple : Tableau en C (bas niveau)
On suppose déclaré un typeelempour les éléments.Espace mémoire nécessaire au stockage d"un élément exprimé
en mots mémoire (octets en général) :sizeof(elem).définitionstatique:elem t[taille];définitiondynamiqueen deux temps (déclaration, allocation) :
#includeAddr(t[i]) = Addr(t[0]) +sizeof(elem)i
Structures séquentielles : les tableaux
9 de 87Tableau en Java
On suppose déclaré un typeelempour les éléments.définitiondynamiqueen deux temps (déclaration, allocation) :
elem[] t; t = new elem[taille];Structures séquentielles : les tableaux
10 de 87Tableau partiellement remplis
Retenir
Pour simuler un tableau de taille variable, on peutréserver une certaine quantité de mémoire appeléecapacite,et ranger les valeursau début du tableau .
Organisation des données (structure, classe) :
tableau de taillecapaciteallouééléments d"indiceipour 0iStructures séquentielles : les tableaux
11 de 87Opérations de base
Hypothèses :tableau de taillecapaciteallouééléments 0i accès au premier élément :(1)accès à l"élément numéroi:(1)accès au dernier élément :(1)insertion/suppression d"un élément au début :(taille)insert./suppr. d"un élt en positioni:(taillei)O(taille)insert./suppr. d"un élt à la fin :(1)À faire : écrire les méthodes correspondantes On veut calculer la complexité de l"ajoutExemple : enregistrement d"un signal audio venant d"un micros On veut calculer la complexité de l"ajoutExemple : enregistrement d"un signal audio venant d"un micros À lam-ième ré-allocation, la taille du tableaux :KmPour un tableau ànéléments :mest le plus petit entier tel À lam-ième ré-allocation, la taille du tableaux :KmPour un tableau ànéléments :mest le plus petit entier tel À lam-ième ré-allocation, la taille du tableaux :KmPour un tableau ànéléments :mest le plus petit entier tel sera recopié en moyenne 11 fois.Si l"on double la taille à chaque étape, chaque nombre sera en sera recopié en moyenne 11 fois.Si l"on double la taille à chaque étape, chaque nombre sera en sera recopié en moyenne 11 fois.Si l"on double la taille à chaque étape, chaque nombre sera en est possible d"aller plus vite en utilisant plus de mémoire.Exemple : on évite de faire plusieurs fois les même calculs en est possible d"aller plus vite en utilisant plus de mémoire.Exemple : on évite de faire plusieurs fois les même calculs en est possible d"aller plus vite en utilisant plus de mémoire.Exemple : on évite de faire plusieurs fois les même calculs en de réserver de la mémoire dès le début :en C++ :vector.reserve(size_type n)en Java :ArrayList.ensureCapacity(int minCapacity)en Python : liste avec des cases non initialisées[None]*n type"Test illustré par une croixp"TNULLest une valeur commune à tous les pointeurs, à ceux du type type"Test illustré par une croixp"TNULLest une valeur commune à tous les pointeurs, à ceux du typeStructures séquentielles : les tableaux
12 de 87Problème de la taille maximum
0 ...taille1 ...capacite1utilisélibre
On essaye d"insérer un élément dans un tableau oùtaille = capacite Il n"y a plus de place disponible.
0 ...taille1= capacite1u t i l i s é
Comportements possibles :Erreur (arrêt du programme, exception) Ré-allocation du tableau avec recopie, coût :(taille) Structures séquentielles : les tableaux
12 de 87Problème de la taille maximum
0 ...taille1 ...capacite1utilisélibre
On essaye d"insérer un élément dans un tableau oùtaille = capacite Il n"y a plus de place disponible.
0 ...taille1= capacite1u t i l i s é
Comportements possibles :Erreur (arrêt du programme, exception) Ré-allocation du tableau avec recopie, coût :(taille) Structures séquentielles : les tableaux
13 de 87Ré-allocation
En C :realloc
void *realloc(void *ptr, size_t size);modifie la taille du bloc de mémoire pointé par ptr pour l"amener à une taille desizeoctets.realloc()conserve le contenu de la zone mémoire minimum entre la nouvelle et l"ancienne taille. [...] Si la zone pointée était déplacée, unfree(ptr)est effectué.En Java, copy systématique : E[] newData = (E[]) new Object[...];
System.arraycopy(data, 0, newData, 0, size);
data = newData; Structures séquentielles : les tableaux
14 de 87Ré-allocation : coût
Problème
Quel est le coût des réallocations?
On se place dans le scénario suivant :Au début, le tableau ne contient rien; On ajoute, 1 par 1,néléments à la fin.
méthodeappenden Python et Java,push_backen C++ 44000 échantillons par seconde.
Structures séquentielles : les tableaux
14 de 87Ré-allocation : coût
Problème
Quel est le coût des réallocations?
On se place dans le scénario suivant :Au début, le tableau ne contient rien; On ajoute, 1 par 1,néléments à la fin.
méthodeappenden Python et Java,push_backen C++ 44000 échantillons par seconde.
Structures séquentielles : les tableaux
15 de 87Rappels suites arithmétiques et géométriques
Suite arithmétique :un+1=un+r,un=u0+nr.
u 0+u1++un= (n+1)u0+un2
= (n+1)2u0+nr2 0+r+2r+:::nr= (n+1)nr2
Suite géométrique :un+1=qun,un=u0qn.
u 0+u1++un=u01qn+11qsiq6=1
1+q+q2++qn=1qn+11q
Structures séquentielles : les tableaux
16 de 87Ré-allocation par ajout d"une case
On ajoute, 1 par 1,néléments à la fin.ÉtapeAllocationsCopiesStockage#écritures 11T[0]1
22T[0]T[1]2
33T[0:::1]T[2]3
..nnT[0:::n2]T[n1]n Bilan :
nX i=1i=n(n+1)2 écritures.
Structures séquentielles : les tableaux
16 de 87Ré-allocation par ajout d"une case
On ajoute, 1 par 1,néléments à la fin.ÉtapeAllocationsCopiesStockage#écritures 11T[0]1
22T[0]T[1]2
33T[0:::1]T[2]3
..nnT[0:::n2]T[n1]n Bilan :
nX i=1i=n(n+1)2 écritures.
Structures séquentielles : les tableaux
17 de 87Ré-allocation par ajout d"une taille fixeb
Nombre d"étapes :k=dnb
e. Hypothèse simplificatrice :nest un multiple de la taillebdes blocs :n=kb. À chaque étape, on écritbvaleurs.ÉtapeAlloc.CopiesStockage#écritures 1b0:::b1b
22b0:::b1b:::2b12b
33b0:::2b12b:::3b13b
..kkb0:::(k1)b1(k1)b:::kb1kb Bilan :
kX i=1bi=bkX i=1i=bk(k+1)2n22bécritures. Structures séquentielles : les tableaux
17 de 87Ré-allocation par ajout d"une taille fixeb
Nombre d"étapes :k=dnb
e. Hypothèse simplificatrice :nest un multiple de la taillebdes blocs :n=kb. À chaque étape, on écritbvaleurs.ÉtapeAlloc.CopiesStockage#écritures 1b0:::b1b
22b0:::b1b:::2b12b
33b0:::2b12b:::3b13b
..kkb0:::(k1)b1(k1)b:::kb1kb Bilan :
kX i=1bi=bkX i=1i=bk(k+1)2n22bécritures. Structures séquentielles : les tableaux
18 de 87Ré-allocation par ajout d"une taille fixe : Bilan
Retenir
On suppose que l"on réalloueune case supplémentaireà chaque débordement. Coût (nombre de copies d"éléments) : n X i=1i=n(n+1)2 2(n2) Si on alloue des blocs de tailleb, en notantk=dnb
ele nombre de blocs :kX i=1bin22b2(n2) La vitesse est divisée parbmais lacomplexité reste la même. Structures séquentielles : les tableaux
18 de 87Ré-allocation par ajout d"une taille fixe : Bilan
Retenir
On suppose que l"on réalloueune case supplémentaireà chaque débordement. Coût (nombre de copies d"éléments) : n X i=1i=n(n+1)2 2(n2)Si on alloue des blocs de tailleb, en notantk=dnb
ele nombre de blocs :kX i=1bin22b2(n2) La vitesse est divisée parbmais lacomplexité reste la même. Structures séquentielles : les tableaux
19 de 87Ré-allocation par doublement de taille
Bilan : Il faut allouer de plus en plus d"éléments.Question Que ce passe-t-il si l"on double la taille à chaque fois? Structures séquentielles : les tableaux
20 de 87Ré-allocation par doublement de taille
Nombre d"étapes :k=dlog2ne. Hypothèse simplificatrice :nest une puissance de 2 :n=2k.ÉtapeAlloc.CopiesStockage#écritures 0101
12012
240:::12:::34
380:::34:::78
4160:::78:::1516
..k2 k0:::2k112 k1:::2k12 kBilan : kX i=02 k=12k+112=2k+112nécritures. Structures séquentielles : les tableaux
20 de 87Ré-allocation par doublement de taille
Nombre d"étapes :k=dlog2ne. Hypothèse simplificatrice :nest une puissance de 2 :n=2k.ÉtapeAlloc.CopiesStockage#écritures 0101
12012
240:::12:::34
380:::34:::78
4160:::78:::1516
..k2 k0:::2k112 k1:::2k12 kBilan : kX i=02 k=12k+112=2k+112nécritures. Structures séquentielles : les tableaux
21 de 87Ré-allocation par doublement de taille
Retenir (Solution au problème de la ré-allocation) À chaque débordement, on ré-allouedKcapaciteeoùK>1est une constante fixée (par exempleK=2).Début : tableau à 1 élément C=n+m1X
i=1K i=n+Km1K12(n+Km) = (n) Finalement le coût est(n)(carkm1
Structures séquentielles : les tableaux
21 de 87Ré-allocation par doublement de taille
Retenir (Solution au problème de la ré-allocation) À chaque débordement, on ré-allouedKcapaciteeoùK>1est une constante fixée (par exempleK=2).Début : tableau à 1 élément C=n+m1X
i=1K i=n+Km1K12(n+Km) = (n) Finalement le coût est(n)(carkm1
Structures séquentielles : les tableaux
21 de 87Ré-allocation par doublement de taille
Retenir (Solution au problème de la ré-allocation) À chaque débordement, on ré-allouedKcapaciteeoùK>1est une constante fixée (par exempleK=2).Début : tableau à 1 élément C=n+m1X
i=1K i=n+Km1K12(n+Km) = (n) Finalement le coût est(n)(carkm1
Structures séquentielles : les tableaux
22 de 87Nombre moyen de copies
Selon la valeur deK, la constante de complexité varie de manière importante. Nombre de recopies d"éléments : C=n+m1X
i=1K i=n+Km1K1n+nK1=nKK1 Quelques valeurs :
K1:01 1:1 1:2 1:5 2 3 4 5 10K
K1101 11 6 3 2 1:5 1:33 1:25 1:11
Interprétation :Si l"on augmente la taille de 10% à chaque étape, chaque nombre Structures séquentielles : les tableaux
22 de 87Nombre moyen de copies
Selon la valeur deK, la constante de complexité varie de manière importante. Nombre de recopies d"éléments : C=n+m1X
i=1K i=n+Km1K1n+nK1=nKK1Quelques valeurs : K1:01 1:1 1:2 1:5 2 3 4 5 10K
K1101 11 6 3 2 1:5 1:33 1:25 1:11Interprétation : Si l"on augmente la taille de 10% à chaque étape, chaque nombre Structures séquentielles : les tableaux
22 de 87Nombre moyen de copies
Selon la valeur deK, la constante de complexité varie de manière importante. Nombre de recopies d"éléments : C=n+m1X
i=1K i=n+Km1K1n+nK1=nKK1Quelques valeurs : K1:01 1:1 1:2 1:5 2 3 4 5 10K
K1101 11 6 3 2 1:5 1:33 1:25 1:11Interprétation : Si l"on augmente la taille de 10% à chaque étape, chaque nombre Structures séquentielles : les tableaux
23 de 87Bilan
Retenir (Nombre de copies)
Dans un tableau de taillen, coût de l"ajout d"un élément dans le pire des cas : Coût en tempsn;Coût en espace(K1)n:
En, moyenne sur un grand nombre d"éléments ajoutés : Coût en tempsKK1;Coût en espaceK:
On dit que l"algorithme travaille entemps constant amortis (Constant Amortized Time (CAT) en anglais). Structures séquentielles : les tableaux
24 de 87Compromis Espace/Temps
QuandKaugmente, la vitesse augmente mais la place mémoire gaspillée ((K1)n) augmente aussi. Le choix de la valeur deK dépend donc du besoin de vitesse par rapport au coût de la mémoire.Retenir C"est une situation très classique : dans de nombreux problèmes, il Structures séquentielles : les tableaux
24 de 87Compromis Espace/Temps
QuandKaugmente, la vitesse augmente mais la place mémoire gaspillée ((K1)n) augmente aussi. Le choix de la valeur deK dépend donc du besoin de vitesse par rapport au coût de la mémoire.Retenir C"est une situation très classique : dans de nombreux problèmes, il Structures séquentielles : les tableaux
24 de 87Compromis Espace/Temps
QuandKaugmente, la vitesse augmente mais la place mémoire gaspillée ((K1)n) augmente aussi. Le choix de la valeur deK dépend donc du besoin de vitesse par rapport au coût de la mémoire.Retenir C"est une situation très classique : dans de nombreux problèmes, il Structures séquentielles : les tableaux
25 de 87Une petite démo en Python/Cython...
Structures séquentielles : les tableaux
26 de 87En pratique ...Python
On utilisevoid *realloc(void *ptr, size_t size);
Extrait des sources du langagePython
Fichierlistobject.c, ligne 41-91 :
/* This over-allocates proportional to the list size, making room * for additional growth. The over-allocation is mild, but is * enough to give linear-time amortized behavior over a long * sequence of appends() in the presence of a poorly-performing * system realloc(). * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); Structures séquentielles : les tableaux
27 de 87En pratique ...Java
Resize impossible sur un tableau : Copie.
Mieux : utiliserArrayListStructures séquentielles : les tableaux
28 de 87En pratique ...Oracle Java 8
Extrait des sources de Oracle java 8
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); BilannewCapacity = oldCapacity*1.5.
Structures séquentielles : les tableaux
29 de 87En pratique ...Java OpenJDK
Extrait des sources de OpenJDK 6-b27
public void [More ...] ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); BilannewCapacity = oldCapacity*1.5 + 1.
Structures séquentielles : les tableaux
30 de 87Conclusion
Retenir
Les bibliothèques standards savent gérer la réallocation d"un tableau qui grossit sans perte de complexité. Mais il y a un certain surcoût. Si l"on sait par avance quelle est la taille finale, on peut demander Variables Dynamiques et pointeurs
31 de 87Variables Dynamiques
et pointeurs Variables Dynamiques et pointeurs
32 de 87Variables dynamiques et pointeurs
Rappel : une variable usuelle est caractérisée par quatre propriétés : (nom,adresse,type,valeur)Retenir Unevariable dynamiqueest anonyme :
(adresse, type, valeur). On y accède grâce à un pointeur.
Unpointeurpquirepère(oupointe vers) une VD d"adresseaet de typeTest de type"T(lire " flècheT»);a pour valeur l"adresseade la VD. Variables Dynamiques et pointeurs
33 de 87Variables dynamiques et pointeurs
les quatre propriétés d"une variable usuellenomadressetype valeur schéma pour le pointeurpqui repère la VD d"adressea, de typeTet de valeurvpx"TaaT v le lien dynamique entre le pointeurpet la VD qu"il repère est illustré par une flèchepx"TT v Variables Dynamiques et pointeurs
33 de 87Variables dynamiques et pointeurs
les quatre propriétés d"une variable usuellenomadressetype valeur schéma pour le pointeurpqui repère la VD d"adressea, de typeTet de valeurvpx"TaaT v le lien dynamique entre le pointeurpet la VD qu"il repère est illustré par une flèchepx"TT v Variables Dynamiques et pointeurs
33 de 87Variables dynamiques et pointeurs
les quatre propriétés d"une variable usuellenomadressetype valeur schéma pour le pointeurpqui repère la VD d"adressea, de typeTet de valeurvpx"TaaT v le lien dynamique entre le pointeurpet la VD qu"il repère est illustré par une flèchepx"TT v Variables Dynamiques et pointeurs
34 de 87Les pointeurs nuls
Retenir
Un pointeurppeut valoirNULL: il ne repère aucune VD.schéma pour le pointeurpde type"Tqui ne repère aucune VDp"TNULL l"accès à aucune VD pour le pointeurpde Variables Dynamiques et pointeurs
34 de 87Les pointeurs nuls
Retenir
Un pointeurppeut valoirNULL: il ne repère aucune VD.schéma pour le pointeurpde type"Tqui ne repère aucune VDp"TNULL l"accès à aucune VD pour le pointeurpde Variables Dynamiques et pointeurs
34 de 87Les pointeurs nuls
Retenir
quotesdbs_dbs46.pdfusesText_46
[PDF] LES SUBORDONNES SVP !!
[PDF] Les substances edeine et cyclhoheximide agissent a deux phases differents d'une des etapes de la synthese de protine
[PDF] Les substitus et leurs référents!Urgent besoin d'aide!!!
[PDF] les substituts exercices
[PDF] les substituts grammaticaux 1am
[PDF] les substituts grammaticaux et lexicaux exercices français facile
[PDF] les substituts grammaticaux exercices 3am
[PDF] les substituts grammaticaux pdf
[PDF] les substituts lexicaux et grammaticaux 3am
[PDF] les substituts lexicaux et grammaticaux exercices corrigés pdf
[PDF] Les succès de L'Union Européenne
[PDF] Les Sud : Croissance Démographique et Richesses
[PDF] les suffixes et les préfixes
[PDF] les suite