This commit is contained in:
parent
ce438efb57
commit
906a4b4ace
5 changed files with 486 additions and 1 deletions
|
@ -166,7 +166,7 @@ AC_SUBST(TARGET_HAVE_READLINE)
|
|||
#AC_SUBST(LIBXMLPP_LIBS)
|
||||
|
||||
|
||||
AC_CONFIG_FILES([Makefile src/Makefile src/lib/Makefile src/tools/Makefile])
|
||||
AC_CONFIG_FILES([Makefile src/Makefile src/lib/Makefile src/rle1/Makefile src/rle2/Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
dnl configure.in ends here
|
||||
|
|
144
doc/enonce/compression/tp1.html
Normal file
144
doc/enonce/compression/tp1.html
Normal file
|
@ -0,0 +1,144 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
|
||||
<head xml:lang="fr" lang="fr">
|
||||
<title>TP - Documents et compression - M2-SRI</title>
|
||||
<meta content="text/html; charset=iso-8859-1" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="Sujet de la première séance de travaux
|
||||
pratiques du cours de «formats de documents et compression» du
|
||||
master 2 II - SRI" />
|
||||
<meta name="Author" content="Jean-Baptiste Yunès"/>
|
||||
<meta name="keywords" content="TP,compression" />
|
||||
<link href="../cours.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="titre">
|
||||
<h1>Formats de documents et compression - TP 1</h1>
|
||||
</div>
|
||||
|
||||
<div class="tdm">
|
||||
<h2>Sujet</h2>
|
||||
</div>
|
||||
|
||||
<p>On se propose de réaliser, par étapes successives, un logiciel de
|
||||
(dé)compression basé sur la technique RLE et le code de Golomb.</p>
|
||||
|
||||
<h2>Le RLE</h2>
|
||||
|
||||
<p>Le principe du codage RLE (Run Length Encoding) est d'obtenir à partir
|
||||
d'une suite de nombre supposée contenir des répétitions consécutives de mêmes
|
||||
valeurs, une suite contenant:</p>
|
||||
<ul class="disc">
|
||||
<li>pour toute répétition suffisamment longue, la longueur de la suite et
|
||||
la valeur répétée,</li>
|
||||
<li>pour toute répétition trop courte, la suite de valeurs sans
|
||||
modification.</li>
|
||||
</ul>
|
||||
<p>Un tel codage nécessite en pratique d'insérer dans la suite construite des
|
||||
marqueurs permettant de réaliser le décodage.</p>
|
||||
|
||||
<p>Il est facile d'observer que, par une telle méthode, certaines suites sont
|
||||
«compressées»; la longueur de la suite après codage est plus
|
||||
petite que la longueur de la suite originale.</p>
|
||||
|
||||
<p class="exemple">La suite <code>aaaaabcbaaaaaabbbbbb</code> (de longueur 20)
|
||||
pourraît être
|
||||
encodée de façon à produire la suite <code>[RLE]5abcb[RLE]6a[RLE]6b</code> (de
|
||||
longueur 12).</p>
|
||||
|
||||
<div class="todo">
|
||||
<p><strong>1.</strong> Il est demandé de réaliser dans un langage de
|
||||
programmation de votre choix un
|
||||
programme d'encodage et de décodage RLE (basé sur le principe précédent). Ce
|
||||
programme devra permettre d'encoder tout fichier donné en entrée et produire
|
||||
en sortie un fichier dont le nom sera étendu en <code>.rl1</code>. Ce
|
||||
programme devra en outre produire en sortie le taux de compression obtenu.</p>
|
||||
|
||||
<p>Ce programme pourra être paramétré de façon à permettre à l'utilisateur de
|
||||
choisir ce qu'il considère comme étant un caractère de la suite.</p>
|
||||
|
||||
<p>On testera ce programme sur une variété de fichiers communs: texte
|
||||
français, binaire, bitmap d'image, etc.</p>
|
||||
</div>
|
||||
|
||||
<p>De nombreuses variantes de ce principe sont utilisées. Par exemple, si la
|
||||
suite considérée est une suite de bits, on peut s'intéresser aux suites de 0
|
||||
consécutifs situés entre deux 1.</p>
|
||||
|
||||
<p class="exemple">La suite <code>00000100110000000101011</code> peut être
|
||||
représentée par la suite <code>52071100</code>.</p>
|
||||
|
||||
<div class="todo">
|
||||
<p><strong>2.</strong> Écrire un programme (dans le langage de votre choix)
|
||||
permettant de coder et décoder tout fichier considéré comme une suite de
|
||||
bits. Le fichier résultat sera nommé en utilisant l'extension
|
||||
<code>.rl2</code>.</p>
|
||||
</div>
|
||||
|
||||
<div class="todo">
|
||||
<p><strong>3.</strong> On étudiera les relations entre cet encodage et le précédent. Du point de
|
||||
vue de l'encodage lui-même, de leurs performances relatives, etc.</p>
|
||||
</div>
|
||||
|
||||
<div class="todo">
|
||||
<p><strong>4.</strong> On recherchera la spécification de formats courants
|
||||
utilisant le codage RLE. On comparera les techniques employées dans ces divers
|
||||
formats avec celles réalisées dans ce TP.</p>
|
||||
</div>
|
||||
|
||||
<h2>Le code de Golomb</h2>
|
||||
<p>En ce qui concerne le RLE du second type et précédemment décrit le
|
||||
problème principal est de trouver un codage adéquat pour la suite des nombres
|
||||
produits; <em>i.e.</em> comment coder la suite <code>52071100</code> ? Le code
|
||||
de Golomb permet de construire un codage de longueur variable permettant
|
||||
d'obtenir une compression raisonnablement efficace.</p>
|
||||
|
||||
<h3>Code de Golomb<sub>d</sub></h3>
|
||||
<p>Pour l'entier <var>n</var>, Golomb<sub>d</sub>(<var>n</var>) est construit
|
||||
par concaténation du codage unaire du quotient de <var>n</var>/d et du codage
|
||||
binaire tronqué du reste de <var>n</var>/d.</p>
|
||||
|
||||
<p>Le codage unaire d'un entier <var>i</var> est une suite de <var>i</var>
|
||||
<code>1</code> suivie d'un <code>0</code>. Le nombre <code>5</code> se code
|
||||
donc <code>111110</code>.</p>
|
||||
|
||||
<p>Le codage binaire tronqué de l'entier <var>i</var>,
|
||||
CBT<sub>d</sub>(<var>i</var>) est obtenu de la façon suivante:</p>
|
||||
<ul class="disc">
|
||||
<li>On appelle <var>c</var> la partie entière supérieure du logarithme en
|
||||
base 2 de d, <em>i.e.</em> le nombre de bits utiles pour écrire d en binaire
|
||||
(par exemple pour 5, <var>c</var>=3).</li>
|
||||
<li>si <var>i</var><2<sup><var>c</var></sup>-d, <var>i</var> sera codé en
|
||||
employant <var>c-1</var> bits.</li>
|
||||
<li>sinon <var>i</var> sera codé par les <var>c</var> derniers bits de
|
||||
2<sup><var>c</var></sup>-(d-<var>i</var>).</li>
|
||||
</ul>
|
||||
<p>Ainsi pour d=5, le codage du nombre 23 sera <code>11110110</code>, car
|
||||
<code>11110</code> est le codage unaire de 4 (23/5=4) et <code>110</code> le
|
||||
codage sur 3 bits de 6 (on cherche CBT<sub>5</sub>(3), on sait que
|
||||
2<sup>3</sup>-(5-3)=6).</p>
|
||||
|
||||
<p>Comment déterminer une valeur adéquate pour d ? Il
|
||||
suffit de prendre la médiane de la suite à coder.</p>
|
||||
|
||||
<div class="todo">
|
||||
<p><strong>5 (difficile).</strong> Écrire un programme permettant de coder et
|
||||
décoder tout fichier considéré comme une suite de bits en utilisant le code de
|
||||
Golomb.</p>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="todo">
|
||||
<p>Le TP devra être rédigé (sous la forme de documents HTML) et rendu avec les
|
||||
codes sources des programmes; ce au plus une semaine après la séance.</p>
|
||||
</div>
|
||||
|
||||
<p><a class="fin" href="http://validator.w3.org/check/referer"><img
|
||||
src="/~yunes/graphics/vxhtml10" alt="Valid XHTML 1.0!"
|
||||
/></a><a class="fin" href="http://jigsaw.w3.org/css-validator/"><img
|
||||
src="/~yunes/graphics/vcss.gif" alt="Valid CSS!" /></a></p>
|
||||
</body>
|
||||
</html>
|
341
doc/enonce/cours.css
Normal file
341
doc/enonce/cours.css
Normal file
|
@ -0,0 +1,341 @@
|
|||
DIV.resultat {
|
||||
font-family: helvetica, sans-serif;
|
||||
border-width: 1px 1px 1px 1px;
|
||||
background-color: #ccffcc;
|
||||
color: black;
|
||||
margin-left: 0em;
|
||||
margin-right: 0em;
|
||||
margin-top: 0em;
|
||||
margin-bottom: 0em;
|
||||
padding-bottom: 0em;
|
||||
}
|
||||
DIV.resultat OL {
|
||||
list-style-type : decimal;
|
||||
}
|
||||
DIV.resultat UL {
|
||||
list-style-type : disc;
|
||||
}
|
||||
DIV.resultat P DEL {
|
||||
text-decoration : line-through;
|
||||
}
|
||||
DIV.resultat P INS {
|
||||
text-decoration : underline;
|
||||
}
|
||||
DIV.resultat H1 {
|
||||
font-size: 18pt;
|
||||
font-weight: normal;
|
||||
background-color: #ccffcc;
|
||||
color: black;
|
||||
}
|
||||
DIV.resultat H2 {
|
||||
font-size: 14pt;
|
||||
font-weight: normal;
|
||||
background-color: #ccffcc;
|
||||
color: black;
|
||||
}
|
||||
DIV.resultat P {
|
||||
background-color: #ccffcc;
|
||||
color: black;
|
||||
}
|
||||
DIV.resultat Q {
|
||||
font-weight: bold;
|
||||
}
|
||||
DIV.resultat BLOCKQUOTE {
|
||||
color: green;
|
||||
font-weight : bold;
|
||||
}
|
||||
DIV.resultat ABBR {
|
||||
background-color: white;
|
||||
color: green;
|
||||
}
|
||||
DIV.resultat ACRONYM {
|
||||
background-color: white;
|
||||
color: red;
|
||||
}
|
||||
BODY {
|
||||
font-size : 12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
text-align : justify;
|
||||
background-color: #e7f7e0;
|
||||
background-image: url(/~yunes/images/fond.gif);
|
||||
color: black;
|
||||
}
|
||||
A:link {
|
||||
color : blue;
|
||||
text-decoration : none;
|
||||
}
|
||||
A:visited {
|
||||
color : navy;
|
||||
text-decoration : none;
|
||||
}
|
||||
A:active {
|
||||
color : red;
|
||||
text-decoration : none;
|
||||
}
|
||||
A.fin:link, A.fin:visited, A.fin:active, A.fin:hover {
|
||||
color : #e7f7e0;
|
||||
background-color : #e7f7e0;
|
||||
}
|
||||
DIV.titre {
|
||||
border-width: 1px 1px 1px 1px;
|
||||
background-color : #f0fff0;
|
||||
background-image: url(/~yunes/images/fond-titre.gif);
|
||||
color: black;
|
||||
text-align: center;
|
||||
margin: 0em 0em 0em 0em;
|
||||
padding-bottom: 0em;
|
||||
}
|
||||
DIV.titre H1 {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0em;
|
||||
padding-bottom: 0em;
|
||||
padding-top: 0em;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size : 24pt;
|
||||
}
|
||||
DIV.titre P {
|
||||
margin: 0em 0em 0em 0em;
|
||||
padding: 0em 0em 0em 0em;
|
||||
background-color : #f0fff0;
|
||||
background-image: url(/~yunes/images/fond-titre.gif);
|
||||
text-align : center;
|
||||
font-weight : bold;
|
||||
}
|
||||
DIV.titre P.gros {
|
||||
font-size : 24pt;
|
||||
}
|
||||
DIV.tdm {
|
||||
border-width: 1px 1px 1px 1px;
|
||||
background-color: #b0bfb0;
|
||||
color: black;
|
||||
margin-left: 0em;
|
||||
margin-right: 0em;
|
||||
margin-top: 0em;
|
||||
margin-bottom: 0em;
|
||||
padding-bottom: 0em;
|
||||
}
|
||||
H1 {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0em;
|
||||
padding-bottom: 0em;
|
||||
padding-top: 0em;
|
||||
font-size : 24pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
background-color: #b0bfb0;
|
||||
color: black;
|
||||
font-weight : bold;
|
||||
}
|
||||
|
||||
H2 {
|
||||
font-size : 16pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
font-weight : bold;
|
||||
background-color: #b0bfb0;
|
||||
color: black;
|
||||
}
|
||||
H3 {
|
||||
font-size : 14pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
font-weight : bold;
|
||||
}
|
||||
H4 {
|
||||
font-size : 12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
font-weight : bold;
|
||||
}
|
||||
H5 {
|
||||
font-size : 12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
font-weight : normal;
|
||||
text-decoration : underline;
|
||||
}
|
||||
|
||||
P {
|
||||
font-size : 12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
text-align : justify;
|
||||
background-color: #e7f7e0;
|
||||
background-image: url(/~yunes/images/fond.gif);
|
||||
color: black;
|
||||
}
|
||||
P.date {
|
||||
font-size : 8pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
}
|
||||
P.myquote {
|
||||
margin-top : 0em;
|
||||
margin-bottom : 0em;
|
||||
margin-left : 3em;
|
||||
margin-right : 1em;
|
||||
}
|
||||
P.note {
|
||||
font-size: 10pt;
|
||||
color: black;
|
||||
background-color: #ff8888;
|
||||
background-image: none;
|
||||
}
|
||||
P.rem {
|
||||
color: black;
|
||||
background-color: #efffef;
|
||||
background-image: none;
|
||||
margin-left: 1em;
|
||||
}
|
||||
P.message {
|
||||
font-size : 18pt;
|
||||
background-color: #cc0000;
|
||||
color: #ffffff;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
TABLE {
|
||||
font-size : 12pt;
|
||||
background-color: #d7e7d0;
|
||||
}
|
||||
OL.numeroted {
|
||||
font-size:12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
list-style-type : decimal;
|
||||
}
|
||||
OL {
|
||||
font-family : helvetica, sans-serif;
|
||||
font-size:12pt;
|
||||
list-style-type : decimal;
|
||||
text-align : justify;
|
||||
}
|
||||
|
||||
DL {
|
||||
font-size:12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
UL {
|
||||
font-size:12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
list-style-type : none;
|
||||
text-align: justify;
|
||||
}
|
||||
UL.disc {
|
||||
font-size:12pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
list-style-type : disc;
|
||||
}
|
||||
UL SUP {
|
||||
font-size: 10pt;
|
||||
}
|
||||
ADDRESS {
|
||||
font-size: 8pt;
|
||||
font-family : helvetica, sans-serif;
|
||||
}
|
||||
PRE {
|
||||
font-family: Terminal, courier, monospace;
|
||||
font-size: 10pt;
|
||||
background: #e0e0e0;
|
||||
border-width: 1px 1px 1px 1px;
|
||||
border-style: none;
|
||||
white-space: pre;
|
||||
text-align: left;
|
||||
}
|
||||
.tag, .exc, .pkg, .jclass, .event, .mac, .fct, .macro, .src, .symb {
|
||||
font-size: 12pt;
|
||||
font-family: Terminal, courier, monospace;
|
||||
background-color : white;
|
||||
}
|
||||
.def {
|
||||
font-size: 12pt;
|
||||
font-family: Terminal, courier, monospace;
|
||||
background-color : white;
|
||||
}
|
||||
.opt, .com, .code, .litteral, .signal {
|
||||
font-size: 12pt;
|
||||
font-family: Terminal, courier, monospace;
|
||||
background-color : white;
|
||||
}
|
||||
PRE .typing {
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
PRE .comment {
|
||||
font-size: 10pt;
|
||||
background-color: #c0c0c0;
|
||||
color: black;
|
||||
}
|
||||
.type, .field {
|
||||
font-size: 12pt;
|
||||
font-family: Terminal, courier, monospace;
|
||||
background-color: white;
|
||||
color: #aa2211;
|
||||
}
|
||||
VAR {
|
||||
font-size: 12pt;
|
||||
font-family: courier, monospace;
|
||||
font-style: italic;
|
||||
background-color: white;
|
||||
}
|
||||
.var {
|
||||
font-size: 12pt;
|
||||
font-family: courier, monospace;
|
||||
font-style: italic;
|
||||
background-color: white;
|
||||
}
|
||||
.cst {
|
||||
font-size: 12pt;
|
||||
font-family: Terminal, courier, monospace;
|
||||
font-weight: bold;
|
||||
background-color: white;
|
||||
color: #333333;
|
||||
}
|
||||
.car, .file, .string {
|
||||
font-size: 12pt;
|
||||
font-family: Terminal, courier, monospace;
|
||||
background-color : white;
|
||||
}
|
||||
SPAN.author {
|
||||
font-weight: bold;
|
||||
}
|
||||
SPAN.title {
|
||||
font-style: italic;
|
||||
font-size: 13pt;
|
||||
}
|
||||
A {
|
||||
text-decoration: none;
|
||||
}
|
||||
kbd {
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
DIV.adresse {
|
||||
font-family : Terminal, courier, monospace;
|
||||
background-color : #999999;
|
||||
border-width : 5px 5px 5px 5px;
|
||||
border-style : none;
|
||||
padding : 1em 1em 1em 1em;
|
||||
width : 95%;
|
||||
text-align : left;
|
||||
font-size : 10pt;
|
||||
font-style : normal;
|
||||
}
|
||||
|
||||
IMG.carte {
|
||||
display : block;
|
||||
float : right;
|
||||
}
|
||||
|
||||
.exemple {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
DIV.todo {
|
||||
background-image: none;
|
||||
background-color : #ffdddd;
|
||||
border-width : 1px 1px 1px 1px;
|
||||
border-style : solid;
|
||||
padding : 0em 1em 0em 1em;
|
||||
width : 90%;
|
||||
text-align : justify;
|
||||
}
|
||||
|
||||
DIV.todo P {
|
||||
background-image: none;
|
||||
background-color : #ffdddd;
|
||||
}
|
BIN
doc/enonce/graphics/vcss.gif
Normal file
BIN
doc/enonce/graphics/vcss.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
doc/enonce/graphics/vxhtml10
Normal file
BIN
doc/enonce/graphics/vxhtml10
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
Loading…
Reference in a new issue