begin process at 2012 05 27 14:01:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > BWT BURROWS-WHEELER TRANSFORM

BWT BURROWS-WHEELER TRANSFORM


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :compression, bzip2, mtf, bwt, huffman Niveau :Initié Date de création :25/02/2006 Vu / téléchargé :3 645 / 170

Auteur : noaie

Ecrire un message privé
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

le code implémente la transformée Burrows-Wheeler (BWT) et de son inverse (IBWT).

BWT transforme un buffer source dans un buffer de destination (tout en memoire), idem pour IBWT. Le temps de conversion pour un buffer de 4096 octets reste correcte, une partie de la fonction BWT est repris du magazine login N°114.

Source

  • le fichier definition.h
  • --------------------------------------------
  • #define BYTE unsigned char
  • #define WORD unsigned short int
  • #define DWORD unsigned long int
  • le fichier bwt.h
  • --------------------------------------------
  • int BWT(BYTE *source, BYTE *destination, int sizesrc){
  • int i=0, index;
  • int *ordre;
  • static int compare (const void *a, const void *b){
  • int i, j, n, t;
  • i = * (int *) a;
  • j = * (int *) b;
  • n = sizesrc;
  • while(n--) {
  • t = source[i]-source[j]; // diff entre car(i) et car(j)
  • if (t) return t;
  • i = (i+1) % sizesrc; // prochain car i
  • j = (j+1) % sizesrc; // ... j
  • }
  • return 0;
  • }
  • ordre = (int *) malloc(sizeof(int)*sizesrc);
  • if (!ordre) return -1;
  • do {
  • ordre[i]=i++;
  • } while (i<sizesrc);
  • qsort((void*) ordre, sizesrc, sizeof(int), compare);
  • for (i=0; i<sizesrc; i++) {
  • if (ordre[i]==0) {
  • index = i;
  • destination[i] = source[sizesrc-1];
  • } else {
  • destination[i] = source[ordre[i]-1];
  • }
  • }
  • free(ordre);
  • return index;
  • }
  • le fichier ibwt.h
  • --------------------------------------------
  • void IBWT(int sizesrc, int posori, BYTE *source, BYTE *destination){
  • typedef struct {
  • BYTE f;
  • int nd, nf;
  • } IBWT_ELT;
  • IBWT_ELT *p;
  • int i, tmp_pos, ind, index[255];
  • int compteur_d[256], compteur_f[255];
  • BYTE tmp;
  • static int compare (const void *a, const void *b){
  • int i, j;
  • i = * (BYTE *) a;
  • j = * (BYTE *) b;
  • return i-j;
  • }
  • // --- initialisation ---
  • p = (IBWT_ELT *) malloc(sizesrc * sizeof(IBWT_ELT));
  • // copy la transformé pour trier les éléments a remplacer par Memcopy
  • memcpy(destination, source, sizesrc);
  • // trie les données sources
  • qsort((void*) destination, sizesrc, sizeof(BYTE), compare);
  • // affectation des p[].d et P[].f
  • for (i=0; i<=255; i++) { compteur_d[i]=0; compteur_f[i]=0;}
  • for (i=0; i<sizesrc; i++) {
  • tmp = destination[i];
  • p[i].f = source[i];
  • if (compteur_d[tmp]==0) index[tmp]=i;
  • p[i].nd = compteur_d[tmp]++;
  • p[i].nf = compteur_f[source[i]]++;
  • }
  • // calcule de l'inverse
  • i = (sizesrc-1);
  • tmp_pos = posori;
  • while (i>=0) {
  • tmp = p[tmp_pos].f;
  • ind = p[tmp_pos].nf;
  • tmp_pos = index[tmp]+ind;
  • destination[i--] = tmp;
  • };
  • }
  • le fichier main.c
  • --------------------------------------------
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include "definition.h"
  • #include "bwt.h"
  • #include "ibwt.h"
  • int main(int argc, char *argv[]){
  • BYTE *p = "BWT : la transformée de Burrows-Wheeler";
  • BYTE *t, *i;
  • int s, pos;
  • t = (BYTE *) malloc( sizeof(BYTE) * strlen(p)+1); t[strlen(p)]=0x0;
  • i = (BYTE *) malloc( sizeof(BYTE) * strlen(p)+1); i[strlen(p)]=0x0;
  • pos = BWT((BYTE *)p, t, strlen(p));
  • IBWT(strlen(p),pos, t, i);
  • printf("originale: '%s' taille de %d\n", p, strlen(p));
  • printf("BWT : '%s'\n", t);
  • printf("IWT: '%s'\n", i);
  • system("PAUSE");
  • return 0;
  • }
le fichier definition.h
--------------------------------------------
#define BYTE  unsigned char       
#define WORD  unsigned short int 
#define DWORD unsigned long int


