Projet codage de texte



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

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

Programmation système I Les entrées/sorties

Les structures de données. Rajae El Ouazzani

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

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

TD : Codage des images

Programmation système de commandes en C

Formats d images. 1 Introduction

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Représentation d un entier en base b

Le système de gestion des fichiers, les entrées/sorties.

Algorithmique et Programmation, IMA

UE Programmation Impérative Licence 2ème Année

Le prototype de la fonction main()

Les arbres binaires de recherche

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


DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Programmation impérative

HMTL. Exemple de fichier HTML. Structure d un document HTML. Exemple de fichier HTML. Balises HTML. IFT1147 Programmation Serveur Web avec PHP

3IS - Système d'exploitation linux - Programmation système

Architecture des ordinateurs

Algorithmique I. Algorithmique I p.1/??

Arbres binaires de recherche

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

TP : Gestion d une image au format PGM

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

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

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

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

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Introduction au langage C

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

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Introduction à MATLAB R

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

Le langage C. Séance n 4

1 Introduction au codage

Les fichiers. Chapitre 4

Informatique Générale

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Le codage informatique

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

Recherche dans un tableau

Chap17 - CORRECTİON DES EXERCİCES

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours 6 : Tubes anonymes et nommés

Les chaînes de caractères

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

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

Plan du cours. Historique du langage Nouveautés de Java 7

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Cours d Algorithmique et de Langage C v 3.0

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

GESTION DES FICHIERS C/UNIX

TD3: tableaux avancées, première classe et chaînes

Cours Programmation Système

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Programmation Classique en langage C

Chap III : Les tableaux

Chapitre 13 Numérisation de l information

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Les structures. Chapitre 3

Introduction à l informatique en BCPST

Algorithmique, Structures de données et langage C

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

ARBRES BINAIRES DE RECHERCHE

Initiation à l algorithmique

JPEG, PNG, PDF, CMJN, HTML, Préparez-vous à communiquer!

Transmission d informations sur le réseau électrique

Programmation avec des objets : Cours 7. Menu du jour

Conventions d écriture et outils de mise au point

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours Informatique 1. Monsieur SADOUNI Salheddine

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

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

TS 35 Numériser. Activité introductive - Exercice et démarche expérimentale en fin d activité Notions et contenus du programme de Terminale S

STAGE IREM 0- Premiers pas en Python

Master IMA - UMPC Paris 6 RDMM - Année Fiche de TP

PROJET ALGORITHMIQUE ET PROGRAMMATION II

as Architecture des Systèmes d Information

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Utilisation d objets : String et ArrayList

I. Introduction aux fonctions : les fonctions standards

Java Licence Professionnelle CISII,

Premiers Pas en Programmation Objet : les Classes et les Objets

INF601 : Algorithme et Structure de données

Claude Delannoy. 3 e édition C++

nom : Collège Ste Clotilde

Rappels Entrées -Sorties

Transcription:

Formation ISN Professeurs de Terminale Denis Bouhineau, Éric Gaussier, Alexandre Termier, Cyril Labbé, Philippe Bizard, Anne Rasse, Jean-Marc Vincent UFR IM 2 AG email Jean-Marc.Vincent@imag.fr Formation professeurs de terminale Niveau I 1 / 34

Plan 1 Objectif 2 Thématique 3 Algorithme 4 Implémentation 5 Run Length Encoding 6 Réalisation 2 / 34

Objectifs du projet 1 Analyse d algorithme et conception arbres, files à priorité, itérations récursion 2 Écriture de code en langage C renforcer la pratique de ce langage, fichiers, co-développement 3 Validation à chaque étape analyse de complexité, évaluation de performances (expérimentation) Structure de mini-projet : travail en équipe : binômes temps plein (sur une semaine) autonomie Évaluation : soutenance/démonstration du logiciel Déroulement : démonstration : 15 mn questions : 15 mn Objectifs : montrer ce qui fonctionne préparer des jeux d essai prévoir le déroulement de la présentation travailler le discours 3 / 34

Organisation Planning : organisation: TD de 8h30 à 9h30, salle machine ensuite lundi : démarrage [salle TD] mardi : architecture de projet [salle machine] mercredi : entrées/sorties bit à bit [salle TD] jeudi : développement [salle machine ] vendredi : validation, analyse de coût, démo [salle TD] Encadrement : Denis Bouhineau, Éric Gaussier, Alexandre Termier, Cyril Labbé, Philippe Bizard, Anne Rasse, Jean-Marc Vincent page Web : 4 / 34

