Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[Tous langages] Les compressions (partie 1)


Information sur le tutorial

Catégorie : Date de création : 07/08/2004 13:59:31 Vu : 27 610 fois

Note :
7,87 / 10 - par 15 personnes
7,87 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (39)
Ajouter un commentaire et/ou une note

Tutorial

Les Compressions - Partie 1

Depuis quelques années, et malgré l'évolution incessante des supports informatiques, les capacités de nos HD ayant presque décuplé en 10 ans, les mathématiques du chaos se sont introduites dans nos ordinateurs pour ne garder que les octets utiles.

WinZip, WinRar, WinAce pour ne citer qu'eux, des noms que l'on a tous au moins une fois entendu.

Ce sujet est extrèmement vaste, c'est pourquoi je vais le séparer en 3 parties, correspondant aux trois méthodes de compressions principales, que je place par ordre de popularité croissante : la compression sans perte, la compression avec perte, et les compressions composites (Deflate etc.).

Je ne développerais pas non plus les formes adaptatives ou logiques des compressions, ni les formes dynamiques, ni les codages d'ordre supérieur, ce tuto s'adresse avant tout aux débutants. Peut etre dans un un prochain article ? hehe...

Vous devez qd meme etre familier avec la notion de Bit, d'Octet (ou Byte) = 8 bits. Et savoir lire et compter couremment. En français :) donc ca ne s'adresse pas aux professionnels (Je vous passe aussi l'histoire de l'entropie de Andreï Kolgomorov, qui est qd meme à la base).

Bonne lecture :)

Partie I : La compression sans pertes

Il y a, ici aussi, un nombre immense de méthodes, je ne cite que les principales, je les développe en bas, de la plus compliqués à la plus simple :

- La compression par dictionnaire (LZW par exemple)
- La compression arithmétique
- La compression de longueur (PICT, RLE)

Toutes ces méthodes sont dites asymétriques : on met plus de temps a compresser qu'à décompresser.

Le principe : on remplace un octet ou une série d'octet par un code plus court.