le fichier bwt.h
--------------------------------------------
int BWT(BYTE *source, BYTE *destination, int sizesrc){
   int  i=0, index;
   int  *ordre;
       
   static int compare (const void *a, const void *b){
      int i, j, n, t;
      i = * (int *) a;
      j = * (int *) b;
      n = sizesrc;
      while(n--) {
         t = source[i]-source[j]; // diff entre car(i) et car(j)
         if (t) return t;
         i = (i+1) % sizesrc;     // prochain car i
         j = (j+1) % sizesrc;     // ...          j
      }
      return 0;
   }

   ordre = (int *) malloc(sizeof(int)*sizesrc);
   if (!ordre) return -1;
   
   do {
      ordre[i]=i++;
   } while (i<sizesrc);
       
   qsort((void*) ordre, sizesrc, sizeof(int), compare);
       
   for (i=0; i<sizesrc; i++) {
      if (ordre[i]==0) {
         index = i;
         destination[i] = source[sizesrc-1]; 
      } else {
         destination[i] = source[ordre[i]-1];
      }
   }
       
   free(ordre);
   return index;
}


le fichier ibwt.h
--------------------------------------------
void IBWT(int sizesrc, int posori, BYTE *source, BYTE *destination){
   typedef struct {
      BYTE f;
      int  nd, nf;
   } IBWT_ELT;

   IBWT_ELT *p;

   int  i, tmp_pos, ind, index[255];  
   int  compteur_d[256], compteur_f[255];
   BYTE tmp;

   static int compare (const void *a, const void *b){
      int i, j;
      i = * (BYTE *) a;
      j = * (BYTE *) b;
      return i-j; 
   }
   
   // --- initialisation ---  
   p = (IBWT_ELT *) malloc(sizesrc * sizeof(IBWT_ELT));

   // copy la transformé pour trier les éléments a remplacer par Memcopy
   memcpy(destination, source, sizesrc);

   // trie les données sources
   qsort((void*) destination, sizesrc, sizeof(BYTE), compare);
 
   // affectation des p[].d et P[].f
   for (i=0; i<=255; i++) { compteur_d[i]=0; compteur_f[i]=0;}
   
   for (i=0; i<sizesrc; i++) {
      tmp     = destination[i];
      p[i].f  = source[i];
      if (compteur_d[tmp]==0) index[tmp]=i;
      p[i].nd = compteur_d[tmp]++;
      p[i].nf = compteur_f[source[i]]++;
   }

   // calcule de l'inverse  
   i       = (sizesrc-1);
   tmp_pos = posori;
   while (i>=0) {
      tmp              = p[tmp_pos].f;
      ind              = p[tmp_pos].nf;
	  tmp_pos          = index[tmp]+ind;
      destination[i--] = tmp;
   };
}


le fichier main.c
--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "definition.h"
#include "bwt.h"
#include "ibwt.h"

 
int main(int argc, char *argv[]){
  BYTE *p = "BWT : la transformée de Burrows-Wheeler";
  BYTE *t, *i;
  int  s, pos;
  
  t = (BYTE *) malloc( sizeof(BYTE) * strlen(p)+1); t[strlen(p)]=0x0;
  i = (BYTE *) malloc( sizeof(BYTE) * strlen(p)+1); i[strlen(p)]=0x0;

  pos = BWT((BYTE *)p, t, strlen(p));
  IBWT(strlen(p),pos, t, i);

  printf("originale: '%s'  taille de %d\n", p, strlen(p));
  printf("BWT :      '%s'\n", t);
  printf("IWT:       '%s'\n", i);
   
  system("PAUSE");	
  return 0;
}



 Conclusion

restitution à l'ecran
------------------------------------------ ------------------------
originale: 'BWT : la transformÚe de Burrows-Wheeler'  taille de 39
BWT :      'Tee:as r WB-lr dÚhelsW erafretoruwn Bom'
IWT:       'BWT : la transformÚe de Burrows-Wheeler'
Appuyez sur une touche pour continuer...
------------------------------------- -----------------------------

voila si vous avez des remarques, je suis preneur!

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip ALGORITHME MOVE TO FRONT (MTF)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture COMPRESSION FICHIERS ALGORITHME HUFFMAN C par xtremejames183
Source avec Zip CODEUR DE HUFFMAN par webis
Source avec Zip LZZ HUFFMAN COMPRESSION par f_l_a_s_h_b_a_c_k
Source avec Zip [C / WIN32] COMPRESSION HUFFMAN par Neo_Fr
Source avec Zip ALGORITHME MOVE TO FRONT (MTF) par noaie

Commentaires et avis

Commentaire de Matt67 le 25/02/2006 11:04:41

Bonjour,

euh, à quoi ca sert ???

Matt...

Commentaire de noaie le 26/02/2006 01:06:54

Bonjour Matth67,