Thème du projet : compression sans pertes Au menu : Algorithme de Huffman programes de codage et décodage lecture/écriture de fichiers binaires compression/décompression à la volée Algorithme Run Length Encoding version de base variantes (historique, séquence d échappement, PackBits) Expérimentation sur divers formats de données : textes, programmes (source et binaire), images, etc. 5 / 34

Rappels : codage de Huffman alphabet d entrée A (caractères, pixels, etc.) alphabet de sortie {0, 1} (bit) un code de Huffman : associe à chaque élément de A une séquence sur {0, 1} : A codage {0, 1} {0, 1} decodage A caractéristiques : code de longueur variable (= code Morse ; code Ascii) propriété de préfixe : codage(a 1 )=w 1, codage(a 2 )=w 2 w 1 et w 2 ne sont pas préfixes l un de l autre ( algorithme de décodage efficace) 6 / 34

Application du codage de Huffman Coder une séquence d éléments sur A dans un fichier binaire : associer un code court aux élements les plus fréquents compression de la séquence initiale Remarques : le code doit être construit en fonction du texte initial... avant le codage : Huffman statique pendant le codage : Huffman dynamique il doit être connu lors du décodage... (transmis ou recalculé à l identique) 7 / 34

Arbre de Huffman Une représentation d un code de Huffman = arbre de Huffman ensemble des feuilles = éléments de A accès au fils gauche = 0 ; accès au fils droit = 1 code(a) = séquence σ des étiquettes du chemin : racine σ a 0 1 E A B D C F code(e)=1 ; code(a)=001 ; code(c)=0110 ; etc. la propriété de préfixe est respectée! 8 / 34

Algorithme de Codage Etant donné un arbre de Huffman : S = a 1... a n R {0, 1} 0 1 E A B D C F 1 construction d une table de codage C parcours en profondeur d abord de l arbre de Huffman en mémorisant la séquence σ racine σ noeud courant pour chaque feuille a : C[a] = σ Rq : algo récursif ou itératif (avec pile explicite) 2 parcours de S et production de R à l aide de C 9 / 34

Algorithme de Décodage Etant donné un arbre de Huffman : R {0, 1} S = a 1... a n 0 1 E A B D C F 1 parcours de l arbre de Huffman selon R ( 0 : fils gauche ; 1 : fils droit) 2 à chaque feuille a atteinte : écriture de a dans S retour à la racine de l arbre de Huffman... 10 / 34

Construction d un arbre de Huffman? Dépend de la fréquence des éléments de A dans S : fréquence élevée = éléments proches de la racine Obtention d une table de fréquences : Freq[a i ] = f i (f i = fréquence de a i dans S, un réel entre 0 et 1) Approche statique : 1 construction de Freq par un 1er parcours de S (f i = nombre d occurences de a i / S ) 2 construction de l arbre de Huffman (à l aide de Freq) 11 / 34

Algorithme informel de construction de l arbre On utilise une file à priorités (Fap) F dont : les éléments sont des noeuds de l arbre les priorités sont des réels (valeur élevée priorité forte) Algo : 1 insérer les éléments (a i, Freq[a i ]) dans la fap F 2 tantque F contient au moins 2 éléments extraire deux éléments (n 1, f 1 ) et (n 2, f 2 ) de poids minimal de F insérer (n, f 1 + f 2 ) dans F, où n est un nouveau noeud de fils gauche n 1 et de fils droit n 2 3 l élément restant dans F est la racine de l arbre de Huffman 12 / 34

Structures de données Ensemble A : caractères d un code Ascii étendu (0 à 255) Table Freq : tableau de réels indicé de 0 à 255 Arbre de Huffman : soit chaînage de cellules par pointeurs soit tableau (256 feuilles 511 noeuds) Fap F : séquence de couples (noeud de l arbre, réel) Séquence sur {0, 1} : suite de caractères 0 et 1 13 / 34

Architecture globale Un ensemble de programmes interconnectés : Decodage S Calcul frequence Freq Construction Arbre arbre R Codage communications possible par fichiers, ou tubes (pipe)... 14 / 34

Exemple de découpage en commandes Commande de calcul des fréquences : calcul frequences < entree.txt > frequences.txt Codage (construit l arbre puis code) : codage frequences.txt < entree.txt > code.txt Décodage (construit l arbre puis décode) : decodage frequences.txt < code.txt > sortie.txt Vérification du résultat : diff entree.txt sortie.txt Taille du texte d entrée : stat -f %z entree.txt Taille du texte codé : stat -f %z code.txt 15 / 34

Notions complémentaires : fichiers Manipulés par leur nom dans l interpréteur de commandes Accès en C via un descripteur : structure contenant les informations sur l accès en cours Utilisation : Ouverture obtention d un nouveau descripteur FILE *fopen(char *nom, char *mode); Accès / Test int fscanf(file *f, char *format,...); int fprintf(file *f, char *format,...); int feof(file *f); Fermeture libération des ressources int fclose(file *f); 16 / 34

Exemple : lecture et affichage d un fichier #include <stdio.h> int main(int argc, char *argv[]) { FILE *fichier; char c; } if (argc > 1) { fichier = fopen(argv[1], "r"); if (fichier!= NULL) { fscanf(fichier, "%c", &c); while (!feof(fichier)) { printf("%c", c); fscanf(fichier, "%c", &c); } } } return 0; 17 / 34

Infos utiles sur les fichiers Mode : r ou w, mais d autres existent En cas d erreur d ouverture, utiliser perror void perror(char *message); Descripteurs ouverts par défaut : stdin : entrée standard (clavier) stdout : sortie standard (écran) stderr : sortie d erreur standard (écran) 18 / 34

Exemple : écriture dans un fichier #include <stdio.h> int main() { FILE *fichier; char c; } fichier = fopen("toto.txt", "w"); if (fichier!= NULL) { scanf("%c", &c); while (!feof(stdin)) { fprintf(fichier, "%c", c); scanf("%c", &c); } } else { perror("erreur à l ouverture"); } return 0; 19 / 34

Extension 1 : lecture/écriture binaire R doit être en binaire (valeurs 0 et 1 codées sur un bit) Problème : l élément minimal géré avec les fichiers est l octet Solution : mise en tampon grouper 8 bits dans un tampon de 1 octet (type char) void ecrire (FILE *f, Tampon T, char b) : ajouter le bit b à T (ex: en décalant T à gauche et en plaçant b en bit de poid faible de T) si T est plein, écrire l octet correspondant dans f char lire (FILE *f, Tampon T) : si T est vide, lire T depuis le fichier lire le prochain bit de T (ex: bit de poids fort puis décaler T à gauche pour l accès suivant) Attention : Les bits doivent être relus dans le même ordre que lors de l écriture (comme dans l exemple donné) 20 / 34

Lecture/écriture binaire (suite) Idéalement, il faut encapsuler la gestion du tampon : définir une structure BINARY FILE fonction d ouverture pour obtenir un BINARY FILE à partir d un descripteur de fichier fonctions d accès, test et fermeture Problème pour les séquences de bits non multiples de 8 : définir une séquence d échappement (ex: 0xFF) Fin de la séquence : 0xFF suivi du nombre de bits restant et du tampon incomplet Lors de l écriture de 0xFF, le coder par 0xFFFF et en tenir compte lors de la lecture 21 / 34

Extension 2: compression à la volée Inconvénient de la sol. statique : le codage nécessite 2 parcours de S Une approche dynamique : construire Freq lors du codage! initialiser Freq avec une valeur identique pour chaque élement de A (f i = 1/ A ) et construire un arbre initial pour chaque nouvel élément e de S : coder e à l aide de l arbre courant mettre à jour Freq construire un nouvel arbre à partir de Freq Rq : l algo de décodage suit le même principe (reconstruction de l arbre après chaque caractère décodé) 22 / 34

Contenus adaptés à la compression RLE Tout contenu comprenant une suite d octets identiques : Sources en divers langages : indentation (espaces + tab) Plages uniformes d images en format sans compression maxi 1 octet/pixel : niveaux de gris/couleurs 8 bits.o et exécutables : section data (valeurs initiales nulles) et champs à 0 dans tables. Pages de mémoire partiellement vides : des 0 à la fin. 23 / 34

Run Length Encoding : principe Une suite de 15 octets consécutifs identiques dans une séquence de 16 caractères : S = abbbbbbbbbbbbbbb ( a et 15 fois b ) peut être réduite à 3 octets : S = a, b,#, 14 Le 1 er octet des octets identiques : b un marqueur spécial : # indiquant une répétition un nombre de répétitions : 14 (octet : max< 255) séquence trop longue = suite de séquences courtes. 24 / 34

Choix du marqueur de répétition Cas simple : fichier de texte (ASCII, iso-latin1, utf8,... ). utiliser pseudo-caractères (contrôle affichage ou télécoms). Exemple : codes Ctrl-Q/Ctrl-S de contrôle de flux Xon/Xoff codes ASCII 0x17 (DC1/Xon) et 0x19 (DC3/Xoff) Cas général : contenu binaire quelconque, toutes les valeurs d octets peuvent faire partie du contenu. Méthode simple : [x,x,n] représente [x,..., x] (n+2 fois x) deux octets consécutifs identiques = marqueur spécial. 25 / 34

Exemples s1= abbbbcdddeffg0h et s2= abcdeeegga 0 : caractère 0, 0 : entier 0 (nb répétitions) a b b b b c d d d e f f g 0 h rle a b b 2 c d d 1 e f f 0 g 0 h a b c d e e e g g a rle a b c d e e 1 g g 0 a 26 / 34

Taux de compression selon longueur n codé sur b 8 bits (1 octet): nmax = 2 b 1. 3 octets RLE xxn encodent séquence x... x (L=n+2 fois). L=1 : (noir ) codage RLE sur 1 octet (0%) L=2 : (rouge) codage RLE sur 3 octets (perte 1, 50%) L=3 : (vert ) codage RLE sur 3 octets (0%) L=4 : (jaune) codage RLE sur 3 octets (gain 1, 25%) L=5 : (jaune) codage RLE sur 3 octets (gain 2, 40%) bits de n (b) 2 3 4 5 6 7 8 nmax (2 b 1) 3 7 15 31 63 127 255 Lmax=nmax+2 5 9 17 33 65 129 257 Gain (%) Lmax 3 Lmax : 40 67 82 91 95 98 99 27 / 34

Optimiser les séquences de longueur 2 Inconvénient de marqueur = 2 valeurs identiques : nb séquences (s,n=2) > nb séquences (s,n>2) peut donner longueur(rle(s)) > longueur (s) Objectif : optimiser le codage des séquences xxy (x y). coder répétitions sur 7 bits suffit (gain maxi 98%) n > 0 : code de x... x (>2 fois) n < 0 : code de xxy avec y dans E avec Card(E) = 2 7. n = 0 : code de xx Plus de perte sur xxy pour 50% des valeurs possibles de y 28 / 34

Historique de taille limitée Choisir E tel que y E pour un maximum de xxy : 1 Sans information : choix statique, programmation simple Ex : pari sur ASCII (E = [0,127]). 2 Avec information déjà accumulée : pari sur des valeurs déjà vues historique Principe d un historique de taille limitée : Card(E) valeurs, un exemplaire (le + récent) de chaque de la séquence ou de rle(séquence), numérotées de la plus récente (0) à la plus ancienne (Card(E)-1) inclure ou non nb répétitions : histo(s) ou histo(rle(s)). 29 / 34

Exemples : historique de s1, rle(s1), s2, rle(s2) Lors du codage de xxy, on cherche y dans l historique de la partie de séquence déjà traitée (terminée par xx). Au final : 8 7 6 5 4 3 2 1 0 a b b b b c d d d e f f g 0 h 11 10 9 8 7 6 5 4 3 2 1 0 a b b 2 c d d 1 e f f 0 g 0 h 5 4 3 2 1 0 a b c d e e e g g a 7 6 5 4 3 2 1 0 a b c d e e 1 g g 0 a 30 / 34

Application de RLE avec historique Exemple d utilisation de l historique sur la séquence RLE. Comparaison de rle sans (s) et avec (a) historique. (s) a b b 2 c d d 1 e f f 0 g 0 h (a) a b b 2 c d d 1 e f f 0 g 0 h n = 0 : la lettre g n appartient pas à l historique (s) a b c d e e 1 g g 0 a (a) a b c d e e 1 g g -6-6 -5-4 -3-2 -1 0 n<0 : la lettre g est dans l historique au rang n =6 31 / 34

A faire impérativement! version de base du codage de Huffman version statique S et R dans des fichiers Ascii évaluation sur divers formats de données (HTML, source de programme, binaire, images, etc.) comparaison des taux de compression obtenus 32 / 34

Diverses extensions à la carte... lecture/écriture binaire compression à la volée RLE sans et/ou avec historique combinaisons Huffman / RLE compression à partir de mots compression d images évaluation de ces diverses extensions 33 / 34

Choix du sujet... Richesse et importance du problème historique, codage, compression... Difficultés graduées réussite et challenge (moteurs) Appel à des compétences différentes programmation, analyse, Travail en autonomie support adapté 34 / 34