1. La compression par dictionnaire

   Méthode : on utilise un "dictionnaire" de "mots" connus pour compresser, ces mots sont des séries d'octets. Il sont efficaces sur des séries qui se répètent.

   Un exemple : LZW (du nom des inventeurs, Abraham Lempel, Jacob Ziv, Terry Welch)

   PseudoCode (j'utilise & pour symboliser la concaténation, notez aussi que la syntaxe "tantque x=prochain caractère" attribue a x la valeur de chaque lettre du message):

   
tantque (k = prochaincaractere)
       {
         si (w & k) est dans le dico
             w = w & k;
         sinon
           ajouter (w & k) au dico
           sortir l'index de w dans le dico;
           w = k;
       }

   Ce qui donne, sur la chaine WABWAAWAAA par exemple (le dico contient les 255 caractère ascii de base, c'est pourquoi on compte à partir de 256) :

   
w      k         sortie      index      dico
  -      W                  
  W      A         W           256        WA
  A      B         A           257        AB
  B      W         B           258        BW
  W      A
 WA      A         <256>       259        WAA
  A      W         A           260        AW
  W      A
 WA      A
WAA      A         <259>       261        WAAA        
  A      -         A    

On obtient donc, a partir du message WABWAAWAAA (10 octets) le message WAB<256>A<259>A (en considérant que les codes tiennent sur 1 octet de 9 bits, 8+8+8+9+8+9+8 = 58 bits = 7,25 octets mais les octets c'est entier, donc 8 octets)

Pour décompresser, la méthode est encore plus simple (donc plus rapide)

PseudoCode :

   lire un caractère k;
   afficher k;
   w = k;
   tantque ( k = prochain caractère/code )    
       {
         entrée = index de k dans le dico;
         affichée l'entrée;
         ajouter w & entrée[0] au dictionnaire;
         w = entrée;
       }

Je précise que entrée[0] représente le premier caractère de la chaine entrée.
Donc si on décode ce que l'on a plus haut :

   w      k         affichage      index      dico
  -      W         W
  W      A         A              256        WA
  A      B         B              257        AB
  B      <256>     WA             258        BW
  <256>  A         A              259        WAA
  A      <259>     WAA            260        AW
  <259>  A         A              261        WAAA
  A      -         

Remarquez que l'on retrouve le meme message (ca vaudrais mieux quand meme :p) mais également le meme dictionnaire...

Evidemment cette méthode a ses failles, si on a + de 256 combinaisons, et qu'on ne peut pas utiliser + de 9 bits pour un code, on peut remettre à 0 le dico et continuer, a condition que le décodeur remette à zéro son dico aussi...

La principale faiblesse de ces méthodes (LZ77, LZ78 et toute la série des LZ...) est qu'elles s'appliquent avant tout sur des données qui se répètent. Mais quand il s'agit de caractères qui se répètent, ces codes ne les compressent pas bien (essayez de compresser AAAAAAAAAAA, LZ77 vous donnerais A(-1;1)(-2;2)(-4;4)...) les données doivent etre en ligne, on compressera mieux WAWAWA que AWWAAW.

on a donc...

2. Les compressions Arithmétiques

Il existe deux principales compressions arithmétiques

L'une des plus celebre est la compression dite de Huffman (de l'inventeur David Huffman, 1952, aussi appelée compression CCITT). L'autre, est une étude des probabilités.

2.1. La compression statistique

La méthode : Prenons un texte, a tout hasard, BILL GATES...
Calculons, sur un intervalle entre 0.0 et 1.0 la probabilité que chaque lettre apparaisse :

B = 0.1
I = 0.1
L = 0.2
(espace) = 0.1
G = 0.1
A = 0.1
T = 0.1
E = 0.1
S = 0.1

On va maintenant attribuer un ensemble de probabilités croissantes aux lettres (soit p la probabilité, l'ordre des lettres n'a pas d'importance, le tout etant que le décodeur ait la meme table):

(espace)   0 <= p < 0.1
A          0.1 <= p < 0.2
B          0.2 <= p < 0.3
E          0.3 <= p < 0.4
G          0.4 <= p < 0.5
I          0.5 <= p < 0.6
L          0.6 <= p < 0.8
S          0.8 <= p < 0.9
T          0.9 <= p < 1.0

Puis on utilise l'algorithme de compression (pseudocode, attention, ce n'est pas du C, d'ailleurs il faut remplir les tableaux high_range et low_range et la variable nChars)

int nChars;                (nombre de lettres, ici 9)
float low_range[nChars];   (bornes inférieures de l'ensemble pour chaque lettre)
float high_range[nChars];  (bornes supérieures de l'ensemble)
char c;

low = 0.0;
high = 1.0;

tantque (c = prochaincaractère) {
   range = high - low;
   high = low + range * high_range(c);
   low = low + range * low_range(c);
}

Ce qui donne :



On doit donc transmettre un code entre 0.2572167752 et 0.2572167756
Pour le décodage, on procède comme suit :

Le code est entre 0.2 et 0.3, donc la 1ere lettre est B. On soustrait au code la valeur de la borne inférieure de l'espace de B, puis on divise le code par l'intervalle de probabilité de B (0.3-0.2 = 0.1)... Ce qui donne :

Code           Lettre       Nouveau code      Intervalle
0.2572167752 = B         => 0.572167752       0.1
0.572167752  = I         => 0.72167752        0.1  
0.72167752   = L         => 0.6083876         0.2
0.6083876    = L         => 0.041938          0.2
0.041938     = (espace)  => 0.41938           0.1
0.41938      = G         => 0.1938            0.1
0.1938       = A         => 0.938             0.1
0.938        = T         => 0.38              0.1
0.38         = E         => 0.8               0.1
0.8          = S         => 0                 0.1

Quand on a atteint 0, la décompression est finie. Meme si cette méthode est séduisante et peut se révéler efficace, elle possède des faiblesses évidentes : plus le message est long, plus il y a de décimales (on a alors pensé utiliser des entiers, mais on reste limité)...

2.2. La compression de Huffman (non, pas Oeuf Man)

Prenons un texte (grande littérature) : ABCBBAC
Nous n'avons que trois lettres, et aucune suite redondante (donc LZ.. n'aura aucune efficacité).

La méthode : on attribue à chaque caractère présent un code binaire. L'avantage c'est que l'on a maximum 256 caractère, donc la taille maxi d'un code est de 8 bits, autrement dit, dans le pire des cas, on obtient la meme taille qu'au départ.

Pour calculer le code binaire d'un caractère, on utilise l'arbre de Shannon-Fano, ou arbre de Huffman :



En divisant successivement en 2 et en ajoutant en fonction du coté, par convention 0 à gauche, 1 à droite, le bit, on obtient des codes pour chaque caractère :

   A : 00
   B : 01
   C : 10
   D : 11

Soit ici, deux bits par caractère. Si on prend le message ABCDDCBA, incompressible avec LZW, on obtient un code de 2+2+2+2+2+2+2+2 (=8×2) = 16 bits soit 2 octets. On a un ratio de (8-2)/8 = 3/4 = 75% de compression (pas mal hehe)

En fait, il faut préciser au programme qui va décompresser à quoi correspondent ces codes, cad rentrer "code = caractère" pour chaque code ... Donc dans la réalité on n'aura pas 75% de compression sur un message aussi court

Mais qu'en est-il de notre AAAAAA ? On le coderait comme une série de 0000... mais on peut faire mieux, non ?

3. Les compressions de longueur

Elles ont une efficacité plus marquée sur les séries d'octets, mais peuvent doubler la taille du fichier si les données sont trop différentes...

Un exemple, RLE (Run Lenght Encoding).
La méthode : on replace chaque octet par un couple d'octets.

Exemple : AAAAABBBCCC      [11 octets]
RLE : (A, 5)(B, 3)(C, 3)        [6 octets]

Hehe oui là ca marche, mais la :

Texte : ABCDEFG                                          [7 octets]
RLE    : (A,1)(B,1)(C,1)(D,1)(E,1)(F,1)(G,1)       [14 octets]

Là on ne compresse plus rien... C'est pourquoi ces méthodes ne sont utilisées que lorsqu'elles sont nécessaires (notemment pour le JPEG) et que les compresseurs "publics" comme WinRar ou WinAce ne les utilisent pas.

Le Pixel-Packing, utilisé dans le format d'image PICT d'Apple, consiste à condenser les données, en écrivant par dessus les 0 à droite le début de l'octet suivant :

un octet : [00011100]
le suivant : [11111110]
alors on aura : [000111|11] [111110--]]

(On ne gagne que 2 bits) et pour savoir où les bits sont ainsi juxtaposés, le fichier contient un index... donc on ne gagne pas grand chose...

Fin de la partie 1
Prochaine partie : La compression avec perte

Un grand merci à MM. S.Maadi, Y. Peneveyre, et C. Lambercy...
Pour plus d'info, le site de Mark Nelson : http://www.dogma.net/markn/
signaler à un administrateur
Commentaire de Lucyberad le 13/06/2005 00:23:24

salut, ton tuto a l'air plutot compliqué...
du moins j'utilise une choses tout a fait differente:
avec vs2005, y'as un systeme de compression integré, je m'explique:
afin de savoir comment se servir des systeme de compression, y'as une e-demos (une video quoi) des dev days 2005 (sur le site de microsoft). voici le lien:
https://www.microsoft.com/france/msdn/devdays2005/edemo/Compresser_vb.mspx

je ne suis pas la pour devaloriser ton tuto, (loin de la) mais comme tu le dit dans le mots "evolution" je vien prevenir que de nouvelle thecnique ont été creer pour simplifier la vie, neanmoins j'ai lu ton tuto et il m'as permis de comprendre plus sur la facon de compresser.
donc j'estime que ton tuto est utile mais depassé
voila @+
L U C Y I3 E R @ D

ps: 7/10 pour le tuto

signaler à un administrateur
Commentaire de Chimon2005 le 16/06/2005 11:43:01

Moi je l'aime bien ce tutorial. On sent une certaine matrise du sujet. Pour rebondir sur lucyberad, je ne pense pas que ces methodes soient dépassées, mais plutot qu'elles se voient rendus plus ou moins efficaces en fonction des nouvelles technologies, et des types de fichiers à compresser.
Bon boulot, et la 2eme partie ? ;D

signaler à un administrateur
Commentaire de Didier_S le 20/06/2005 18:45:27

Je suis pas d'accord avec Lucyberad, ce tutorial est plus "théorique" que pratique, il explique les bases des principales méthodes de compression... Pas forcément *utile* pour programmer, mais il est toujours bon de comprendre un peu ce que font les fonctions que l'on emploie !

signaler à un administrateur
Commentaire de Lucyberad le 20/06/2005 22:24:00

afin de stopper net toute mauvaise interpretation de mon commentaire; j'en remet ici, afin de dire exactement la meme chose que didier, je ne devalorise en aucun cas le tutoriel ! je dit juste que les moyen plus recent sont disponible afin d'utilkiser la compression (c'est a but informatif) cepandant ce tutoriel a l'avantage d'expliquer profondement et de savoir ce qu'il se passe lorsque on utilise ce moyen rapide ! de plus, ce tutorial non seulement permet de comprendre comment s'effectue une compression mais en plus, permet de faire une version beaucoup parametrable !
je suis donc dsl pour tous ceux qui pensait avoir cru que je denigrait cette excellente source. Je ne postait ce nouveau moyen (qui n'existait pas a l'epoque de l'ecriture du tutorial) que dans le but d'etre INFORMATIF !
encore merci désolé pour avoir mal formulé mon precedent commentaire
@+
Lucyberad

signaler à un administrateur
Commentaire de PuddingStud le 11/07/2005 16:52:39

Tuto très intéressant mais niveau présentation : manque de vrais tableaux ! Les colonnes sont de traviole | / | ( ] \ !

signaler à un administrateur
Commentaire de MadM@tt le 02/08/2005 22:03:59

Euh à un moment j'ai lu : "en considérant que les codes tiennent sur 1 octet de 9 bits"
1 octet c'est 8 bits, m'enfin c'est juste un bout du texte que j'ai lu au hasard donc si ça se trouve c'est justifié par la phrase d'avant ...

signaler à un administrateur
Commentaire de Francky23012301 le 06/08/2005 22:40:38

Perso je n'aime pas ton tutorial. Il donne mal à la tête si je peux me permettre. Etant enseignant de formation il faut prendre son temps pour transmettre un savoir : tu es trop direct et beaucoup trop théorique. Je te fais un cours de chimie quantique avec la méthode AB initio (allez sur google vous allez comprendre ce que l'on appelle un algorithme en math lol) sans que tu es la base de la mécanique quantique (fonction d'onde, densité de probabilité de présence de trouver un électron bla bla bla bla) tu va rien comprendre à mon cours. C'est exactement ce qui se passe la. Retravaille le et améliore le.

Bon courage

PS : l'idée est bonne de faire un cours la dessus

signaler à un administrateur
Commentaire de deedo le 16/08/2005 17:58:50

Enfin !! Quelqu'un qui donne un exemple clair de la compression LZW. On l'avait aborde en cours mais je n'avais pas saisi les subtilites du dictionnaire.
Merci pour ce tutorial.

signaler à un administrateur
Commentaire de c3rb3r3 le 25/08/2005 19:22:40

Très agréable, merci bien pour le mal que tu t'es donné à rédiger ceci.

Interessant à souhait pour ceux qui apprécient plus les théories que la pratique. Francky il ne va tout de même pas ré-écrire toutes les bases necessaires à la compréhension du sujet, c'est quand même un minimum que de se renseigner par soit même avant de se lancer dans la lecture.

Bonne continuation pour la suite.

signaler à un administrateur
Commentaire de zippro4012 le 06/09/2005 12:52:46

9/10. C'est un très bon tutorial.
Mais à quand la 2ème partie ?

signaler à un administrateur
Commentaire de psycho81 le 15/11/2005 15:44:27

Si tu le souhaite vlad2i, je peux te donner un coup de main pour certain aspect de la compression car je travaille actuellement sur un algo de compression BWT+MtF+Ari Binaire (sur VBFrance cependant, acessible dans mon profil). Une fois fini, je le ferai migrer sur delphifr. Si ca t'interesse ...

Bonne prog

signaler à un administrateur
Commentaire de M_Psyco_FranK le 17/12/2005 02:14:08

C'est Super!!!
C'est le seul tutoriel sur la compression qui explique presque exactement comment se passe la compression et la décompression que j'ai trouvé.
Et en plus j'ai compris!! Bon... C'étais la dixième fois que je le lisais mais avant je ne connaissais pas les probabilité (on l'a apprit cette semaine à l'école) juste un chose: je comprend po encore comment fonctionne le dictionnaire pou le LZW mais cela ne devrais plus tardé... J'ai hâte de voir la prochaine partie et encore plus de la comprendre let'go té ben partie!! (expression québecoise)

En gros c'est un très beau tutoriel bien expliqué.

ET désolé pou les erreure d'orotgrafe...

signaler à un administrateur
Commentaire de zippro4012 le 17/12/2005 11:35:04

Dsl mais vlad2i nous a fait savoir par message privé qu'il ne rédigerait finalement pas la 2ème partie...

signaler à un administrateur
Commentaire de blinix123 le 08/04/2006 00:34:35

Le tuto a l'air complet oui, mais bon la difficulté...aie,la transmission de ton savoir est assez direct XD,un tuto c'est aussi faire pour les débutants principalement je pense...! va falloir qu'il s'accroche, mais sinon c'est bien ^^

signaler à un administrateur
Commentaire de Forman le 22/04/2006 01:37:57

Restons dans le théorique (désolé pour les candidats à la migraine facile, apparemment il yen a ici           ;-).

ce qui suit est la démonstration du théorème suivant:
"TOUTE METHODE DE COMPRESSION SANS PERTE DE DONNEES NE COMPRESSE EN MOYENNE RIEN DU TOUT"

Appelons E(n) l'ensemble des fichiers qui font au plus n octets.

TOUTE méthode de compression sans perte de donnée (par exemple zip, rar mais pas jpeg ou mpeg) réalise une bijection de l'ensemble des fichiers (non compressés) vers l'ensemble des fichiers (compressés). Ce que je veux dire par là, c'est que tout fichier est compressable, et tout fichier (compressé) est décompressable, et que pour tout fichier (pour une méthode donnée) il y a un et un seul fichier compressé qui lui correspond, et réciproquement, tout fichier compressé se décompresse en un unique fichier.

Ce que je viens d'écrire est évident, mais considérons maintenant notre ensemble E(n) du début. Un théorème (facile à comprendre) lié à la notion de "bijection" est que si 2 ensembles finis A et B sont mis en bijection par une fonction quelconque, alors ils ont le même nombre d'élément (je pense que ce théorème date à peu près de l'homme de cro-magnon quand il a inventé les nombres). Exemple: un troupeau de mamouths passe devant moi, pour chaque mamouth je met un caillou sur une pile, lorsque le troupeau est passé, je sais qu'il y a autant de cailloux que de mamouths. Hahem...

Prenons une méthode quelconque de compression sans perte de donnée, et appelons-la Compress(f) où f est un fichier, et Uncompress(f) la fonction de décompression associée. Pour tout fichier f, Uncompress(Compress(f))=f (c'est une façon mathématique de définir une bijection).

Maintenant (promis c'est la dernière notation), si j'appelle C(n) l'ensemble des fichiers de au plus n octets qui ont été compressés (c'est à dire l'ensemble des Compress(f) où f est un fichier de E(n)) alors, le théorème de la bijection (celui qui date de cro-magnon) me dit que E(n) et C(n) ont le même nombre d'éléments M (c'est à dire un peu plus que 256^n, mais peu importe, la valeur exacte est M=(256^(n+1)-1)/255 pour ceux que ça intéresse).

Quelle est la brillante conclusion de ce raisonnement néolithique? Eh bien...
Parmi tous les ensembles de fichiers qui comportent M fichiers, celui dont les éléments (c'est à dire les fichiers qui le composent, j'espère que vous suivez toujours) sont de taille moyenne minimale est... E(n)!!!

Ca veut dire que, au mieux, TOUTE méthode de compression sans perte de données NE COMPRESSE PAS!!!

Pour ceux qui n'ont pas fait de maths ou qui ne maîtrisent pas du tout la théorie des ensembles ou encore qui n'ont pas lu ce qui précède, je leur garantis que c'est vrai, et qu'en plus c'est une démonstration élémentaire (voire néholitique, décidément...)

En bref, WinZip, Rar ou poil de ### LZW ne compressent en moyenne pas du tout. L'idée, c'est que pour certains fichiers, la compression va RAJOUTTER de la longueur (incroyable mais VRAI)!!! Pour vous en convaincre, essayez de zipper 10 fois de suite le même fichier. A la fin, la taille augmente...

Voilà, je tenais juste à dénoncer l'imposture intellectuelle la plus flagrante du siècle. Désolé pour ceux qui ont acheté WinZip!!!




;-)

signaler à un administrateur
Commentaire de MadM@tt le 22/04/2006 13:51:24

J'ai adoré la démonstration mathématique :D, j'avais jamais vu une telle adaptation des maths (pourtant des maths j'en vois en ce moment)
Par contre j'ai bloqué tout à la fin... J'ai compris tous tes ensembles et tout, le nombre de fichier ok, mais dans la toute dernière partie :
"Quelle est la brillante conclusion de ce raisonnement néolithique? Eh bien...
Parmi tous les ensembles de fichiers qui comportent M fichiers, celui dont les éléments (c'est à dire les fichiers qui le composent, j'espère que vous suivez toujours) sont de taille moyenne minimale est... E(n)!!!"

Comment tu le sais ? Comment tu le démontre ? Enfin j'ai perdu le fil à ce moment je ne sais pas comment tu peux affirmer cela.
En tout cas c'est vrai que certains fichiers ne sont pas compressibles (ceux déjà compressés ou même d'autres),  mais tu me fera difficilement croire que Winrar ne compresse pas presque tous les fichiers... Enfin après, mathématiquement, peut etre que la moyenne de tous les fichiers compressés montre que finalement en moyenne il n'y a pas de compression, mais ça me semble quand meme loin de la réalité...

Voilà si tu avais le temps de m'expliquer ce petit passage que j'ai pas compris merci ;)

signaler à un administrateur
Commentaire de shry le 22/04/2006 14:27:25

Ahem...

En tant que matheux je me permet de dénoncer la fausseté aussi bien que j'affirme le contraire des conclusions de Forman :) Ce qui suit est la démonstration de ce que je viens de dire :

"TOUTE méthode de compression sans perte de donnée (par exemple zip, rar mais pas jpeg ou mpeg) réalise une bijection" : c'est une erreur naïve : en effet, il ne s'agit pas d'une bijection, mais d'une transformation, non numérique, des données en d'autres données ayant un SENS EGAL. Autrement dit, en une description IDENTIQUE, mais à l'aide de symboles différents. Et le nombre de ces symboles peut être très petit, exemple : 111111111111111111 = "écrire 18 1" (3 symboles (ou 12 lettres) contre 18) on a bien une compression sans pertes et avec réduction du nombre de données.

"il y a un et un seul fichier compressé qui lui correspond, et réciproquement, tout fichier compressé se décompresse en un unique fichier." : vrai s'il n'existait qu'une seule méthode de compression - ce n'est pas le cas.

Donc "Ce que je viens d'écrire est évident" est infirmé : ce n'est ni vrai, ni évident.

"si 2 ensembles finis A et B sont mis en bijection par une fonction quelconque, alors ils ont le même nombre d'élément" : vrai en ce qui concerne les ensembles finis de nombres, faux pour les espaces vectoriels et faux en ce qui nous concerne avec les données descriptives.

"E(n) et C(n) ont le même nombre d'éléments M (c'est à dire un peu plus que 256^n, mais peu importe, la valeur exacte est M=(256^(n+1)-1)/255 pour ceux que ça intéresse)." : absolument faux. Si E(n) est l'ensemble des fichiers d'au plus n octets, alors il existe exactement 256^n fichiers distincts dans E(n). Mais son nombre d'éléments réels (distincts ou pas) est infini.

Enfin, le Théorème de Shannon nous démontre que, au pire, une fonction de compression renvoie le fichier de départ ou un fichier de taille équivalente. En effet, certains fichiers (cela dépend de l'algorithme de compression) ne peuvent pas être décrit de façon plus succinte que par eux mêmes.

Le fait qu'un fichier recompressé 10 fois par WinZip, WinRar ou autre soit de taille supérieure (encore que, ca dépend du fichier) est du à quelque chose de totalement différent : la nécéssité pratique. Dans une archive Zip ou Rar, on stocke : nom du fichier, taille, date... Autant d'informations qui sont rajoutée à chaque fois que l'on va recompresser une archive. D'où l'augmentation de taille. De plus, un algorithme efficace renvoie une description minimale (dans le cas idéal) du fichier d'origine, donc ne peut pas être plus compressé.

Quand à l'imposture la plus flagrante du (XXIe) siècle, c'est probablement la réélection de (put what you want here) W. (put what you want here). Ahem...

Sinon, mes félicitations à l'auteur - même si un peu plus de rigueur mathématique et de descriptions auraient été les bienvenues...

Shry

signaler à un administrateur
Commentaire de Forman le 22/04/2006 15:37:32

SHRY, laisse-moi répondre point par point à tes arguments:

1/ Une compression est une bijection. En effet, même si tu utilises plusieurs méthodes de compression en fonction des fichiers à compresser, tu vas rajoutter dans l'en-tête du fichier un octet supplémentaire (par exemple) indiquant la méthode utilisée, ou même changer l'extension du fichier. Effectivement, pour que mon raisonnement soit encore plus rigoureux, il aurait fallu considérer que  le nom du fichier fait partie des octets qui le composent. De toute façon à partir du moment où tu écris que Uncompress(Compress(f))=f pour tout f, ça me parait quand même assez clair qu'il s'agit d'une bijection, non!? (pour info c'est même la définition).

2/Deux ensembles ont le même nombre d'éléments s'ils peuvent être mis en bijection. C'est vrai pour les ensembles finis. Mais c'est aussi vrai pour les ensembles infinis, y compris pour les espaces vectoriels (lis n'importe quel manuel de théorie des ensembles, je suppose que tu ne l'as jamais fait pour écrire ça, je ne vais pas tout expliquer ici). De plus, je croyais avoir précisé que je n'utilisais ce théorème que dans le cas d'ensembles finis dans mon explication.

3/Je maintiens que M=(256^(n+1)-1)/255. En effet, il y a effectivement 256^n fichiers qui mesurent EXACTEMENT n octets. Mais pour moi, M est le nombre de fichiers qui mesurent AU PLUS n octets (il faut lire avant de critiquer!). Donc le cardinal (ie nombre d'éléments) de E(n) est la somme du nombre de fichiers qui mesurent exactement k octets pour k variant de 0 à n. C'est à dire (somme des termes d'une suite géométrique de raison q, niveau terminale S) (q^(n+1)-1)/(q-1), et si tu remplaces q par 256, tu retrouveras ma formule. Si tu ne me crois pas , considère l'ensemble des fichiers qui mesurent au plus 1 octet. Il y en a 256 (ceux composés d'un seul octet) mais il en existe encore un autre (le fichier vide), donc 256+1=257. Tu peux vérifier aisément que (256^2-1)/255=257, et donc que ta formule 256^n est fausse...

Pourrais-tu m'expliquer ce que tu entends par "Mais son nombre d'éléments réels (distincts ou pas) est infini."? L'infini est un bien vilain mot, pour l'utiliser à tort et à travers...

4/ Je te cite de nouveau:
"Enfin, le Théorème de Shannon nous démontre que, au pire, une fonction de compression renvoie le fichier de départ ou un fichier de taille équivalente. En effet, certains fichiers (cela dépend de l'algorithme de compression) ne peuvent pas être décrit de façon plus succinte que par eux mêmes."
Ce que tu écris là est en fait (presque) une autre démonstration de mon propos! En effet, imagines que tu implémentes une méthode de compression quelconque. Si tu es malin, tu va décider que lorsque tu tombes sur un fichier qui "ne peut pas être décrit de façon plus succinte que par lui-même", tu ne vas pas le compresser. Donc, tu vas rajoutter un octet au début de tes fichiers compressés pour indiquer si oui ou non il appartient à la famille des fichiers qui se compressent mal (tu es obligé, sinon, comment feras-tu la différence au moment de la décompression)? Bilan de l'opération: tu as rajoutté un octet au fichier initial, qui est donc devenu plus gros.

Mais rassures-toi, tu n'es de loin pas le premier à essayer de faire dire au brillant Shanon plus qu'il n'aurait lui-même espéré, c'est très fréquent chez ceux qui font des maths appliquées.

5/Merci pour le félicitations, je te les renvoie, ainsi que la remarque sur la rigueur mathématique.

signaler à un administrateur
Commentaire de Forman le 22/04/2006 16:09:05

MadM@tt: je vais essayer de faire simple pour démontrer que E(n) est l'ensemble dont la taille moyenne des éléments qui le composent est minimale.

Résumé de la démonstration: si tu remplaces en élément de E(n) par un autre, alors cet élément fait forcément au moins n+1 octets, donc la longueur moyenne des fichiers de ton ensemble a augmenté...


Maintenant, la démonstration "rigoureuse":

Considère un ensemble F de fichiers, qui a le même nombre M d'éléments que E(n).
Appelons I l'intersection de E(n) et de F (c'est à dire l'ensemble des fichiers de F qui sont dans E(n), ou encore l'ensemble des fichiers de F qui mesurent au plus n octets).
Maintenant, si on prend un fichier de F, il y a 2 possibilités:
-Ou bien f est aussi dans l'intersection I
-Ou bien f n'est pas dans l'intersection I, auquel cas il mesure au moins n+1 octets (sinon il serait dans l'intersection...).
Numérotons les fichiers de F, en numérotant en premier ceux qui sont dans I:
F={f1,f2,f3,f4,f5,...,f(M-1),F(M)}

Je ne sais pas si ma notation est très claire, difficile de faire mieux en "plain text". Disons seulement que j'ai donné des noms aux éléments de F, en commençant par ceux qui sont aussi dans I. Soit L le numéro du dernier fichier qui est dans I (il se peut que L=0 si E(n) et F n'ont pas d'éléments en commun, et il se peut que L=M si E(n) et F sont égaux), alors on a que:
I = {f1,f2,f3,...,f(L-1),f(L)}

J'appelle maintenant g(L+1),g(L+2),...,g(M) les fichiers qui restent dans E(n) (ceux qui ne sont pas dans I).
E(n)={f1,f2,f3,...,f(L-1),f(L),g(L+1),g(L+2),...,G(M)}
F   ={f1,f2,f3,...,f(L-1),f(L),f(L+1),F(L+2),...,F(M)}

La longueur moyenne d'un ensemble de fichiers est la somme des longueurs des éléments divisée par le nombre d'éléments:

LongeurMoyenne(E(n))=(Longeur(f1)+...+Longeur(f(L))+Longeur(g(L+1))+...+Longeur(g(M)))/M
LongeurMoyenne(F)   =(Longeur(f1)+...+Longeur(f(L))+Longeur(f(L+1))+...+Longeur(f(M)))/M

Or, on a vu que Longueur(f(i))>n pour i>L (en effet, il s'agit des fichiers qui ne sont pas dans l'intersection de E(n) et de F, donc qui sont de taille strictement plus grande que n). Par conséquent, si L<M (c'est à dire si E(n) et F ne sont pas les mêmes ensembles), alors:

LongeurMoyenne(F)>LongeurMoyenne(E(n))

Par conséquent, E(n) est bien l'ensemble de fichier à M éléments dont la longueur moyenne est minimale, puisque pour tout ensemble F différent de E(n) qui a le même nombre d'éléments on a démontré que LongeurMoyenne(F)>LongeurMoyenne(E(n))

CQFD

signaler à un administrateur
Commentaire de shry le 23/04/2006 04:25:27

Je vous prie de m'excuser par avance puisque ce n'est pas censé être la place d'un débat, mais j'insiste :) Et vais reprendre dans l'ordre ou tu les donnes tes arguments.

1. Il ne s'agit pas d'une fonction numérique non récursive traitant d'ensembles finis, donc le terme bijection est ici inapproprié : les données renvoyées pour un octet x du fichier dépendent des données avant et après x, et non pas seulement de x comme c'est le cas pour une fonction numérique non récursive.

2. En théorie, on ne peut parler du "nombre" d'éléments que lorsqu'il est fini... Quoique je vais suivre ton conseil et vérifier.

3. J'ai un peu réfléchi avant d'affirmer mon 256^n. En effet, un fichier de 3 octet peut également être décrit comme un fichier de n>3 octets, comblé avec des zéros. Donc tous les fichiers d'au plus n octets sont descriptibles de façon équivalente à des fichiers de n octets exactement, et sont donc inclus dans l'ensemble des fichiers de n octets. Leur nombre devrait donc être 256^n.

4. "Si tu es malin, tu va décider que lorsque tu tombes sur un fichier qui "ne peut pas être décrit de façon plus succinte que par lui-même", tu ne vas pas le compresser. Donc, tu vas rajoutter un octet au début de tes fichiers compressés pour indiquer si oui ou non il appartient à la famille des fichiers qui se compressent mal (tu es obligé, sinon, comment feras-tu la différence au moment de la décompression)? Bilan de l'opération: tu as rajoutté un octet au fichier initial, qui est donc devenu plus gros."

Et... si je suis vraiment malin, je ne le fais pas, et me contente de rajouter quelques octets au début d'un fichier que je sais pouvoir compresser :) Comme ca, si les quelques octets qui me disent que mon fichier est compressé sont absents, c'est qu'il ne l'a pas été :).

Mais je comprends que le théorème de l'entropie de Shannon soit difficile à percevoir, il est néanmoins très interessant.

Quant aux félicitations, je les adressais avant tout à l'auteur du tutoriel - mais bien sur je ne peux qu'apprécier un discours mathématique :).

Par contre, ta seconde démonstration présente quelques failles (uniquement pour mieux la comprendre, puisqu'elle m'a l'air juste - sans plus de vérifications) :

* "La longueur moyenne d'un ensemble de fichiers est la somme des longueurs des éléments divisée par le nombre d'éléments:" faux : la longueur moyenne d'UN FICHIER :)

* "Soit L le numéro du dernier fichier qui est dans I " : qu'est ce que le "numéro" ? l'index ? le dernier fichier = le fichier de plus grande taille ? mais si les fichiers de I = F inter E(n) ne se suivent pas tous ou ne sont pas rangés dans le même ordre que dans F ?

l_moyenne_E = 1/M * somme de 0 à M sur i de longueur(fichier(i))...
l_moyenne_F = 1/M * somme de 0 à M sur j de longueur(fichier(j))...

Ton idée, me semble-t-il, est de trouver les éléments de F de taille au plus égale à ceux de E pour minorer la somme. Mais le théorème de Shannon (que je l'aime bien lui) nous affirme que tout programmeur doué d'un minimum de bon sens ne renverrait jamais un fichier de plus de n octets, donc F est inclus dans E, donc I = E et l_moyenne_E <= l_moyenne_F. Donc je ne vois pas ce que prouve ta démonstration.

(Enfin moi je dis ca... ca vaut autant que si c'était un autre...)
Bonne conti(nuit)ation !

Shry

signaler à un administrateur
Commentaire de shry le 23/04/2006 04:29:53

Oops, veuillez m'excuser pour les deux messages ci dessus. Je me permet juste de m'autocorriger :

" [...] fichier de plus de n octets, donc F est inclus dans E, donc I = F (et pas E) et l_moyenne_E => l_moyenne_F (et pas <=). Donc je ne vois pas ce que prouve ta démonstration.

Shry

signaler à un administrateur
Commentaire de Forman le 23/04/2006 14:47:01

Bon, ok, pour couper court à toute discussion sans fin, je t'invite à aller voir ce document (attention à garder les majuscules dans l'adresse):

http://www.eleves.ens.fr/home/feuvrier/Delphi/Compress.pdf

Ca a beaucoup fait rire mon ancien prof de logique formelle, et il m'a confirmé que c'était parfaitement juste (mais peut-être que tu t'estimes plus compétent que lui!? après tout il n'est que directeur de recherche au CNRS...) J'ai aussi fait le DEA de Cachan en Mathématique/Vision/Apprentissage alors laisse-moi te dire que le théorème de Shanon, je sais ce qu'il signifie, et je sais aussi ce qu'il ne signifie PAS.

Donc cette fois-ci, si tu es vraiment "matheux" comme tu le prétends (moi je ne suis qu'un modeste normalien en thèse de maths, et je n'ose pas encore appliquer cet adjectif à moi-même) tu ne pourras plus avoir l'excuse de ne pas avoir compris mes notations, tout y est expliqué en détails.

Peut-être alors retireras-tu les affirmations suivantes:

-Et... si je suis vraiment malin, je ne le fais pas, et me contente de rajouter quelques octets au début d'un fichier que je sais pouvoir compresser :) Comme ca, si les quelques octets qui me disent que mon fichier est compressé sont absents, c'est qu'il ne l'a pas été :).

Oulàlà... et comment tu fais pour après déterminer si les premiers octets de ton fichier à décompresser sont absents? tu fais un trou dans la disquette? tu les barres au crayon sur le disque dur? tu utilises tes crayons de couleur? Je me disais, si tu rajouttes l'en-tête "COMPRESSE" au fichier lorsque tu utilises la méthode, tu fais comment dans le 2ème cas si ton fichier "incompressable" commence justement par les caractères "COMPRESSE"? tu rajouttes un ch'ti en-tête en plus qui s'appelle "PASCOMPRESSE"? Oui mais alors, et si le fichier original commmence par "PASCOMPRESSE", tu fais comment? Tu utilises l'en-tête "PEUTETREBIENCOMPRESSE"? lol!

-La longueur moyenne d'un ensemble de fichiers est la somme des longueurs des éléments divisée par le nombre d'éléments:" faux : la longueur moyenne d'UN FICHIER :)

Sérieusement, c'est quoi la longueur moyenne d'UN FICHIER? Est-ce que ça te choque vraiment de dire que la longueur moyenne c'est la moyenne des longueurs, ou est-ce que c'est juste pour m'embêter?

-J'ai un peu réfléchi avant d'affirmer mon 256^n. En effet, un fichier de 3 octet peut également être décrit comme un fichier de n>3 octets, comblé avec des zéros.

Désolé, je crois que j'ai quand même plus réfléchi. Recomptes! (Il est évident que le mot "111" est égal au mot "1110", n'est-ce pas? Au fait, les zéros, tu les mets à gauche ou à droite? lol)

J'arrête là (je pourrais continuer encore!), mais dans tous les cas merci de m'avoir fait autant rire. A partir de maintenant je ne réponds plus qu'aux remarques pertinentes.

Forman

signaler à un administrateur
Commentaire de shry le 24/04/2006 17:14:03

Salut !

Loin de moi l'idée de contester tes capacités, j'essaie jsute de comprendre (et il est vrai, de contester, mais par pure idée de progresser) ce que tu dis. Je suis heureux d'avoir pu te faire rire. D'ailleurs, après avoir lu ton texte (ce qui éclaircit de beaucoup ce que tu dis, soit dit en passant), je pense avoir dit de grosses bêtises et la démonstration de ton théorème concernant les valeurs moyennes d'ensembles de même cardinal est, sinon évidente, enfin comprise par mon esprit naïf (encore que je me demande s'il ne serait pas possible de placer {01, 01, 01, 01} dans F4...). Ce qui, néanmoins, pourrait faire rire un professeur de logique formelle, c'est d'assimiler une propriété numérique à un descripteur sémantique. Rien ne prouve en effet que l'ensemble obtenu après compression ne soit pas intégralement compris dans Fn (puisque deux fichiers pourraient être compressés en deux suites de donnée identiques et de taille inférieure à n, on pourrait supposer que les éléments de Compress ne soient pas uniques et inclus dans Fn). Si je puis me permettre de te laisser ce raisonnement en pâture (pour que, s'il te plait, tu le remette à sa place) :

Deux fichiers F1 et F2 sont compressés f1 et f1 (ie deux fois de la même façon). Si la fonction de compression/décompression était une bijection, Uncompress{f1,f1} donnerait F1 et F1 (ou F2 et F2 de façon équivalente). Mais le fait est que {f1, f1} est différent de {f1} (ou du moins, il serait possible de les considérer différents). Un algorithme de compression ou décompression adapté pourrait, du fait que le premier f1 précède le second, décoder le second d'une façon différente et obtenir F2. Je n'invente pas cela, c'est le principe de la compression LZ77 employée (aux variantes près) par WinZip. A chaque itération, on adapte la décompression (ou compression), ainsi un code C sera, une fois décompréssé (ou compressé) c, une seconde fois c', une troisième fois c''... Comment une application telle qu'une bijection pourrait elle se permettre de renvoyer deux valeurs différentes pour un même argument ?

Voilà, en espérant te faire rire (ou pas)
Shry

signaler à un administrateur
Commentaire de MadM@tt le 24/04/2006 20:06:56

Franchement, si je peux vous donner un avis exterieur ^^, ne vous prenez pas le bec !!
Chaque jour je lis vos commentaires et je trouve ça génial de réfléchir à propos d'un sujet si passionant (bon y'a plus passionant c'est vrai mais bon). Alors moi je vous dis continuez de débattre c'est vraiment constructif en tout cas et c'est pas souvent qu'on voit un débat sur Code Source constructif... Et ne vous prenez pas la tete pour autant vous avez l'air d'etre bien "balèzes" tous les 2.
Bonne continuation à vous 2 ;-)
MadMatt

signaler à un administrateur
Commentaire de Chimon2005 le 24/04/2006 21:23:35

Pour Forman:
Salut,
je trouve ça bien joli de prouver que "TOUTE METHODE DE COMPRESSION SANS PERTE DE DONNEES NE COMPRESSE EN MOYENNE RIEN DU TOUT", c'est tout mignon, ça me rappelle ma maths spé.
Mais je n'ai pas vraiment besoin de me plonger dans des longues démonstrations pour  dire que le "EN MOYENNE" donne à l'ensemble de la démonstration un caractere vain. Sinon, pourquoi utiliserait-on Winzip ou Winrar?

Je cite:
"En bref, WinZip, Rar ou poil de ### LZW ne compressent en moyenne pas du tout. L'idée, c'est que pour certains fichiers, la compression va RAJOUTTER de la longueur (incroyable mais VRAI)!!! Pour vous en convaincre, essayez de zipper 10 fois de suite le même fichier. A la fin, la taille augmente..."

Ah, ba c'est sur, y a des limites, on peut pas faire rentrer une poubelle dans une serrure comme dirait mon chien savant.

Tu ne me feras pas arreter de compresser sans perte, car empiriquement, c'est efficace.

Enfin, remarque plus personnelle(donc dont l'intérêt pour le débat est moindre).
Je re-cite: "tu n'es pas le premier à faire [... ndr: un truc pas acceptable pour quelqu'un de rigoureux], c'est fréquent chez les gens qui font des maths appliqués".
C'est un argument ad-hominem (cf wikipédia): tu as perdu toute ta crédibilité (pour moi en tout cas) en exposant ta pensée qui sous-entend que tu es intouchable car toi, tu fais des Mathématiques avec un grand 'M'; et qu'à partir de là, les autres qui font des mathématiques de bas étage n'ont pas à te tenir tête. Tu gères en maths, ça c'est clair, mais au niveau techniques d'argumentation, faudra repasser ;)


signaler à un administrateur
Commentaire de Forman le 24/04/2006 22:45:55

Pour SHRY:
Je t'assure qu'à des moments j'ai vraiment cru que c'était uniquement pour déconner que tu disais que je me trompais... En me relisant j'ai peur que tu l'aies perçu comme aggressif, je m'en excuse.

Je crois que depuis le début, on ne parlait pas de la même chose (ce qui explique pas mal de malentendus). Pour moi, quand je parle de la compression d'un ensemble de n fichiers, c'est un ensemble de n fichiers compressés où chacun des fichiers initiaux a été compressé séparément, pas une archive zip qui contiendrait les n fichiers à l'intérieur par exemple. Ceci dit, on peut adapter ma démonstration en disant que si par exemple on compresse 3 fichiers F1,F2 et F3 dans un seul fichier f.zip (j'utilise cette notation par commodité, pour toute méthode de compression qu'on a préalablement choisie), alors ce n'est qu'un cas particulier de la compression du seul fichier F123 obtenu par concaténation de F1,F2 et F3 rangés par exemple dans l'ordre lexicographique (pour avoir unicité du regroupement). Donc, en l'adaptant un petit peu, je crois que ma démonstration pourrait fonctionner aussi sur les méthodes de compression "multi-fichier".

Si ça te parait plus clair, je pourrais reformuler ainsi:
f(i) -> f(i).zip (opérateur de compression)
f(i).zip -> f(i) (opérateur de décompression)
Si on effectue la compression (séparément) sur tous les fichiers possibles f(1),f(2)...f(M) qui mesurent au plus n octets (pour un n fixé, par exemple n=3000 octets) alors on obtient M fichiers compressés: f(1).zip,f(2).zip,...,f(M).zip
Et dans ce cas, on a que:
Longueur[f(1)]+Longueur[f(2)]+...+Longueur[f(M)] est < ou = à Longueur[f(1).zip]+Longueur[f(2).zip]+...+Longueur[f(M).zip]
C'est à dire que la longueur moyenne des fichiers d'au plus n octets obtenus après compression est au moins aussi grande que la longueur moyenne des fichiers avant compression.
Ceci est une réécriture plus intuitive de la conclusion de ma démonstration.

Ceci dit, même si des données ont une sémantique associée, ce ne sont rien de plus que des mots sur un langage... c'est à dire des données numériques. On s'éloigne un peu du sujet, mais les théorèmes d'incomplétude (par exemple ceux de Gödel en logique) sont démontrés par des arguments assez proches. En effet, pour démontrer qu'il existe des propositions logiques indémontrables (càd, il n'existe pas de démonstration finie pour les démontrer, et il n'existe pas non plus de démonstration finie pour démontrer le contraire), il faut considérer le nombre de caractères nécessaires à l'écriture de leur démonstration (si elle existait)! Ce qui revient à considérer une démonstration (c'est à dire des phrases d'un langage "presque" humain) comme une suite de données numériques.



pour MadM@tt:
mea culpa pour la prise de bec, heureux que tu trouves le débat instructif. C'est vrai que depuis un moment je trouve aussi que le niveau du site baisse, pas ou peu de commentaires sur les sources postées, ou alors des gens qui demandent où télécharger Delphi (Google est donc si impopulaire?), véridique! Sans compter ceux qui laissent en commentaire sur des sources: "mais ça sert à quoi? y'a déjà un programme qui existe qui le fait!" Là aussi, véridique...




Pour Chimon2005:
Heu... bonjour!
Maintenant je fais des maths appliquées avec un petit "m", je l'ai dit dans mon message précédant. Et je ne suis pas encore assez masochiste pour considérer que je fais des maths "de bas étage". Je disais seulement que j'avais déjà vu beaucoup (trop) de profs enseigner des bêtises théoriques en maths appliquées, c'est tout, ça ne se voulait pas péjoratif pour tous les autres. En particulier, justement pour le théorème de Shanon, j'ai vu des profs affirmer le contraire-même du théorème en "utilisant" le théorème-même pour le démontrer...

Merci, je ne savais pas ce que signifiait "ad-hominem". Ceci dit, est-ce que [le fait de dire que je perds toute crédibilité parce que j'aurais utilisé une fois un argument "ad-hominem"] n'est pas en soi un argument... "ad-hominem"?      ^^
Après tout, tu considères que mon propos n'est pas recevable pour des raisons liées à une "mauvaise" action que j'aurais commise (comme utiliser un argument rhétorique fallacieux, qui n'intervient pas dans ma démonstration mathématique), or c'est à peu de chose près la définition wikipedia de "had-hominem", non?    <8=!


signaler à un administrateur
Commentaire de psycho81 le 25/04/2006 09:31:58

Pour relancer le débat sur de bonnes bases, je rapelle que depuis 1993, les meilleurs algorhytmes de compressions sont quasiment tous basé sur la méthode de Burrows couplé généralement à la méthode Move To Front et finie avec une compression arythmétique.

L'algo étant relativement nouveau, de nombreuses avancées peuvent être apportées et de nombreuses conférences ont lieu.

Tous les espoirs sont donc permis pour des algorhytmes encore plus élaborés.

signaler à un administrateur
Commentaire de shry le 25/04/2006 17:58:33

A Forman : Je suis ravi que nous soyons tombé sur un accord ! Néanmoins, on ne peux pas jeter le théorème de Shannon sous pretexte que certains "profs" sont capables de faire passer un oeuf pour un éléphant en l'utilisant. La principale différence (que je me permet d'inventer) entre descripteur sémantique et donnée numérique est que "mille 1" décrit mille "1", bien qu'il s'agisse de 2 mots, et il n'y a, a priori, aucun moyen de savoir ce que décrit "mille un" si on ne parle que le japonais - ie le descripteur n'a de sens donné (il peut en avoir d'autres) que pour un (ou quelques) algorithme(s) donné(s). Pour ce qui est d'une description mathématique développée, la chose est différente : on peut réduire plus ou moins chaque mot à un élément logique élémentaire (+, ET, donc, ...), possédant un sens plus ou moins unique.

A MadM@tt : Désolé ... J'essayais juste de comprendre et d'analyser le développement de Forman, avec les outils mentaux dont je dispose, ce qui a pu amener quelques arguments ad-...-joints et hors de propos.

A psycho81 : c'est inexact. D'une part, les algorithmes (avec un I) de Burrows(Wheeler) et Move To Front ne sont pas des algorithmes de compression, mais de transformation des données, sans aucune compression. Les fichiers transformés par ces algorithmes seront par contre effectivement, généralement mieux compressés que s'ils ne l'étaient pas. Quant à la comrpession arithmétique, décrite dans ce tutoriel, elle possède de nombreuses limitations, notamment en ce qu'elle ne compresse pas les séries de données, mais les différents descripteurs (souvent les octets). Enfin, le théorème de Shannon (avec 2 N, que je l'aime celui là dis donc !) permet de démontrer l'existence de transformations optimales, ie de transformer un fichier "compressible" en fichier "incompressible" (entropie de Shannon nulle ou faible -> entropie maximale) - qui par analogie à nos machines thermodynamiques, sont très loin d'être réalisées aujourd'hui par nos algorithmes. Donc y a t il espoir.

Pour continuer le débat sur de bonnes bases, une des principales raisons pour lesquelles ces algorithmes optimaux ou presque ne sont pas utilisables par nous-autres est la durée d'exécution. Une compression standard Deflate avec un dictionnaire de 64K (par exemple celle utilisée par WinZip 10 en compression maximale) d'un mélange de fichiers de 10 Mo met (dans mon cas) 10 secondes. Qui accepterait d'attendre 10 000 secondes pour utiliser une compression (a peine plus efficace) avec dictionnaire 128K ?

Mes excuses si j'ai pu paraitre insultant/stupide/déconnard/matheux/blessant/ironique/fatigué/interessé/dépité/afammé ou belge.

Shry

signaler à un administrateur
Commentaire de psycho81 le 26/04/2006 11:25:08

A l'heure où je vous parle, le plus rapide exe (en ratio) que j'ai trouvé est compcl.exe (une version beta dos de compressia) qui utilise la réorganisation de données (bien entendu une grande quantité de mémoire est utilisée) suivit de près par SBC et quelques autre du genre. Contactez moi par MP si vous souhaitez une copie de ce merveilleux outils (je n'ai vraiment JAMAIS vu mieux).

Je vous invite d'ailleurs a tester (malheureusement en VB) un algo de ce type (BWT et MTF) sur mes sources que je compte bientot retranscrire en ASM dephli

signaler à un administrateur
Commentaire de Idefix57 le 02/05/2006 03:53:11

Pa tres cair pour moi,
mais je ne suis qu'un débutant ...

J'y compte bien m'y mettre un jour aussi ,
Merci c'est grace a ce genre de cours que l'on apprend :p

Idefix

signaler à un administrateur
Commentaire de woot6768 le 02/06/2006 15:13:52

Alors ça c'est du bon débat, je n'avais pas compris grand chose en cours(ni écouté) sur la compressions. mais alors là...Merci.
Wouter Tjon

signaler à un administrateur
Commentaire de abberu le 08/07/2006 18:48:47

Bonjour,
il y a un problème avec l'algorithme de décompression LZW proposé ici (et sur pratiquement tous les algorithmes qu'on trouve sur le web).
Essayez de compresser ABABABA, on obtient AB<256><258> avec le dictionnaire 256 = AB, 257 = BA, 258 = ABA.
Mais la décompression ne marche pas car quand l'algorithme doit chercher l'entrée 258 dans le dico,
il ne la trouve pas. En effet :

w  k   affichage   index   dico
   A       A  
A  B       B         256    AB
B  <256>   AB        257    BA
AB <258>   plantage....

j'ai longuement cherché sur internet et ai enfin trouvé l'algorithme de décompression correct :

lire un caractère k;
afficher k;
w = k;
tantque ( k = prochain caractère/code )    
{
  Si k est un index dans le dico
    entrée = index de k dans le dico;
    affichée l'entrée;
    ajouter w & entrée[0] au dictionnaire;
    w = entrée;
  SINON
    entrée = w & premier caractère de w
    ajouter  entrée  dans le dico
    afficher entrée
    w = entrée
}
on vérifie :

w  k   affichage   index   dico
   A       A  
A  B       B         256    AB
B  <256>   AB        257    BA
AB <258>   ABA       258    ABA  (le code 258 est inconnu, on ajoute AB + A dans le dico et on
affiche ABA).

Voilà on retrouve bien notre chaîne de départ et les dictionnaires sont les mêmes.

signaler à un administrateur
Commentaire de abberu le 08/07/2006 18:53:56

J'ai oublié aussi de dire que l'algorithme de compression est incomplet. Le voilà en entier :

lire caractere k
w = k
tantque (k = prochaincaractere)
{
  si (w & k) est dans le dico
    w = w & k;
  sinon
    ajouter (w & k) au dico
    sortir l'index de w dans le dico;
    w = k;
}
si w non vide alors sortir index de w

signaler à un administrateur
Commentaire de raoullevert le 15/07/2006 12:25:28

Je peux sortir un peu du sujet ?

Dans le cadre de la compression d'image on pourrais peut etre parler des algo de compression 'fractales' (j'aime pas ce mot, ca veux un peu rien dire), qui sont des algos avec pertes. Pour faire simple, on coupe l'image en petit bout, et on cherche des 'motifs'. Puis on créé un fichier contenant:
-- une sorte de dictionnaire, contenant des petis morceaux d'images
-- un liste d'instruction pour reconstruire l'image (prends le morceau 1 , fait lui faire une rotation de x degrés,ou un agrandissement ... , puis colle le a tel endroit.

Quand j'aurais le temps et si j'y arrive (:-) je ferais un pti code la dessus , si ca interesse.
Ce genre de compression a surtout de l'interet dans la transmition de video je pense. Ca prends pas mal de temps pour compresser, mais la decompression est vraiment tres rapide.

PS : J'ai bien aimé le débat sur la rigueur mathématique, et je m'interroge encore sur la notion de bijection entre deux ensemble composés de données discretes n'ayant pas la meme 'taille' :-).Je demanderais a ma Maman ...

signaler à un administrateur
Commentaire de acx01b le 13/12/2006 11:11:04

salut la fonction de compression n'est pas forcément bijective, ni la fonction de décompression,

pas contre il est évident que décompression(compression(X)) = X
pour tout X, si c'est un algorithme de compression sans perte.
donc que
  décompression o compression = Identité

ce qui impose que compression soit injective et décompression surjective

sinon ton tuto est très bien, malgré celà ça me donne toujours pas la réponse à ma question: comment marchent exactement des compressions comme bz2 ou gz ?

signaler à un administrateur
Commentaire de Zeroc00l le 04/01/2007 16:44:21

Wow, une bonne petite discussion !
J'ai bien fait de trainer ici par hasard :)

j'ai trois remarques à dire :

--------------------------------
| La première s'adresse à shry |
--------------------------------

Tu disais qu'un fichier "111" pouvais être consideré comme "11100000" avec autant de zero qu'on le veut. Pour ma

part je considère que la fin d'un fichier est une valeur a elle seule. En réflechissant (ou pas) on s'apercoit que

la fin de fichier est obligatoirement connu par quelquechose, et ce quelquechose, c'est l'OS.

Dans une archive compressée qui contient plusieurs fichiers, il est nécéssaire d'indiquer la taille du premier

morceau du fichier correspondant au premier fichier compressé pour ne pas empieter sur le morceau qui représente le

fichier compressé suivant. Si il n'y a qu'un fichier, on peut encore une fois se reposer sur l'OS.

D'un point de vue strictement mathématique, je considere que la gestion de la longueur d'un fichier est en elle

meme une compression. Sinon en toute logique les octets seraient composés de 9 bits et une valeur particulière

(genre 111111111) indiquerait la fin du fichier.


--------------------------------
| Ensuite ma deuxieme remarque |
--------------------------------

Je suis assez d'accord sur le fait qu'en moyenne la compression sans perte ne compresse rien, mais seulement du

point de vue théorique. Et il faut le souligner pour ceux qui lisent cette discussion. Du point de vue pratique

cela marche très bien. Heureusement sinon winzip, winrar, winace, 7zip etc ne servirait a rien !
Mais alors pourquoi est-ce que cela marche bien alors que la théorie prévoit le contraire ? Tout simplement parce

que les humains ont tendance à manipuler des fichiers qui ont du sens. Prenez n'importe quel fichier texte, il

contiendra beaucoup d'espaces, de même qu'il est généralement composé de mots. Bref les structures des fichiers que

l'on manipule se prête en général bien à la compression !
Ce que shan