3 \section{Présentation générale}
5 \subsection{Définitions}
7 \begin{Def}[Arbre, feuilles]
8 On nomme \emph{arbre}\index{arbre} un graphe non orienté connexe et acyclique (sa forme évoque en effet la ramification des branches d'un arbre). On distingue deux types de sommets dans un arbre
10 \item les \emph{feuilles}\index{feuilles} dont le degré est 1;
11 \item les \emph{n{\oe}uds internes}\index{noeuds} dont le degré est supérieur à 1.
18 \includegraphics[scale=0.7]{graphes/arbre1.eps}
25 %D'autres définitions équivalentes sont possibles. Par exemple :
28 %\item[basée sur le nombre d'arêtes : ] un arbre est un graphe connexe non orienté possédant \textit{n} $-$ 1 arêtes.
35 Un graphe sans cycles mais non connexe est appelé une \emph{forêt}\index{forêt}.
41 \includegraphics[scale=0.7]{graphes/foret.eps}
46 \subsection{Caractérisation des arbres}
48 \begin{Th}\label{prop:equiv}
49 Les affirmations suivantes sont équivalentes pour tout graphe $G = (V, E)$ à $n$ sommets.
51 \item $G$ est un arbre,
52 \item $G$ est sans cycles et connexe,
53 \item $G$ est sans cycles et comporte $n-1$ arêtes,
54 \item $G$ est connexe et comporte $n-1$ arêtes,
55 \item Chaque paire $(u, v)$ de sommets distincts est reliée par une seule chaîne simple (et le graphe est sans boucles).
60 \subsection{Nombre minimal de feuilles}
63 Tout arbre fini avec au moins deux sommets comporte au moins deux feuilles.
66 \subsection{Exercices}
68 Démontrez la propriété précédente.
71 \noindent{\underline{\textit{Indication : }}} Récurrence.
74 Combien d'arbres différents existe-t-il avec 3, 4, 5 sommets ?
77 \noindent{\underline{\textit{Indication : }}} Réfléchir sur le nombre de feuilles.
80 Un arbre $T$ a trois sommets de degré 3, quatre sommets de degré 2. Les autres sommets sont tous de degré 1 (des feuilles). Combien y a-t-il de sommets de degré 1?
83 \noindent{\underline{\textit{Réponse : }}} Soit $n$ le nombre total de sommet ; il y a donc $n-1$ arêtes, et $n-3-4 = n-7$ sommets de degré 1. Comptons le nombre d'arêtes...
84 Chaque sommet partage son arête avec un autre sommet, donc :
86 \item chaque sommet de degré trois (il y en a 3) a 1,5 arête \og à lui \fg{},
87 \item chaque sommet de degré deux (il y en a 4) a 1 arête \og à lui \fg{},
88 \item chaque sommet de degré un (il y en a $n-7$) a 0,5 arête \og à lui \fg{}
90 Ce qui fait un total d'arêtes de $3*1,5+4*1+(n-7)*0,5$. Or, comme on a affaire à un arbre à $n$ sommets, on a $n-1$ arêtes, donc $$3*1,5+4*1+(n-7)*0,5 = n-1$$
91 \noindent d'où $n=12$, et il y a 5 sommets de degré 1.
96 Supposons qu'il y ait deux chaînes élémentaires distinctes $P_1$ et
97 $P_2$ d'un sommet $s$ à un autre sommet $s'$ de $G$. $G$ est-il un
98 arbre? Justifier par une preuve.
99 %Seymour Lipschutz 6.14 p 113
102 \section{Codage de Prüfer}
105 \subsection{Présentation}
106 Le codage de Prüfer est une manière très compacte de décrire un arbre.
110 \subsubsection{La méthode}
112 Soit l'arbre $T = (V, E)$ et supposons $V = {1, 2, ..., n}$.
113 L'algorithme ci-dessous fournira le code de $T$, c'est-à-dire une suite $S$ de
114 $n-2$ termes employant (éventuellement plusieurs fois) des nombres choisis parmi
117 \begin{Th}[Pas général de l'algorithme de codage]
118 Initialement la suite $S$ est vide.
119 Ce pas général est à répéter tant qu'il reste plus de
120 deux sommets dans l'arbre courant $T$ :
122 \item identifier la feuille $v$ de l'arbre courant ayant le numéro minimum ;
123 \item ajouter à la suite $S$ le seul sommet $s$ adjacent à $v$ dans l'arbre $T$ courant ;
124 \item enlever de l'arbre $T$ courant la feuille $v$ et l'arête incidente à $v$.
128 \subsubsection{Exemple de codage}
131 \item[\'Etape 0 :] arbre à coder
134 \includegraphics[scale=0.7]{graphes/prufer1.eps}
160 \includegraphics[scale=0.7]{graphes/prufer2.eps}
181 \begin{center}S=\{4\}\end{center}
187 \includegraphics[scale=0.7]{graphes/prufer3.eps}
206 \begin{center}S=\{4,10\}\end{center}
211 \includegraphics[scale=0.7]{graphes/prufer4.eps}
228 \begin{center}S=\{4,10,3\}\end{center}
233 \includegraphics[scale=0.7]{graphes/prufer5.eps}
248 \begin{center}S = \{4,10,3,8\}\end{center}
253 \includegraphics[scale=0.7]{graphes/prufer6.eps}
267 \begin{center}S = \{4,10,3,8,4\}\end{center}
272 \includegraphics[scale=0.7]{graphes/prufer7.eps}
283 \begin{center}S = \{4,10,3,8,4,4\}\end{center}
288 \includegraphics[scale=0.7]{graphes/prufer8.eps}
297 \begin{center}S = \{4,10,3,8,4,4,5\}\end{center}
302 \includegraphics[scale=0.7]{graphes/prufer9.eps}
309 \begin{center}S = \{4,10,3,8,4,4,5,10\}\end{center}
311 \item[\'Etape 9 :] S = \{4,10,3,8,4,4,5,10\} est le codage de Prüfer de l'arbre initial.
316 \subsection{Décodage}
318 \subsubsection{La méthode}
320 \item[Donnée :] suite $S$ de $n-2$ nombres, chacun provenant de \{1, ..., n\}.
322 Posons $I = \{1, ..., n\}$.
324 \item[Pas général de l'algorithme de décodage :]
325 à répéter tant qu'il reste des éléments dans $S$ et plus de deux éléments dans $I$ :
327 \item identifier le plus petit élément $i$ de $I$ n'apparaissant pas dans la suite $S$ ;
328 \item relier par une arête de $T$ le sommet $i$ avec le sommet $s$ correspondant au premier élément de la suite $S$ ;
329 \item enlever $i$ de $I$ et $s$ de $S$.
332 \item[Finalisation :] Les deux éléments qui restent dans I à la fin de l'algorithme constituent les extrémités de la dernière arête à ajouter à T.
336 \subsubsection{Exemple de décodage}
340 \item[\'Etape 0 :] arbre à décoder
343 \includegraphics[scale=0.7]{graphes/deprufer1.eps}
346 I=\{1,2,3,4,5,6,7,8,9,10\}
348 S=\{4,10,3,8,4,4,5,10\}
356 \includegraphics[scale=0.7]{graphes/deprufer2.eps}
365 I=\{2,3,4,5,6,7,8,9,10\}
367 S=\{10,3,8,4,4,5,10\}
374 \includegraphics[scale=0.7]{graphes/deprufer3.eps}
386 I=\{3,4,5,6,7,8,9,10\}
395 \includegraphics[scale=0.7]{graphes/deprufer4.eps}
420 \includegraphics[scale=0.7]{graphes/deprufer5.eps}
447 \includegraphics[scale=0.7]{graphes/deprufer6.eps}
476 \includegraphics[scale=0.7]{graphes/deprufer7.eps}
504 \includegraphics[scale=0.7]{graphes/deprufer8.eps}
534 \includegraphics[scale=0.7]{graphes/deprufer9.eps}
565 \includegraphics[scale=0.7]{graphes/deprufer10.eps}
601 Décrivez l'arbre ci-dessous à l'aide du codage de Prüfer.
603 \includegraphics[scale=0.7]{graphes/arbre123.eps}
614 Dessinez l'arbre correspondant à la suite S=\{1,1,1,1,1,1,1,1,1\}.
618 Dessinez l'arbre correspondant à la suite S=\{1,2,3,4,5,6,7,8\}.
623 \subsection{Théorème de Cayley}
625 \begin{Th}[Cayley, 1857]
626 Le nombre d'arbres que l'on peut construire sur $n$ ($n>1$) sommets numérotés est égal à $n^{n-2}$.
630 La preuve est immédiate en utilisant le codage de Prüfer.
632 En effet, on vérifie aisément que les deux algorithmes constituent les deux sens d'une bijection entre les arbres sur n sommets numérotés et les mots de $n-2$ lettres sur l'alphabet à $n$ lettres.
634 Ce constat permet de conclure la preuve du théorème de Cayley. En effet, il existe $n^{n-2}$ mots de longueur $n-2$ sur l'alphabet à $n$ lettres, donc d'arbres sur $n$ sommets numérotés.
637 \section{Arbres couvrants}
639 \subsection{Définition}
641 \begin{Def}[Arbre couvrant]
642 Un \emph{arbre couvrant}\index{arbre!couvrant}
643 (ou \emph{arbre maximal}\index{arbre!maximal}) d'un graphe G, est un graphe partiel de G qui est aussi un arbre.
647 On rappelle qu'un graphe partiel de G est obtenu en enlevant des arêtes (mais pas de sommets) à G.
651 Un des arbres couvrants (en bleu) d'un graphe donné.
653 \includegraphics[scale=0.7]{graphes/couvrant.eps}
657 \subsubsection{Exercices}
659 Dessiner des arbres couvrants pour chacun des graphes suivants.
661 \includegraphics[scale=0.7]{graphes/ex1.eps}
662 \includegraphics[scale=0.7]{graphes/ex2.eps}
663 \includegraphics[scale=0.7]{graphes/ex3.eps}
669 Combien d'arbres couvrants différents les graphes ci-dessus possèdent-ils ?
673 \subsection{Arbre maximal de poids minimum}
674 \subsubsection{Présentation du problème}
676 On considérera le problème suivant :
678 \og Soit le graphe $G = (V, E)$ avec un poids associé à
679 chacune de ses arêtes. Trouver, dans $G$, un arbre maximal
680 $A = (V, F)$ de poids total minimum.\fg{}
683 Ce problème se pose, par exemple, lorsqu'on désire relier $n$ villes par un réseau routier de coût minimum.
684 Les sommets du graphe représentent les villes, les arêtes, les tronçons qu'il est possible de construire et les poids des arêtes correspondent aux coûts de construction du tronçon correspondant.
686 L'algorithme de Kruskal décrit ci-dessous permet de résoudre ce problème.
689 \subsubsection{L'algorithme de Kruskal}
691 Voici un algorithme célèbre permettant de résoudre ce problème :
693 %\begin{Th}[L'algorithme de Kruskal]
696 %\item[Données :] Graphe $G = (V, E)$ ($|V| = n$, $|E| = m$) et pour chaque arête $e$ de $E$, son poids $c(e)$.
697 %\item[Résultat :] Arbre ou forêt maximale $A = (V, F)$ de poids minimum.
698 %\item[Algorithme :] Trier et renuméroter les arêtes de G dans l'ordre croissant de leur poids : $c(e_1) < c(e_2) < ... < c(e_m)$.
700 %\item Poser $F := \varnothing$, $k := 0$
701 %\item Tant que $k < m$ et $|F| < n-1$ faire
705 %\item si $e_{k+1}$ ne forme pas de cycle avec $F$ alors $F := F \cup \{e_{k+1}\}$
714 \begin{Th}[L'algorithme de Kruskal]
715 \index{Algorithme!de Kruskal}\index{Kruskal (algorithme)}
716 Pour obtenir un arbre ou une forêt couvrant(e) de poids minimum à partir d'un graphe pondéré $G = (S,A)$, on procède comme suit :
718 \item On part du graphe $G' = (S, \varnothing)$ ($G$ sans arête).
719 \item Tant que le nombre d'arêtes de $G'$ est inférieur à $min(|G|-1,|A|)$, faire
721 \item Prendre la plus petite arête (de poids minimal) restante dans $G$.
722 \item L'ajouter à $G'$ si cela ne crée pas de cycle.
723 \item La supprimer de $G$.
732 Le tableau suivant donne les coûts de construction de routes (exprimées en unités adéquates) entre six villes d'Irlande.
735 \begin{tabular}{l|cccccc}
736 & Athlone & Dublin & Galway & Limerick & Sligo & Wexford \\
775 Trouver une manière de relier ces six villes, en minimisant le coût total de construction.
781 Faire de même avec le tableau suivant, qui comptabilise cette fois-ci les kilomètres entre chaque ville (valeurs imaginaires) :
783 \begin{tabular}{l|cccccc}
784 & Athlone & Dublin & Galway & Limerick & Sligo & Wexford \\
826 \section{Arborescence}
828 \subsection{Définitions et exemples}
830 \subsubsection{Définition d'une arborescence}
832 \begin{Def}[Arborescence]
833 On appelle \emph{arborescence}\index{arborescence} un arbre avec un sommet distingué, que l'on appelle la racine.
837 On représente généralement une arborescence avec la racine en haut du dessin et les feuilles en bas.
840 \subsubsection{Exemples}
843 Sur l'arborescence ci-dessous, la racine est le sommet 4. Les sommets 5, 6, 7 et 9 sont les feuilles.
845 \includegraphics[scale=0.7]{graphes/arbo1.eps}
850 Les systèmes de fichiers ($ext3$ sous linux, $ntfs$ sous windows, etc.) sont agencés en arborescence.
854 \subsubsection{Rang des sommets}
857 On peut, dans une arborescence, assigner un rang aux sommets :
859 \begin{Def}[Rang d'un sommet]
860 Le \emph{rang}\index{sommet!rang} d'un sommet d'une arborescence est la distance de ce sommet à la racine.
865 Ainsi, dans l'exemple précédent, le sommet 4 (la racine) a rang 0, le sommet 1 a rang 1, les sommets 2 et 10 ont rang 2, les sommets 3, 5 et 8 ont rang 3 et les sommets 6, 7 et 9 ont rang 4.
868 \begin{Def}[Hauteur d'une arborescence]
869 On dira que la \emph{hauteur} \index{arborescence!hauteur} de l'arborescence est le rang maximum
873 L'exemple ci-dessus a une hauteur de 4.
877 \subsection{Arborescences ordonnées, parcours en largeur et profondeur}
879 \subsubsection{Arborescences ordonnées}
881 \begin{Def}[Arborescence ordonnée]
882 Une \emph{arborescence ordonnée}\index{arborescence!ordonnée} est une arborescence dont les arêtes partant de chaque sommet sont ordonnées.
885 Une fois qu'une arborescence a été ordonnée, il existe alors une représentation graphique canonique, la seule qui respecte cet ordre, de telle sorte que, pour chaque arête,
887 \item elle possède à sa gauche des arêtes plus petites (pour l'ordre considéré), et à sa droite de plus grandes arêtes,
888 \item au-dessus d'elle, les arêtes sont plus petites pour l'ordre, et plus grandes en-dessous d'elles.
891 En d'autres termes, on va dans le sens des arêtes croissantes quand on parcourt cette représentation canonique :
893 \item de la gauche vers la droite,
894 \item ou du haut vers le bas.
898 Il est donc possible de parler, sans ambiguïté, de droite et gauche, de haut et bas, pour une arborescence ordonnée.
902 Une manière détournée d'ordonner une arborescence consiste à en donner une représentation graphique, et à considérer cette dernière comme canonique.
906 On peut étiqueter sans ambiguïté les sommets d'une arborescence ordonnée, comme suit :
908 \item on attribue 0 à la racine $r$,
909 \item puis 1, 2, 3, ... aux sommets qui sont adjacents à $r$, en respectant l'ordre des arêtes issues de la racines.
910 \item Les étiquettes suivantes sont constituées de l'étiquette du sommet "père", suivie d'un chiffre obtenu comme précédemment.
911 \item Ainsi, les sommets "fils" attachés au sommet 2 seront numérotés 2.1, 2.2, 2.3,...
916 La figure ci-dessous illustre le procédé.
918 \includegraphics[scale=0.7]{graphes/ordo.eps}
924 \'Etiqueter les sommets de l'arborescence ordonnée dont la représentation canonique est la suivante :
926 \includegraphics[scale=0.7]{graphes/arbo1.eps}
931 Cet ordre des sommets (0, 1, 1.1, 1.2, 2, 2.1, 3, 3.1, 3.1.1, 3.1.2, 3.2, 3.3) est appelé \emph{ordre lexicographique}, puisqu'il est semblable au classement des mots dans un dictionnaire.
936 \subsubsection{Parcours en largeur, en profondeur}
938 \paragraph{Définition des parcours}
940 \begin{Def}[Parcours en largeur, en profondeur]
941 Dans le cas du parcours d'une arborescence en suivant l'ordre lexicographique, on parle de \emph{parcours en profondeur}\index{parcours!en profondeur} de l'arborescence, par opposition au \emph{parcours en largeur}\index{parcours!en largeur} qui serait l'ordre: 0, 1, 2, 3, 1.1, 1.2, 2.1, 3.1, 3.2, 3.3, 3.1.1, 3.1.2.
944 Le parcours en largeur consiste à visiter les sommets d'une arborescence ordonnée ligne par ligne, de la gauche vers la droite, les lignes étant parcourues du haut vers le bas.
948 Le parcours en profondeur, par contre, correspond à parcourir de haut en bas la branche la plus à gauche de l'arbre, puis la branche immédiatement à droite, et ainsi de suite jusqu'à la branche la plus à droite.
953 Chaque sommet n'apparaît qu'une fois dans ce parcours : le but d'un parcours étant justement de visiter une et une seule fois chaque sommet.
955 Un cas concret pourrait être la réalisation récursive d'un traitement pour chaque répertoire d'une arborescence : on souhaite visiter chaque répertoire une et une seule fois.
960 \paragraph{Exercices.}
964 Donner la liste ordonnée des sommets visités lors d'un parcours en largeur, et d'un parcours en profondeur, dans l'arborescence suivante :
966 \includegraphics[scale=0.7]{graphes/arbo1.eps}
972 Réfléchir à un algorithme de parcours en largeur d'une arborescence ordonnée.
975 \subsubsection{Lien avec les expressions algébriques}
977 \paragraph{Arborescence d'une expression algébrique.}
979 N'importe quelle expression algébrique comprenant des expressions binaires, telle que l'addition, la soustraction, la multiplication et la division, peut être représentée par une arborescence ordonnée.
982 Par exemple, l'aborescence ci-dessous représente l'expression arithmétique
983 $(a - b) / ((c \times d) + e)$:
985 \includegraphics[scale=0.7]{graphes/polonais.eps}
990 On observe que les variables de l'expression ($a, b, c, d$ et $e$)
991 sont les feuilles de l'arborescence, et que les opérations sont les autres sommets.
994 L'arbre doit être ordonné car $a-b$ et $b-a$, qui ne sont pas égaux, conduisent au même arbre, mais pas au même arbre ordonné.
998 Construire les arborescences associées aux expressions algébriques : $(a+b)*(c-(d-e))$ et $((a/b)*c)-(d-e)$.
1001 \paragraph{Notation polonaise.}
1003 Le mathématicien polonais \emph{Lukasiewicz} \index{Lukasiewicz} a remarqué qu'en plaçant les symboles des opérations binaires avant les arguments, c'est-à-dire $+ ab$ au lieu de $a+b$ ou $/ cd$
1004 au lieu de $c/d$, nous n'avions plus besoin de parenthèses\ldots
1006 \begin{Def}[Notation polonaise]
1007 On appelle cette nouvelle notation la \emph{notation polonaise}\index{notation polonaise}
1008 dans sa forme préfixée ou directe.
1012 Cette notation polonaise revient à effectuer un parcours en profondeur de l'arborescence associée à l'expression algébrique considérée.
1015 L'expression $(a - b) / ((c \times d) + e)$ devient ainsi $/ - a b + \times c d e$.
1018 Par analogie, en notation polonaise postfixée ou inverse, on place les symboles après les arguments. Certaines calculatrices - notamment des HP - utilisent la notation polonaise inverse.
1021 \subsection{Exercices}
1024 Ecrire les expressions algébriques $(a+b) \times (c-(d-e))$ et $((a/b) \times c)-(d-e)$ en notation polonaise préfixée, et postfixée.
1028 %Combien d'arborescences existe-t-il sur $n$ sommets numérotés ?
1032 Étant donnée l'expression algébrique $(2x + y) \times (5a - b)^3$,
1034 \item Dessinez l'arborescence ordonnée correspondante (on utilisera le symbole $\wedge$ pour l'exponentiation).
1035 \item Trouvez la \emph{portée} de l'exponentiation (la portée d'un sommet $s$ dans une arborescence est le sous-arbre généré par $s$ et les sommets qui le suivent, avec $s$ pour racine).
1036 \item Écrire l'expression algébrique en notation polonaise directe, et inversée.
1041 \subsection{Codage de Huffman}
1043 \subsubsection{Principe}
1045 Le \emph{codage de Huffman}\footnote{David Albert Huffman}\index{codage de Huffman} (1952) est un algorithme de compression \underline{sans perte}, utilisant la notion d'arbres, qui permet de réduire la taille de données numériques.
1047 Le principe, élémentaire, consiste à choisir de ne plus coder chaque symbole avec un nombre fixe de bits, mais à coder les symboles les plus fréquents avec un plus petit nombre de bits (quitte à devoir utiliser beaucoup de bits pour les symboles les plus rares).
1050 Par exemple, dans un texte donné, le $w$ apparait 20 fois moins souvent que le $e$. Plutôt que de coder chaque lettre sur un octet, on va donc :
1053 \item Coder le $e$ par 1 (un seul bit, au lieu de 8),
1054 \item Coder le $w$ par 010100000100 (12 bits, au lieu de 8).
1057 Si le $w$ apparait 10 fois (donc le $e$ 200 fois), le gain sera de $7 \times 200 - 4 \times 10 = 1360$ bits, rien qu'en considérant ces deux lettres.
1062 Cet algorithme offre des taux de compression démontrés les meilleurs possibles pour un codage par symbole, et il est assez compliqué de mieux compresser.
1064 \subsubsection{Propriété de préfixe}
1066 Le codage ne peut pas se faire n'importe comment : il faut pouvoir décoder, sans ambiguïté.
1071 \item Coder le $e$ par 0,
1072 \item Coder le $w$ par 010100000100,
1073 \item Coder le $x$ par 10100000100,
1075 Alors le texte 010100000100 pourra se traduire à la fois par $ex$, et $w$. On ne peut pas accepter une telle indétermination.
1079 Le codage de Huffman a donc une propriété de préfixe : une séquence binaire ne peut jamais être à la fois représentative d'un élément codé et constituer le début du code d'un autre élément.
1082 Si un symbole est représenté par la combinaison binaire 100, alors la combinaison 10001 ne peut être le code d'aucune autre information.
1086 Cette caractéristique du codage de Huffman permet une codification à l'aide d'une structure d'arbre binaire...
1089 \subsubsection{Méthode}
1091 On part d'une forêt, constituée d'arbres à une racine et une feuille, avec autant d'arbres que de symboles à coder. La feuille contient le symbole, la racine contient la fréquence d'apparition de ce symbole.
1093 A chaque étape, on choisit les deux arbres x,y de racines minimales, et on les remplacent par l'arbre ayant pour racine r la somme des racines de x et y, et pour fils de r les arbres x et y.
1095 La forêt finale est formée d'un unique arbre.
1097 Le code d'une lettre est alors déterminé en suivant le chemin depuis la racine de l'arbre, jusqu'à la feuille du symbole qui nous intéresse, en concaténant successivement un 0 ou un 1 selon que la branche empruntée est à gauche ou à droite.
1100 On dit que l'algorithme est de type glouton : il choisit à chaque étape les meilleurs choix (locaux) possibles, dans l'espoir que le résultat final sera minimal.
1103 Voici les différentes étapes de la construction d'un code de Huffman pour l'alphabet source {A, B, C, D, E, F}, avec les probabilités P(A)=0.10, P(B)=0.10, P(C)=0.25, P(D)=0.15, P(E)=0.35 et P(F)=0.05.
1106 \includegraphics[scale=0.8]{graphes/huffman.eps}
1113 Ainsi, sur la figure ci-contre, A=0111, B=010, C=10, D=00, E=11 et F=0110.
1118 Par exemple le mot FADE serait codé 011001110011. Pour décoder, on lit simplement la chaîne de bits de gauche à droite. Le seul "découpage" possible, grâce à la propriété du préfixe, est 0110-0111-00-11.
1121 \subsubsection{Applications}
1123 Malgré son ancienneté, le codage de Huffman est toujours au goût du jour, et offre encore des performances appréciables. Il est utilisé dans presque toutes les applications qui impliquent la compression et la transmission de données numériques : fax, modems, réseaux informatiques, télévision HD, \emph{etc.}
1125 Les premiers Macintosh utilisaient un code inspiré de Huffman pour la représentation des textes : chaque lettre faisait tantôt 4 bits, tantôt 12 bits, suivant sa fréquence d'apparition dans le texte. Cette méthode simple se révélait économiser 30\% d'espace sur un texte moyen, à une époque où la mémoire vive restait encore un composant coûteux.
1127 Le MPEG-1/2 Audio Layer 3, plus connu sous son abréviation de MP3, est constitué de deux étapes de compression :
1129 \item La première, avec perte, revient à la mise à l'écart de données inaudibles pour l'oreille humaine.
1130 \item La deuxième est un codage de Huffman.
1133 Le logiciel de compression \emph{gzip}\index{gzip} (GNU zip) utilise Huffman (avec un autre algorithme : LZ77). Sa version améliorée, l'algorithme \emph{bzip2}\index{bzip2}, utilise la transformée de Burrows-Wheeler avec le codage de Huffman.
1135 Ce principe de compression est aussi utilisé dans le codage d'images. Il fait par exemple partie des spécifications des formats :
1137 \item TIFF (Tagged Image Format File) spécifié par Microsoft Corporation et Aldus Corporation. Le codage d'image est fait en retranscrivant exactement le contenu d'un écran (image), en utilisant Huffman.
1138 \item JPG (Join Photographic Experts Group), algorithme de compression avec perte, dont un des éléments est Huffman.
1143 \subsubsection{Exercices}
1146 Construisez un codage de Huffman du message "ceciestuncodagedehuffman" (on a supprimé les espaces et la ponctuation pour simplifier la construction). Il y a plusieurs codages de Huffman possibles.
1147 Vérifiez la propriété du préfixe.
1151 Utilisez le tableau ci-dessous pour déterminer le codage de Huffman de la langue française.
1153 Fréquences d'apparition des lettres en français
1156 \begin{tabular}{|c|c||c|c|}
1158 Lettre & Fréquence & Lettre & Fréquence \\
1160 A & 8.40 \% & N & 7.13 \% \\
1161 B & 1.06 \% & O & 5.26 \% \\
1162 C & 3.03 \% & P & 3.01 \% \\
1163 D & 4.18 \% & Q & 0.99 \% \\
1164 E & 17.26 \% & R & 6.55 \% \\
1165 F & 1.12 \% & S & 8.08 \% \\
1166 G & 1.27 \% & T & 7.07 \% \\
1167 H & 0.92 \% & U & 5.74 \% \\
1168 I & 7.34 \% & V & 1.32 \% \\
1169 J & 0.31 \% & W & 0.04 \% \\
1170 K & 0.05 \% & X & 0.45 \% \\
1171 L & 6.01 \% & Y & 0.30 \% \\
1172 M & 2.96 \% & Z & 0.12 \% \\
1182 \centerline{\x{Fin du Chapitre}}