•Files de priorité •Représentation par tas •Tri par tas ... · Celui-ci permet à...

59
Amphi 7 1 Plan Files de priorité Représentation par tas Tri par tas Codes préfixes Codage de Huffman Codage de Huffman adaptatif

Transcript of •Files de priorité •Représentation par tas •Tri par tas ... · Celui-ci permet à...

Amphi 7 1

Plan

• Files de priorité• Représentation par tas• Tri par tas• Codes préfixes• Codage de Huffman• Codage de Huffman adaptatif

Amphi 7 2

Files de priorité

Une file de priorité est un type abstrait de donnéesopérant sur un ensemble ordonné, et muni desopérations suivantes :

• trouver le maximum,• insérer un élément,• retirer le maximum.

En inversant l'ordre, on obtient un type abstraitpermettant de trouver le minimum et de le retirer.

Amphi 7 3

Files de priorité

Exemples d'utilisation :• Ordonnancement des tâches d'un système

d'exploitation.• Application boursière (d'après Rolf Ingold)• Contrôle aérien• etc.

Amphi 7 4

Trouvé sur le Web ...

Perle donne l’avantage aux applications critiques en implantant lagestion des niveaux de priorité sur sa gamme de routeurs.

Afin d’améliorer les performances des réseaux en fonction des applications,Perle Systems a implanté dans ses routeurs un nouveau mode de gestiondes files d’attente. Celui-ci permet à l’administrateur réseau de définirquatre niveaux de priorité (haute, normale, moyenne ou basse) pour uneinterface ou un protocole donnés. Tous les paquets qui entrent dans lerouteur sont affectés à une file d’attente en fonction d’un degré d’urgencedéfini au préalable. Les paquets affectés à la file ayant une priorité hautesont transmis les premiers. Lorsque cette file est vide, c’est le tour despaquets affectés à la file ayant la priorité immédiatement inférieure. Cesystème permet de ne pas retarder la transmission des données prioritaireslorsque le réseau est encombré.

Amphi 7 5

Trouvé aussi sur le Web: application boursière

• Une commande comprend trois champs (action, prix,quantité), où action est un achat ou une vente, prix est leprix proposé et quantité est le nombre d’actions.• Une cote donne l’offre la plus haute et la demande laplus basse.• Lorsqu'une transaction survient, on effectue une sériede suppressions dans la liste des commandes.• Les commandes peuvent être annulées à tout moment.

Amphi 7 6

Structure de données pour le marché boursier

Une structure pour les offres, une pour les demandes.Opérations supportées :

supprimer(demande)supprimer(offre)AnnulerretirerMax()retirerMin()Transaction

max()min()Coteinsere(prix, quantité)insere(prix, quantité)Commande

DemandesOffresActions

Source: Cours du Prof. Rolf Ingold de l'université de Fribourg

Amphi 7 7

Implantation des files de priorité

Implantation Trouver Insérer Retirer max max

Tableau non ordonné O(n) O(1) O(n)Liste non ordonnée O(n) O(1) O(1)*Tableau ordonné O(1) O(n) O(1)Liste ordonnée O(1) O(n) O(1)Tas O(1) O(log n) O(log n)

* après avoir trouvé

Amphi 7 8

Plan

• Files de priorité• Représentation par tas• Tri par tas• Codes préfixes• Codage de Huffman• Codage de Huffman adaptatif

Amphi 7 9

Arbre binaire tassé

0 1

0

0

0

0

1

1

1

Un arbre binaire estdit tassé si son codeest un segment initialpour l'ordre des motscroisés.

Code : {ε, 0, 1, 00, 01,10, 11, 000, 001, 010}

La hauteur d'un arbre tassé à nnoeuds est log2 n.

Amphi 7 10

Structure de tas (heap en anglais)

Un tas est un arbre binaire tassé tel que le contenu dechaque nœud soit supérieur ou égal à celui de ses fils.

4 8

612

715

23

5 1

2

Amphi 7 11

Représentation par tableau

4 8

612

715

23

5 1

2

0

1 2

3 4 5 6

7 8 9

Numéro d'un nœud (en largeur) = indice du tableau

23 15 7 12 5 6 1 4 8 2 11 30 1 2 3 4 5 6 7 8 9 10 11

Racine : nœud 0Pour un nœud i,Parent : (i-1)/2Fils gauche : 2i+1Fils droit : 2i+2

Amphi 7 12

Les tas en Java

23 15 7 12 5 6 1 4 8 2 11 30 1 2 3 4 5 6 7 8 9 10 11

class Tas{int[] a;int nTas;Tas(int n) {...}int maximum() {...}void ajouter(int v) {...}void supprimer() {...}

}

Amphi 7 13

Constructeur

Le constructeur crée un tableau

class Tas{int[] a;int nTas;Tas(int n){nTas = 0;a = new int[n];

}...

}

Amphi 7 14

Maximum

Le maximum est le contenu de la racine.

class Tas {...int maximum(){return a[0];

}}

Complexité : O(1).

23 15 7 12 5 6 1 4 8 2 11 30 1 2 3 4 5 6 7 8 9 10 11

Amphi 7 15

Insertion

23 15 7 12 5 6 1 4 8 2 210 1 2 3 4 5 6 7 8 9 10 11

• Placer le nouveaunœud dans la premièreposition libre (10)• Permuter avec leparent jusqu'àl'obtention d'un tas

4 8

612

715

23

5 1

2

0

1 2

3 4 5 6

7 8 92110 Complexité : 0(log n)

Amphi 7 16

Après insertion de 21

4 8

612

721

23

15 1

2

0

1 2

3 4 5 6

7 8 9

23 21 7 12 15 6 1 4 8 2 50 1 2 3 4 5 6 7 8 9 10 115

10

Amphi 7 17

Insertion en Java

void ajouter(int v){int i = nTas;++nTas;while (i > 0 && a[(i-1)/2] <= v){a[i] = a[(i-1)/2];i = (i-1)/2;

}a[i] = v;

}

Amphi 7 18

Retirer le maximum

2 4

98

1115

16

14 3

7

0

1 2

3 4 5 6

7 8 9

• Donner à la racine lavaleur du dernier nœud.• Supprimer le derniernœud.• Echanger avec le plusgrand fils jusqu'àl'obtention d'un tas.

16 15 11 8 14 9 3 2 4 7 10 30 1 2 3 4 5 6 7 8 9 10 11

1010 Complexité : O(log n)

Amphi 7 19

Retirer le maximum

2 4

98

1115

10

14 3

7

0

1 2

3 4 5 6

7 8 9

Amphi 7 20

En Javavoid supprimer() {int v = a[0] = a[--nTas];int i = 0;while (2*i + 1 < nTas) {int j = 2*i + 1;if (j + 1 < nTas && a[j+1] > a[j])++j;

if (v >= a[j]) break;a[i] = a[j];i = j;

}a[i] = v;

}

Amphi 7 21

Plan

• Files de priorité• Représentation par tas• Tri par tas• Codes préfixes• Codage de Huffman• Codage de Huffman adaptatif

Amphi 7 22

Tri par tas (heapsort)

On part d'un tableau vide a. On commence parconstruire un tas en ajoutant successivement autas vide les éléments a[0], a[1], ...

On répète ensuite les opérations suivantes :- prendre le maximum,- le retirer du tas,- le mettre à droite du tas

Complexité : O(n log n)

Amphi 7 23

Trier (9, 2, 11, 7, 4, 14, 3, 16, 8, 10, 15)

9

2

9

92

11

2

97

11

42

97

11

942

117

14

...

On ajoute un à un les éléments:

Amphi 7 24

Trier (5, 2, 11, 7, 4, 14, 3, 16, 8, 10, 15)

2 4

98

1115

16

14 3

7

0

1 2

3 4 5 6

7 8 9

16 15 11 8 14 9 3 2 4 7 100 1 2 3 4 5 6 7 8 9 10

1010

Une fois le tas obtenu...

Amphi 7 25

Trier (5, 2, 11, 7, 4, 14, 3, 16, 8, 10, 15)

2 4

98

1114

15

10 3

7

0

1 2

3 4 5 6

7 8 9

15 14 11 8 10 9 3 2 4 7 160 1 2 3 4 5 6 7 8 9 10

On retire les éléments un à un.

Amphi 7 26

Trier (5, 2, 11, 7, 4, 14, 3, 16, 8, 10, 15)

2 4

98

1110

14

7 3

0

1 2

3 4 5 6

7 8

14 10 11 8 7 9 3 2 4 15 160 1 2 3 4 5 6 7 8 9 10

On retire les éléments un à un.

Amphi 7 27

Trier (5, 2, 11, 7, 4, 14, 3, 16, 8, 10, 15)

2

48

910

11

7 3

0

1 2

3 4 5 6

7

11 10 9 8 7 4 3 2 14 15 160 1 2 3 4 5 6 7 8 9 10

On retire les éléments un à un.

...

Amphi 7 28

Tri par tas (heapsort) en Java

static int[] triParTas(int[] a){int n = a.length;Tas t = new Tas(n);for (int i = 0; i < n; i++)t.ajouter(a[i]);

for (int i = n-1; i >= 0; --i){int v = t.maximum();t.supprimer();a[i] = v;

}return a;

}

Amphi 7 29

Plan

• Files de priorité• Représentation par tas• Tri par tas• Codes préfixes• Codage de Huffman• Codage de Huffman adaptatif

Amphi 7 30

Codes préfixes

Un ensemble P de mots non vides est un code préfixesi aucun mot de P n'est préfixe propre d'un autre motde P.Exemple : P = {0, 100, 101, 111, 1100, 1101}Un mot admet au plus une décomposition commeproduit de mots de P. La décomposition, si elle existe,s'obtient en lisant le mot de gauche à droite.101010110111010110001010101001010100

Amphi 7 31

Codes préfixes

Un ensemble fini de motsest un code préfixe si etseulement si c'est le codedes feuilles d'un arbrebinaire.

0 1

0

0

0

0

1

1

1

Code des feuilles :{00, 010, 101, 110}

Amphi 7 32

Codes préfixes

Un code préfixe P est complet si tout mot estpréfixe d'un produit de mots de P.Le code préfixe {0, 100, 101, 111, 1100, 1101}est complet :1001010101011110110011011100101110On peut compléter ce mot par 1.

Amphi 7 33

Codes préfixes complets

Un arbre binaire est ditcomplet si ses nœudsinternes sont d'arité 2.

0 1

0

0

0 1

1

1

Code des feuilles :{00, 010, 011, 10, 11}

Un arbre binaire estcomplet ssi le code deses feuilles est un codepréfixe complet.

Amphi 7 34

Codage par code préfixe

Codage :a --> 00 d --> 10b --> 010 r --> 11c --> 011

b c

da r

0 1

0

0

0 1

1

1

abracadabra <-->0001011000110010000101100

Décodage : unique parlecture de gauche àdroite.

Amphi 7 35

Plan

• Files de priorité• Représentation par tas• Tri par tas• Codes préfixes• Codage de Huffman• Codage de Huffman adaptatif

Amphi 7 36

Compression de Huffman

Problème. Coder un texte à l'aide d'un code préfixe enminimisant la taille du texte codé.Exemples avec abracadabra(1) a : 00, b : 010, c : 011, d : 10, r : 11.0001011000110010000101100 --> 25(2) a : 1, b : 000, c : 0010, d : 0011, r : 0110000110010100111000011 --> 23Remarque. La taille ne dépend que de la fréquenced'apparition de chaque lettre. 5 a, 2 b, 1 c, 1 d, 2 r

Amphi 7 37

Construction de l'arbre de Huffman (1)

Initialisation. Pour chaque lettre, un arbre réduit à saracine. Sa valeur est la fréquence de la lettre.

Itération. On fusionne les deuxarbres de valeur minimale. Lanouvelle racine a pour valeur lasomme des valeurs des racinesdes deux arbres.

5 2 1 1 3a b c d e

1 1c d

2

Amphi 7 38

Construction de l'arbre de Huffman (2)

5 2 3a b e

1 1c d

2

(1)

5 3a

2b

e

1 1c d

2

4

(2)5

3a

2b

e

1 1c d

2

4

7

(3)

c d

5

3a

2b

e

1 1

2

4

7

12

(4)

Codagea = 0b = 100c = 1010d = 1011e = 11

Amphi 7 39

Utilisation de l'algorithme de Huffman.

• Le codage de Huffman donne un code préfixeoptimal. (admis)

• Utilisé dans le fax et dans JPEG (compressiond'images)

• On peut coder par groupes de 2 lettres ou plus(bitmaps).

• Il y a des techniques de compression sans perte dedonnées nettement plus efficaces (codagearithmétique, Ziv-Lempel, etc.)

Amphi 7 40

Choix de la représentation de données.

• Si la taille de l'alphabet est N, l' arbre de Huffman estde taille 2N-1. On le représente ici par un tableau, où(le père de la racine est 0)

j si i est fils droit de jpere[i] =

-j si i est fils gauche de jLa création de l'arbre est contrôlée par un tas-min,dont les clés sont les fréquences des lettres.

• Note : on pourrait aussi utiliser deux files.

Amphi 7 41

Huffman en Java (1)class Huffman { // Arbre à 2N - 1 nœudsfinal static int N = 26, M = 2*N - 1;static int[] pere = new int[M];static int[] freq = new int[M];

public static void main(String[] args) {String s = args[0] ;calculFrequences(s);creerArbre();String[] tas = faireTable();afficherCode(s, table);

}}

Amphi 7 42

Calcul des fréquencesstatic void calculFrequences(String s){for (int i = 0; i < s.length(); i++)freq[s.charAt(i) - 'a']++;

}

static int nombreLettres(){int n = 0;for (int i = 0; i < N; i++)if (freq[i] > 0)n++;

return n;}

Amphi 7 43

Un tas-min avec clés

• Un tas-min est un tas pour l'ordre > . Autrementdit, le minimum est à la racine et le contenu dechaque nœud est inférieur au contenu de son filsgauche et de son fils droit.

• Un tas avec clés gère des données avec priorités :– les données sont dans le tableau (ici tas)– les priorités sont dans un deuxième tableau (icifreq)

Amphi 7 44

Un tas-min avec clés en Javaclass Tas{int[] tas; // contient les caractèresint nTas = 0;int[] freq; // fréquences des caractères

Tas(int taille, int[] freq){this.freq = freq;nTas = 0;tas = new int[taille];

}...

}

Amphi 7 45

Ajouter à un tas-min (avec clé)

void ajouter(int v){int i = nTas;++nTas;while (i > 0 &&

freq[tas[(i-1)/2]] >= freq[v]){tas[i] = tas[(i-1)/2];i = (i-1)/2;

}tas[i] = v;

}

Amphi 7 46

void supprimer() {int v = tas[0] = tas[--nTas];int i = 0;while (2*i + 1 < nTas) {int j = 2*i + 1;if (j + 1 < nTas &&

freq[tas[j+1]] < freq[tas[j]])++j;

if (freq[v] <= freq[tas[j]]) break;tas[i] = tas[j];i = j;

}tas[i] = v;

}

Supprimer dans un tas-min (avec clé)

Amphi 7 47

int minimum(){return tas[0];

}

Minimum

Amphi 7 48

static void creeArbre(){int n = nombreLettres();Tas tas = new Tas(2*n - 1, freq);for (int i = 0; i < N; ++i)if (freq[i] > 0)tas.ajouter(i);

int n = tas.nTas;// A suivre ...

}

Création de l'arbre

Amphi 7 49

static void creeArbre() { // ...for (int i = N; i < N+n-1; ++i){int x = tas.minimum();tas.supprimer();int y = tas.minimum();tas.supprimer();freq[i] = freq[x] + freq[y];pere[x] = -i;pere[y] = i;tas.ajouter(i);

}}

Création de l'arbre (2)

Amphi 7 50

static String code(int i){if (pere[i] == 0)return "";

return code(Math.abs(pere[i])) +((pere[i] < 0) ? 0 : 1);

}

Codage

Amphi 7 51

Transmission du code. Première solution

a : 0b : 1010c : 100d : 1011e : 11

a

e

c

b d

On code le parcours préfixe :nœud interne 0, feuille 101[a]001[c]01[b]1[d]1[e]où [x] est le code ASCII de x.

Amphi 7 52

Transmission du code. Deuxième solution

7

6

2

12

3

5

11

18a : 1b : 0101c : 011d : 0100e : 00

On calcule, puis on transmet des fréquences fictivesdonnant le même code de Huffman ! Ici 7, 1, 2, 2, 6,codées sur un petit nombre de bits.

43

41

14

1213

a

ce

bd

25

39

80

123

a

c

e

bd

Amphi 7 53

Plan

• Files de priorité• Représentation par tas• Tri par tas• Codes préfixes• Codage de Huffman• Codage de Huffman adaptatif

Amphi 7 54

L'algorithme de Huffman adaptatif.

Inconvénients de l'algorithme de Huffman.• Il faut lire le texte entièrement avant de lancer la

compression.• Il faut transmettre le code trouvé.La version adaptative corrige ces défauts. Principe :• On envoie le code d'un caractère c.• La fréquence de c est incrémentée. On met à jour

l'arbre de Huffman (voir plus loin).• Le décodage mime le codage (même mise à jour).

Amphi 7 55

Mise à jour de l'arbre.

On maintient une liste de parcours des nœuds- compatible avec l'ordre des clés- dans lequel deux frères sont toujours consécutifs.

11

11a

5c e

3 2b d

5

10

21

32

6 5f

12

34 56

7 8

9 10

11On démontre que, dansun arbre de Huffman, onpeut toujours trouver unordre de parcourspossédant cespropriétés.

Amphi 7 56

Mise à jour après incrémentation.

Deux types d'opérations• Partant de la feuille dont la clé est incrémentée, on

remonte vers la racine en incrémentant les clés desnœuds rencontrés.

• Avant l'incrémentation, chaque nœud est permutéavec le dernier nœud de même clé dans l'ordre deparcours.

Amphi 7 57

Mise à jour après incrémentation.

11

11a

5c e

3 3b d

5

10

21

32

6 5f

12

43 56

7 8

9 10

11

11

11a

6c e

3 3b d

5

10

21

32

65f

12

43 56

7 8

9 10

11

Après incrément du nœud 1,avant incrément de son père.

Après incrément du nœud 5,avant incrément de son père.

Amphi 7 58

Mise à jour après incrémentation.

11

12

a6

c

e3 3b d

5

10

21

33

6

5f

12 43

56 7

9

8

10

11

Après incrément des nœuds 1, 5, 9, 11.Le nouvel ordre de parcours vérifie bienles deux propriétés.

Amphi 7 59

Algorithme de Huffman. Statistiques

Contes de Grimm Données techniquesBitsHuffman+ CodeTotalH. AdaptatifCodage par digrammesHuffman+ CodeTotalH. Adaptatif

700 000439 613

522440 135440 164

383 26410 880

394 144393 969

700 000518 361

954519 315519 561

442 56431 488

474 052472 534