voici un exemple plus long (extrait de victor hugo, les misérables) qui montre l'utilité de la BWT, a savoir la compression de données sans perte. Cette transformée ne diminue pas la taille des données, mais elle améloire la compression aprés.

originale:

'Javert pencha la tete et regarda. Tout etait noir. On ne distinguait rien. On entendait un bruit d'ecume ; mais on ne voyait pas la riviere. Par instants, dans cette profondeur vertigineuse, une lueur apparaissait et serpentaitvaguement, l'eau ayant cette puissance, dans la nuit la plus complete, de prendre la lumiere on ne sait ou et de la changer en couleuvre. La lueur s'evanouissait, et tout redevenait indistinct. L'immensite semblait ouverte la. Ce qu'on avait au-dessous de soi, ce n'etait pas de l'eau, c'etait du gouffre. Le mur du quai, abrupt, confus, mele a la vapeur, tout de suite derobe, faisait l'effet d'un escarpement de l'infini.'  taille de 651

BWT :      

'e........e,rtnun,,stas,ntt,,stt,steetrrnnuet,t,utr,eteeestsaaeeaa;,eennntaestttttaeeeeutttareeteea,tt,tarelldlcnsLludiuitseetetsreuateenreai  .       lh Lllllllld vumfrvtsnstsltyudtsshvddytv Ppgcppee  J om a s n  n    ne  rn     -nen n  mltntdddrtnLcrdttCntddnctbsrrr'''r'rmspu ivptrmmmp giidsvvv df    ' 'tlccuudpnl'd feunofneni naccaonrmvt'tg'tf oaaauuddauaaaauaaaaaaaaausr            bepu   p eu meeuio oueOuOoo eeaeieoie u  iioaii aaaeiaeeeea rrsnc'  fc gncstTt vp  r ram a  u   uueauuuiaadevfe  p  epaeeeebbnuaunai tusi sseu  n siiienii inieneuiiuiiiiiiiirueieeiipinceeensierttien rss  neeaoddqaaqggllooprnsocl ' remeeelofeooooe ae eau i uoa'

ici on voie clairement l'utilité de l'agorithme, il regroupe les lettres identiques, ce qui améloire la compression. son éfficacité augmente avec la taille des données à codé en entrée

cf ce lien http://fr.wikipedia.org/wiki/BWT , cet algorithme est utilisé dans la compression bzip2.

Merci de ta question.

NoAiE.

Commentaire de psycho81 le 07/04/2006 11:37:56

A quand le MTF (Move To Front) ?
pour des informations complémentaire à ce sujet (et une approche légèrement différente) regarde mes sources (en VB par contre ... désolé)

je tiens à signaler pour les visiteurs venant ici, qu'à l'ehure actuelle, les meilleure compression texte sont réalisé avec comme base de BWT. Le meilleur étant selon moi comrpessia (ou compcl.exe). Contactez moi pour disposer du module dos compcl.exe. Il est surpuissant !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

compression et c++ [ par fakbill ] A l'adresse http://www.cjkware.com/wamckee/huffman.zip j'ai touvé une implémentation en c++ de l'algo de huffman.Pb: Je ne cromprends rien à la façon Compression JPEG [ par inkognitodz ] S.V.P. J'ai besoin du code (C++Builder) qui permet de compresser d Compression avec huffman sous SCILAB si possible Decompression aussi [ par Doser ] Besoin d'aide j suis un peu coincé compression et décompression un fichier texte selon l'algorithme de HUFFMAN [ par sarasofia ] [b]salut tout le monde s'il vous plaît[^^sad1] j ai besoin d'un programme de compression texte selon l algorithme de Huffman en C,C++, Matlab s'il vou algorithme de huffman( compression) [ par flamme19 ] sa[size=200]lut, je cherche un programme en c++ qui fait la compression, puis la décompression d'un texte donné en utilisant l'algorithme de huffman.. compression de huffman [ par chiheb1106 ] Est-ce qu'il y a un algorithme en C qui permet de réaliser la compression et la décompression d'un fichier texte selon la méthode de Huffman sans util compression des images fixes [ par mysoul22 ] Bonjour, Je veux implémenter les algorithmes de compression SPIHT et LZW, un etude comparative, sous c++ builder 6 pour compresser des images fixes n Compression Jpeg2000 aka par ondelettes [ par PitchD ] Bonjour à tous, Mon sujet traite du C et du C++ : C++ pour les tests, C pour une implémentation "dans le dur". Ma requête principale ici est de dema compression et decompression d'un fichier [ par asma ] salut tt le monde , vous pouvez me filer un coup de main les gars ?? je veux une astuce pour compresser et decompresser un fichier (EN C++ evidemment Compression d'images [ par kadifateh ] salut, je vous savoir comment je peux creer un prg en c/c++ qui permer de diviser l'image en blocs de 2*2 pixel. (j utilise un algorithme qui opére s


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales