Compression LZW. 1 Gestion d un dictionnaire. 2 Algorithme LZW. 2.1 Compression



Documents pareils
Les deux points les plus proches

TD : Codage des images

Formats d images. 1 Introduction

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Compression Compression par dictionnaires

Recherche dans un tableau

Programmation en Caml pour Débutants

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Transmission d informations sur le réseau électrique

PROJET ALGORITHMIQUE ET PROGRAMMATION II

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

TP 1. Prise en main du langage Python

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Définitions. Numéro à préciser. (Durée : )

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Plateforme de capture et d analyse de sites Web AspirWeb

Algorithmique et Programmation, IMA

note technique 1RWLRQVVXUODFRPSUHVVLRQ GHVGRQQpHVGDQV OHVDSSOLFDWLRQVPXOWLPpGLDV Direction de l'ingénierie éducative

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Représentation d un entier en base b

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Compilation (INF 564)

Cours 1 : La compilation

Utilisation d objets : String et ArrayList

Algorithme. Table des matières

1. Structure d'un programme FORTRAN 95

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Bases de programmation. Cours 5. Structurer les données

Table des matières. Introduction

LES TYPES DE DONNÉES DU LANGAGE PASCAL

1 Introduction au codage

Licence Sciences et Technologies Examen janvier 2010

Application 1- VBA : Test de comportements d'investissements

Arbres binaires de recherche

La mémoire. Un ordinateur. L'octet. Le bit

Internet et Multimédia Exercices: flux multimédia

Compression de Données - Algorithme de Huffman Document de Conception

STAGE IREM 0- Premiers pas en Python

Algorithmique I. Algorithmique I p.1/??

EX-word TextLoader Fonction Bibliothèque

DM 1 : Montre Autoquartz ETA

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Corrigé des TD 1 à 5

IV- Comment fonctionne un ordinateur?

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

TIC. Tout d abord. Objectifs. L information et l ordinateur. TC IUT Montpellier

Travaux Dirigés n 1 : chaînes de caractères

Perl Orienté Objet BioPerl There is more than one way to do it

Solutions web : instructions aux développeurs

AWS avancé. Surveiller votre utilisation d EC2

TP : Gestion d une image au format PGM

Backup. Solution de sauvegarde en ligne pour les professionnels LE PARTENAIRE SECURITE DE VOTRE ENTREPRISE!

Cours d initiation à la programmation en C++ Johann Cuenin

Module http MMS AllMySMS.com Manuel d intégration


TP Codage numérique des caractères. Un ordinateur ne manipule que des 0 et des 1 : Comment alors code-t-il du texte?

Environnements informatiques

Structure fonctionnelle d un SGBD

Codage d information. Codage d information : -Définition-

Eole - gestion des dictionnaires personnalisés

1 Recherche en table par balayage

Représentation des Nombres

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Programmation C++ (débutant)/instructions for, while et do...while

Bases de données documentaires et distribuées Cours NFE04

Organigramme / Algorigramme Dossier élève 1 SI

UE C avancé cours 1: introduction et révisions

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Chap17 - CORRECTİON DES EXERCİCES

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

1 Lecture de fichiers

Examen Médian - 1 heure 30

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Solution Pro pour l Envoi de SMS direct opérateurs PUSH SMV MODE HTTP. Documentation Technique

Distinguer entre «Enregistrer» et «Sauvegarder»

Guide de démarrage rapide. (pour la version 5.0.)

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

REALISATION d'un. ORDONNANCEUR à ECHEANCES

L utilisation d un réseau de neurones pour optimiser la gestion d un firewall

Quelques Algorithmes simples

Université Paris-Dauphine DUMI2E 1ère année, Applications

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Cours d algorithmique pour la classe de 2nde

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Gestion de stock pour un magasin

Encryptions, compression et partitionnement des données

La question est : dans 450 combien de fois 23. L opération est donc la division. Le diviseur. Le quotient

neobe Backup Tel service de télésauvegarde informatique LE PARTENAIRE SECURITE DE VOTRE ENTREPRISE

MapReduce. Nicolas Dugué M2 MIAGE Systèmes d information répartis

Adama MBODJI MBODJ.SYSTEM

Approche Contract First

TRIGONOMETRIE Algorithme : mesure principale

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Programmation en Java IUT GEII (MC-II1) 1

Cours Informatique Master STEP

Programmation C. Apprendre à développer des programmes simples dans le langage C

Transcription:

MPSI Option Informatique Année 2001, Septième TP Caml Vcent Simonet (http://cristal.ria.fr/~simonet/) Compression LZW Lorsque l on stocke ou l on transmet via un réseau une grande quantité de données, on cherche souvent à réduire taille des formations manipulées en particulier pour dimuer le coût du stockage ou la durée de la communication. En utilisant certaes particularités des données considérées par exemple les redondances dans un texte il est possible de concevoir des algorithmes de compression permettant dans les représenter sous une forme généralement plus petite. Nous nous téressons aujourd hui à l algorithme de compression LZW (du nom de ses venteurs Abraham Lempel, Jakob Ziv qui l ont proposé en 1977 et Terry Welch qui l a falisé en 1984). Il s agit d une compression conservative dans la mesure où, après un cycle compression et décompression, les données ne sont pas altérées. Cet algorithme est, entre autres, à la base des programmes de compression «ZIP» et des formats d images «GIF» et «TIFF». 1 Gestion d un dictionnaire Nous écrivons dans cette partie quelques fonctions prélimaires. Nous appelons dictionnaire un tableau contenant des chaînes de caractères que nous supposerons toutes distctes. Un dictionnaire pourra toutefois comporter des «cases vides» qui contiendront en fait la chaîne vide. Étant donné un dictionnaire d et une chaîne s, on appelle dex de s dans d l dice de la première case de d contenant la chaîne s. Si la chaîne s n est pas présente dans d, cet entier n est pas défi. Question 1 Écrivez une fonction make dict qui prend pour argument un entier n et crée un dictionnaire de taille 256 + n itialisé comme suit : pour 0 i 255, d.(i) contient la chaîne formée du caractère ayant pour code ASCII l entier i. pour i 256, d.(i) contient une chaîne vide. value make dict : t strg vect Pour générer une chaîne formée du caractère de code ASCII i, vous pourrez utiliser l expression Caml s t r i n g o f c h a r ( c h a r o f i n t i ) Étant donnés un dictionnaire d et une chaîne s, nous nous téressons particulièrement à deux opérations élémentaires : d une part obtenir l dex d une chaîne dans d (si cette chaîne est présente dans le dictionnaire) et d autre part ajouter une chaîne à un dictionnaire en la plaçant dans la première case libre. Question 2 Écrivez une fonction dex qui prend pour arguments un dictionnaire d et une chaîne s. Cette fonction retournera l dice de la première occurence de s dans d. La fonction renverra par convention 1 si s n apparaît pas dans d. value dex : strg vect strg t Question 3 Programmez une fonction add qui prend également pour arguments un dictionnaire d et une chaîne s. Cette fonction ajoutera s au dictionnaire d dans la première case libre. Si le dictionnaire passé en argument est ple, il sera laissé en l état. value add : strg vect strg unit 2 Algorithme LZW 2.1 Compression On s téresse dans un premier temps à l algorithme de compression. L entrée de cet algorithme est la chaîne de caractères s que l on souhaite compresser. On note n sa longueur. Le résultat de la compression sera représenté par une liste d entiers. Ces entiers seront des dex correspondant aux entrées d un dictionnaire. L algorithme LZW utilise en effet un dictionnaire itialisé comme diqué à la question 1. Au fur et à mesure de la lecture de la chaîne à compresser ce dictionnaire est complété par des sous-chaînes de s. c Vcent Simonet 2001 Ce document est distribué selon les termes de la GNU Free Documentation License.

Voici une description formelle de l algorithme de compression. Dans cette description, on note a x l action de mettre la valeur x dans la variable a, et s 1 s 2 la concaténation des deux chaînes de caractères s 1 et s 2. créer un dictionnaire d tampon s.[0] resultat [ ] pour i variant de 1 à n 1 faire si (tampon s.[i]) est dans d alors tampon tampon s.[i] son resultat dex(tampon) :: resultat ajouter (tampon s.[i]) au dictionnaire tampon s.[i] resultat dex(tampon) :: resultat renvoyer le miroir de resultat Question 4 Appliquez cet algorithme à la ma sur la phrase suivante maman aime manger Vous pourrez supposer pour simplifier que le dictionnaire est itialisé avec le caractère d espacement et les 26 lettres de l alphabet. Question 5 Écrivez une fonction compresse qui prend pour argument une chaîne de caractères et lui applique l algorithme précédent. Le résultat sera rendu sous la forme d une liste d entiers. value compresse : strg t list 2.2 Décompression Il nous faut matenant écrire une procédure de décompression. Cette procédure doit prendre en entrée la liste produite par la fonction compresse et retrouver la chaîne de caractères itiale. La difficulté réside dans le fait que l on ne conserve pas le dictionnaire construit lors de la compression. Il faut donc le reconstruire lors de la décompression. Soit t une liste d entiers produite par l algorithme de compression. On note t i le i-ème élément de cette liste (pour 0 i < n). Voici une description de l algorithme de décompression : créer un dictionnaire d tampon d.(t 0 ) resultat tampon pour i variant de 1 à n 1 faire soit p = d.(t i) resultat resultat p soit c le premier caractère de p ajouter tampon c à d tampon p renvoyer la chaîne resultat Question 7 Écrivez une fonction decompresse qui prend pour argument une liste d entiers (supposée issue de la fonction compresse) et lui applique l algorithme de décompression pour obtenir la chaîne correspondante. value decompresse : t list strg 3 Évaluation du taux de compression La représentation du résultat de la compression par une liste d entiers Caml n est pas très réaliste : il faudrait a priori 30 bits pour stocker chaque entier. Cependant, on remarque que la taille des entiers produits par l algorithme de compression croît progressivement au fur et à mesure que l on avance dans la liste (et que le dictionnaire se remplit). Dans la pratique, on peut donc utiliser la technique suivante pour coder la liste : Tant que tous les entiers sont strictement férieurs à 255, coder ces entiers sur 8 bits. Lorsque l on rencontre le premier entier supérieur ou égal à 255, émettre la séquence 11111111 (huit fois le bit 1) et contuer, tant que les entiers sont strictement férieurs à 511, en codant les entiers sur 9 bits. Lorsque l on rencontre le premier entier supérieur ou égal à 511, émettre la séquence 111111111 (neuf fois le bit 1) et contuer, tant que les entiers sont strictement férieurs à 1023, en codant les entiers sur 10 bits. De manière générale, tant que les entiers considérés sont strictement férieurs à n = 2 k 1, on peut les représenter sur k bits. Lorsque le premier entier supérieur ou égal à 2 k 1 est rencontré, on émet la séquence 1... 1 (k fois le bit 1) et on contue en codant les entiers sur k + 1 bits. Question 8 Écrivez une fonction espace qui étant donnée une liste d entiers produite par l algorithme de compression calcule en octets l espace nécessaire pour stocker cette liste en utilisant le codage décrit ci-dessus. value espace : t list t En utilisant la fonction espace vous pouvez facilement calculer le taux de compression obtenu par votre algorithme sur différents exemples de votre choix. Question 9 Écrivez une fonction b of t qui prend pour argument deux entiers n et k et renvoie une liste de longueur k représentant l entier n en baire (bit de poids faible en tête). Cette liste sera tronquée si l écriture baire de n comporte plus de k chiffres. value b of t : t t t list Question 6 Décompressez à la ma et à l aide de cet algorithme le code que vous avez obtenu à la question 4. Question 10 Déduisez-en une fonction code qui prend pour argument une liste d entiers produite par la fonction compresse et retourne la liste baire correspondante. 2

S il vous reste du temps, vous pouvez (enf) programmer une fonction decode qui prend une liste de booléens et retourne la liste d entiers qu elle code. Nous avons écrit à peu près toutes les étapes d un algorithme de compression effectif. Cependant, nos algorithmes manquent beaucoup d efficacité dans la gestion des dictionnaires. Nous verrons lors de la prochae séance une structure de donnée permettant de représenter efficacement un tel objet. 3

MPSI Option Informatique Année 2001, Septième TP Caml Vcent Simonet (http://cristal.ria.fr/~simonet/) Compression LZW Un corrigé Question 1 Question 2 Question 3 Question 5 l e t make dict n = l e t d = make vect (256 + n ) for i = 0 to 255 do d. ( i ) < s t r i n g o f c h a r ( c h a r o f i n t i ) for i = 256 to n 1 do d. ( i ) < d l e t dex d s = l e t n = vect length d l e t i = r e f 0 while! i < n && d. (! i ) <> s do i : =! i + 1 i f! i = n then i := 1;! i l e t add d s = l e t n = vect length d l e t i = r e f 0 while! i < n && d. (! i ) <> do i : =! i + 1 i f! i < n then d. (! i ) < s l e t compresse s = l e t n = s t r i n g l e n g t h s l e t d = make dict n l e t r e s u l t a t = r e f [ ] l e t tampon = r e f ( s u b s t r i n g s 0 1 ) for i = 1 to n 1 do l e t tampon =! tampon ˆ ( s u b s t r i n g s i 1) i f dex d tampon >= 0 then tampon := tampon e l s e beg Question 11 Question 8 Question 9 r e s u l t a t := ( dex d! tampon ) : :! r e s u l t a t ; add d tampon ; tampon := s u b s t r i n g s i 1 end rev ( ( dex d! tampon ) : :! r e s u l t a t ) l e t rec l i s t m a x = function [] > r a i s e ( Invalid argument l i s t m a x ) [ x] > x x : : y : : q > l i s t m a x ( (max x y ) : : q) l e t decompresse = function [] > t0 : : queue as l i s t e > l e t d = make dict ( l i s t m a x l i s t e ) l e t rec aux tampon = function [] > t : : reste > add d ( tampon ˆ ( s u b s t r i n g d. ( t ) 0 1 ) ) ; d. ( t ) ˆ ( aux d. ( t ) r e s t e ) d. ( t0 ) ˆ ( aux d. ( t0 ) queue ) l e t espace l i s t = l e t rec aux n k = function [] > 0 t : : q as l > i f t < n then k + aux n k q e l s e k + aux ((1 + n ) 2 1) ( k + 1) l l e t x = aux 255 8 l i s t x / 8 + ( i f x mod 8 = 0 then 0 else 1) l e t rec b i n o f i n t = fun 0 > [ ] k 0 > 0 : : ( b i n o f i n t ( k 1) 0) k n > (n mod 2 ) : : ( b i n o f i n t ( k 1) (n / 2 ) )

Question 10 l e t rec make list x = function 0 > [] n > x : : ( make list x ( n 1)) l e t code l i s t = l e t rec aux n k = function [] > [] t : : q as l > i f t < n then ( b i n o f i n t k t ) @ ( aux n k q) e l s e ( make list 1 k) @ ( aux ((1 + n ) 2 1) ( k + 1) l ) aux 255 8 l i s t 2