begin process at 2012 02 13 00:32:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Compression & Split

 > COMPRESSION BINAIRE - BWT (BURROWS-WHEELER TRANSFORM) MFT (MOVE TO FRONT) QUICKSORT

COMPRESSION BINAIRE - BWT (BURROWS-WHEELER TRANSFORM) MFT (MOVE TO FRONT) QUICKSORT


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Compression & Split Source .NET ( DotNet ) Classé sous :compression, bwt, mtf, quicksort, binaire Niveau :Expert Date de création :28/10/2005 Date de mise à jour :01/12/2005 10:07:29 Vu / téléchargé :13 629 / 225

Auteur : psycho81

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

 Description

Cliquez pour voir la capture en taille normale
Ce code (non fini pour l'instant) sert (et servira) à réorganiser des données avec la méthode BWT (Burrows-Wheeler Transform). Puis de le traiter avec le Move-To-Front afin de le passer dans un compresseur réel arithmétique (ou autre suivant les possibilités). Le code actuel fait le BWT et le MFT (tout ca en test). Je dépose cette source afin que la communauté de vbfrance puisse amener à ce projet des propos vis à vis de la performance à améliorer pour ce traitement (qui est très lourd dans son utilisation théorique). Bien sur, je suis persuadé que beaucoup diront qu'il serai préférable le faire en C ou en assembleur. Je n'en suis pas encore à cette conception mais celà suivra. Je souhaite pour le moment savoir si des optimisations sympas pouvait être effectuées.

Voili voilou

Je vous file pas le projet car il est en vb2005 et je sens que je vais récupérer quelques plaintes de non compatibilités et donc ... d'abandon de curiosité. Je vous donne donc seulment la classe. Vous pouvez m'écrire pour de plus amples informations, je suis avide de conseils et critiques "constructives". Evitez, s'il vous plait les "Ce code est nul, apprends à programmer" sans apporter de solutions. Merci et bonne prog !

je tiens à signaler que j'aimerai pouvoir prendre un bloc d'octet le plus important possible suivant la mémoire, toute proposition allant dans ce sens est la bienvenue !

Pour des informations sur BWT et MTF voici un cours sommaire
http://fr.wikipedia.org/wiki/Transformati on_de_Burrows-Wheeler mais qui ne travaille pas en binaire (je n'ai d'ailleur trouvé aucune source BWT en binaire !)

http://fr.wikipedia.org/wiki/Mtf

et le quicksort binaire (qui est lui aussi introuvable sous cette forme pourtant ... utile car il n'y a plus la notion de pivot)

Source

  • Public Class ClsBwt
  • Private ReadOnly bin(255, 7) As Integer
  • Public Sub New()
  • Dim i As Integer
  • Dim j As Integer
  • ' Construction du tableau binaire qui permet d'économiser quelques calculs
  • For i = 0 To 255
  • For j = 0 To 7
  • bin(i, j) = (i >> (7 - j)) And 1
  • Next
  • 'Console.WriteLine(i & vbTab & bin(i, 0) & bin(i, 1) & bin(i, 2) & bin(i, 3) & bin(i, 4) & bin(i, 5) & bin(i, 6) & bin(i, 7))
  • Next
  • j = Nothing
  • i = Nothing
  • End Sub
  • Public Sub bwt(ByRef str As String)
  • bwt(System.Text.ASCIIEncoding.Default.GetBytes(str))
  • End Sub
  • Public Sub bwt(ByRef b() As Byte)
  • Console.WriteLine("BWT generator")
  • Dim lim As Integer = UBound(b)
  • Dim blim As Integer = ((lim + 1) << 3) - 1
  • Dim blims = CType(blim >> 1, Integer)
  • Dim blim2 = blim + 1
  • Dim i As Integer
  • Dim j As Integer
  • Dim k As Integer
  • Dim ptr(blim) As Integer
  • Dim change As Integer = 0
  • 'Console.WriteLine("Initialisation des pointeurs")
  • For i = 0 To blim
  • ptr(i) = i
  • Next
  • Console.WriteLine("Chaine origine (binaire)")
  • For i = 0 To blim
  • j = ptr(i) - 1
  • If j < 0 Then
  • j = blim
  • End If
  • Console.Write(bin(b(j >> 3), (j And 7)))
  • Next
  • Console.WriteLine("")
  • Dim lev As Integer = 0
  • Dim cpt(blim, 3) As Integer
  • cpt(lev, 0) = 0
  • cpt(lev, 2) = blim
  • cpt(lev, 3) = -1
  • 'view(ptr, b, lev, cpt)
  • TriLev:
  • 'Console.WriteLine(spa(lev) & "Tri du level " & lev & " de " & cpt(lev, 0) & " à " & cpt(lev, 2))
  • 'view(ptr, b, lev, cpt)
  • If cpt(lev, 3) = -1 Then
  • 'Console.WriteLine(spa(lev) & "Tri du level " & lev & " de " & cpt(lev, 0) & " à " & cpt(lev, 2))
  • cpt(lev, 3) = 0
  • i = cpt(lev, 0)
  • j = cpt(lev, 2)
  • cpt(lev, 1) = -1
  • Cherche1:
  • k = ptr(i) + lev
  • If k >= blim2 Then
  • k -= blim2
  • End If
  • If bin(b(k >> 3), k And 7) = 0 Then
  • i += 1
  • If i <= j Then
  • GoTo Cherche1
  • Else
  • GoTo EndSearch
  • End If
  • 'Else
  • 'Console.WriteLine(spa(lev) & "On a un 1")
  • End If
  • cpt(lev, 1) = i
  • Cherche0:
  • k = ptr(j) + lev
  • If k >= blim2 Then
  • k -= blim2
  • End If
  • If bin(b(k >> 3), k And 7) = 1 Then
  • j -= 1
  • If i < j Then
  • GoTo Cherche0
  • Else
  • GoTo EndSearch
  • End If
  • 'Else
  • 'Console.WriteLine(spa(lev) & "On a un 0")
  • End If
  • If i < j Then
  • 'Console.WriteLine(spa(lev) & "Echange [" & i & "-" & j & "]")
  • change += 1
  • k = ptr(i)
  • ptr(i) = ptr(j)
  • ptr(j) = k
  • cpt(lev, 1) = j
  • i += 1
  • j -= 1
  • GoTo Cherche1
  • End If
  • EndSearch:
  • 'Console.WriteLine(spa(lev) & "FIN Premier 1 : " & cpt(lev, 1))
  • If cpt(lev, 1) <> -1 Then
  • 'Ya des 1
  • k = cpt(lev, 1) - 1
  • If k > cpt(lev, 0) Then
  • 'Console.WriteLine(spa(lev) & "Relancement de la boucle sous tri 0 de " & cpt(lev, 0) & " à " & k)
  • If cpt(lev, 1) < cpt(lev, 2) Then
  • cpt(lev, 3) = 1
  • Else
  • cpt(lev, 3) = 2
  • End If
  • i = lev + 1
  • If i <= blim Then
  • cpt(i, 0) = cpt(lev, 0)
  • cpt(i, 2) = k
  • cpt(i, 3) = -1
  • lev += 1
  • End If
  • GoTo TriLev
  • End If
  • If cpt(lev, 1) < cpt(lev, 2) Then
  • 'Console.WriteLine(spa(lev) & "Relancement de la boucle sous tri 1 de " & cpt(lev, 1) & " à " & cpt(lev, 2))
  • cpt(lev, 3) = 2
  • i = lev + 1
  • If i <= blim Then
  • cpt(i, 0) = cpt(lev, 1)
  • cpt(i, 2) = cpt(lev, 2)
  • cpt(i, 3) = -1
  • lev += 1
  • End If
  • GoTo TriLev
  • End If
  • 'Console.WriteLine(spa(lev) & "Fin du tri du level " & lev)
  • lev -= 1
  • GoTo TriLev
  • Else
  • ' Ya pas de 1
  • 'Console.WriteLine(spa(lev) & "Relancement de la boucle sous tri 0 de " & cpt(lev, 0) & " à " & cpt(lev, 2))
  • cpt(lev, 3) = 2
  • i = lev + 1
  • If i <= blim Then
  • cpt(i, 0) = cpt(lev, 0)
  • cpt(i, 2) = cpt(lev, 2)
  • cpt(i, 3) = -1
  • lev += 1
  • End If
  • GoTo TriLev
  • End If
  • End If
  • If cpt(lev, 3) = 1 Then
  • 'Console.WriteLine(spa(lev) & "***** Lancement du sous tri 1 du level " & lev & " de " & cpt(lev, 1) & " à " & cpt(lev, 2))
  • cpt(lev, 3) = 2
  • i = lev + 1
  • If i <= blim Then
  • cpt(i, 0) = cpt(lev, 1)
  • cpt(i, 2) = cpt(lev, 2)
  • cpt(i, 3) = -1
  • lev += 1
  • End If
  • GoTo TriLev
  • End If
  • If cpt(lev, 3) = 2 Then
  • 'Console.WriteLine(spa(lev) & "Fin du tri du level " & lev & " de " & cpt(lev, 0) & " à " & cpt(lev, 2))
  • lev -= 1
  • If lev >= 0 Then
  • GoTo TriLev
  • End If
  • End If
  • 'view(ptr, b, 0, cpt)
  • Console.WriteLine(change & " changement(s)")
  • Console.WriteLine("Transformée de Burrows-Wheeler")
  • For i = 0 To blim
  • j = ptr(i) - 1
  • If j < 0 Then
  • j = blim
  • End If
  • Console.Write(bin(b(j >> 3), (j And 7)))
  • Next
  • Console.WriteLine("")
  • Console.WriteLine("MoveToFront")
  • k = 0
  • For i = 0 To blim
  • j = ptr(i) - 1
  • If j < 0 Then
  • j = blim
  • End If
  • If bin(b(j >> 3), (j And 7)) = k Then
  • Console.Write("0")
  • Else
  • k = bin(b(j >> 3), (j And 7))
  • Console.Write("1")
  • End If
  • Next
  • lev = Nothing
  • ptr = Nothing
  • k = Nothing
  • j = Nothing
  • i = Nothing
  • blim = Nothing
  • lim = Nothing
  • End Sub
  • Private Sub view(ByRef ptr() As Integer, ByRef b() As Byte, ByVal lev As Integer, ByRef cpt(,) As Integer)
  • Dim lim As Integer = UBound(ptr)
  • Dim lim2 As Integer = lim + 1
  • Dim k As Integer
  • Dim i As Integer
  • Dim j As Integer
  • Dim str As New System.Text.StringBuilder
  • For i = 0 To lim
  • str.Append(spa(lev))
  • For j = 0 To lim
  • k = ptr(i) + j
  • If k >= lim2 Then
  • k -= lim2
  • End If
  • str.Append(bin(b(k >> 3), (k And 7)))
  • Next
  • str.Append(vbTab)
  • For j = 0 To 3
  • k = cpt(i, j)
  • str.Append(cpt(i, j) & vbTab)
  • Next
  • str.Append(vbCrLf)
  • Next
  • Console.WriteLine(str.ToString)
  • Console.ReadLine()
  • j = Nothing
  • i = Nothing
  • End Sub
  • Private Function spa(ByVal nb As Integer) As String
  • Return New String(" ", nb)
  • End Function
  • Protected Overrides Sub Finalize()
  • MyBase.Finalize()
  • End Sub
  • End Class
Public Class ClsBwt

    Private ReadOnly bin(255, 7) As Integer

    Public Sub New()

        Dim i As Integer
        Dim j As Integer

        ' Construction du tableau binaire qui permet d'économiser quelques calculs

        For i = 0 To 255
            For j = 0 To 7
                bin(i, j) = (i >> (7 - j)) And 1
            Next
            'Console.WriteLine(i & vbTab & bin(i, 0) & bin(i, 1) & bin(i, 2) & bin(i, 3) & bin(i, 4) & bin(i, 5) & bin(i, 6) & bin(i, 7))
        Next
        j = Nothing
        i = Nothing

    End Sub

    Public Sub bwt(ByRef str As String)
        bwt(System.Text.ASCIIEncoding.Default.GetBytes(str))
    End Sub

    Public Sub bwt(ByRef b() As Byte)

        Console.WriteLine("BWT generator")

        Dim lim As Integer = UBound(b)
        Dim blim As Integer = ((lim + 1) << 3) - 1

        Dim blims = CType(blim >> 1, Integer)
        Dim blim2 = blim + 1

        Dim i As Integer
        Dim j As Integer
        Dim k As Integer

        Dim ptr(blim) As Integer

        Dim change As Integer = 0

        'Console.WriteLine("Initialisation des pointeurs")

        For i = 0 To blim
            ptr(i) = i
        Next


        Console.WriteLine("Chaine origine (binaire)")
        For i = 0 To blim
            j = ptr(i) - 1
            If j < 0 Then
                j = blim
            End If
            Console.Write(bin(b(j >> 3), (j And 7)))
        Next
        Console.WriteLine("")


        Dim lev As Integer = 0
        Dim cpt(blim, 3) As Integer
        cpt(lev, 0) = 0
        cpt(lev, 2) = blim
        cpt(lev, 3) = -1

        'view(ptr, b, lev, cpt)


TriLev:
        'Console.WriteLine(spa(lev) & "Tri du level " & lev & " de " & cpt(lev, 0) & " à " & cpt(lev, 2))

        'view(ptr, b, lev, cpt)

        If cpt(lev, 3) = -1 Then
            'Console.WriteLine(spa(lev) & "Tri du level " & lev & " de " & cpt(lev, 0) & " à " & cpt(lev, 2))
            cpt(lev, 3) = 0

            i = cpt(lev, 0)
            j = cpt(lev, 2)

            cpt(lev, 1) = -1

Cherche1:

            k = ptr(i) + lev
            If k >= blim2 Then
                k -= blim2
            End If
            If bin(b(k >> 3), k And 7) = 0 Then
                i += 1
                If i <= j Then
                    GoTo Cherche1
                Else
                    GoTo EndSearch
                End If
                'Else
                'Console.WriteLine(spa(lev) & "On a un 1")
            End If
            cpt(lev, 1) = i
Cherche0:

            k = ptr(j) + lev
            If k >= blim2 Then
                k -= blim2
            End If
            If bin(b(k >> 3), k And 7) = 1 Then
                j -= 1
                If i < j Then
                    GoTo Cherche0
                Else
                    GoTo EndSearch
                End If
                'Else
                'Console.WriteLine(spa(lev) & "On a un 0")
            End If


            If i < j Then
                'Console.WriteLine(spa(lev) & "Echange [" & i & "-" & j & "]")
                change += 1
                k = ptr(i)
                ptr(i) = ptr(j)
                ptr(j) = k
                cpt(lev, 1) = j
                i += 1
                j -= 1
                GoTo Cherche1
            End If



EndSearch:
            'Console.WriteLine(spa(lev) & "FIN Premier 1 : " & cpt(lev, 1))

            If cpt(lev, 1) <> -1 Then
                'Ya des 1

                k = cpt(lev, 1) - 1
                If k > cpt(lev, 0) Then
                    'Console.WriteLine(spa(lev) & "Relancement de la boucle sous tri 0 de " & cpt(lev, 0) & " à " & k)
                    If cpt(lev, 1) < cpt(lev, 2) Then
                        cpt(lev, 3) = 1
                    Else
                        cpt(lev, 3) = 2
                    End If

                    i = lev + 1
                    If i <= blim Then
                        cpt(i, 0) = cpt(lev, 0)
                        cpt(i, 2) = k
                        cpt(i, 3) = -1
                        lev += 1
                    End If

                    GoTo TriLev
                End If

                If cpt(lev, 1) < cpt(lev, 2) Then
                    'Console.WriteLine(spa(lev) & "Relancement de la boucle sous tri 1 de " & cpt(lev, 1) & " à " & cpt(lev, 2))
                    cpt(lev, 3) = 2
                    i = lev + 1
                    If i <= blim Then
                        cpt(i, 0) = cpt(lev, 1)
                        cpt(i, 2) = cpt(lev, 2)
                        cpt(i, 3) = -1
                        lev += 1
                    End If
                    GoTo TriLev
                End If
                'Console.WriteLine(spa(lev) & "Fin du tri du level " & lev)
                lev -= 1
                GoTo TriLev

            Else


                ' Ya pas de 1

                'Console.WriteLine(spa(lev) & "Relancement de la boucle sous tri 0 de " & cpt(lev, 0) & " à " & cpt(lev, 2))
                cpt(lev, 3) = 2
                i = lev + 1
                If i <= blim Then
                    cpt(i, 0) = cpt(lev, 0)
                    cpt(i, 2) = cpt(lev, 2)
                    cpt(i, 3) = -1
                    lev += 1
                End If

                GoTo TriLev


            End If


        End If

        If cpt(lev, 3) = 1 Then
            'Console.WriteLine(spa(lev) & "***** Lancement du sous tri 1 du level " & lev & " de " & cpt(lev, 1) & " à " & cpt(lev, 2))
            cpt(lev, 3) = 2
            i = lev + 1
            If i <= blim Then
                cpt(i, 0) = cpt(lev, 1)
                cpt(i, 2) = cpt(lev, 2)
                cpt(i, 3) = -1
                lev += 1
            End If

            GoTo TriLev
        End If

        If cpt(lev, 3) = 2 Then
            'Console.WriteLine(spa(lev) & "Fin du tri du level " & lev & " de " & cpt(lev, 0) & " à " & cpt(lev, 2))
            lev -= 1
            If lev >= 0 Then
                GoTo TriLev
            End If
        End If

        'view(ptr, b, 0, cpt)

        Console.WriteLine(change & " changement(s)")



        Console.WriteLine("Transformée de Burrows-Wheeler")

        For i = 0 To blim
            j = ptr(i) - 1
            If j < 0 Then
                j = blim
            End If
            Console.Write(bin(b(j >> 3), (j And 7)))
        Next
        Console.WriteLine("")

        Console.WriteLine("MoveToFront")

        k = 0
        For i = 0 To blim
            j = ptr(i) - 1
            If j < 0 Then
                j = blim
            End If
            If bin(b(j >> 3), (j And 7)) = k Then
                Console.Write("0")
            Else
                k = bin(b(j >> 3), (j And 7))
                Console.Write("1")
            End If
        Next

        lev = Nothing
        ptr = Nothing

        k = Nothing
        j = Nothing
        i = Nothing

        blim = Nothing
        lim = Nothing
    End Sub

    Private Sub view(ByRef ptr() As Integer, ByRef b() As Byte, ByVal lev As Integer, ByRef cpt(,) As Integer)
        Dim lim As Integer = UBound(ptr)
        Dim lim2 As Integer = lim + 1
        Dim k As Integer
        Dim i As Integer
        Dim j As Integer

        Dim str As New System.Text.StringBuilder

        For i = 0 To lim
            str.Append(spa(lev))
            For j = 0 To lim
                k = ptr(i) + j
                If k >= lim2 Then
                    k -= lim2

                End If
                str.Append(bin(b(k >> 3), (k And 7)))
            Next
            str.Append(vbTab)

            For j = 0 To 3
                k = cpt(i, j)
                str.Append(cpt(i, j) & vbTab)
            Next

            str.Append(vbCrLf)
        Next

        Console.WriteLine(str.ToString)
        Console.ReadLine()

        j = Nothing
        i = Nothing
    End Sub

    Private Function spa(ByVal nb As Integer) As String
        Return New String(" ", nb)
    End Function

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub

End Class

 Conclusion

L'appel se fait de cette manière

Dim MonBwt as ClsBwt

MonBwt.bwt(TableauDeBytes) ' ou
MonBwt.bwt("aaa")          ' ou

Pour les tests ... Ne prenez pas de trop grandes chaines au début ... Certaines optimisations ne sont pas encore développées.

Je sais, il reste beaucoup de ligne de test, ca sert a tracer un peu la progression du programme

 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


 Historique

28 octobre 2005 16:14:41 :
Ajout d'un zip
10 novembre 2005 09:06:30 :
1ère correction de fautes d'orthographe (terrible la mise à jour !)
01 décembre 2005 10:06:37 :
Mise à jours des mots clés
01 décembre 2005 10:07:29 :
Re-mise à jours des mots clés

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET 2 ] CLIENT-SERVEUR UDP DE BASE EN MODE CONSOLE
Source avec Zip Source .NET (Dotnet) CRYPTAGE PAR HYPERCUBE 4D MOUVANT
Source avec Zip Source .NET (Dotnet) CRYPTEUR PAR HYPERCUBE MATRICIEL EN 4 DIMENSION

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) ZIP UNZIP DOSSIER (COMPRENANT FICHIER(S) ET SOUS DOSSIER(S))... par ManuOrange
Source avec Zip COMPRESSION / DECOMPRESSION SELON L'ALGORITHME LEMPELZIV 78V par th1man
Source .NET (Dotnet) DÉCOMPRESSER EN .NET PLUSIEURS FORMATS POPULAIRES D'ARCHIVAG... par NikatorS
Source .NET (Dotnet) DÉCODAGE YENC EN VB.NET par NINATECH
Source avec Zip Source avec une capture Source .NET (Dotnet) SEVENZIP CONSOLE par PWM63

 Sources en rapport avec celle ci

Source avec une capture Source .NET (Dotnet) PROFIL BINAIRE D'UN OBJET par tchconst
COMPRESSION D'UN DOSSIER AVEC WINZIP par djebbipgm
Source avec Zip Source avec une capture Source .NET (Dotnet) CONVERTISSEUR DÉCIMAL BINAIRE HEXADÉCIMAL OCTAL par raffika
Source avec Zip Source .NET (Dotnet) SÉRIALISTION - DÉSERIALISATION DE TABLEAUX ET COLLECTIONS par AlexMS
Source avec Zip Source avec une capture Source .NET (Dotnet) .NET ALGO HUFFMAN RLE MTF par yvesyves

Commentaires et avis

Commentaire de psycho81 le 03/11/2005 09:42:47

1ère série de commentaires :

Tout d'abord, je me dois d'expliquer l'utilité de ce code. Il rentre dans la composante de beaucoup de compresseur surpuissant comme bzip2 ou compressia (compcl.exe pour les intimes, un exécutable qui compresse, en version beta plus que tout autre compresseur existant sur la marché - Me contacter si vous souhaitez cet exécutable qui relègue bzip2 au rang d'outsider bien lointain).La méthode BWT permet de réorganiser les données (celà ne compresse nullement au contraire cela rajoute un tout petit bloc de données supplémentaires). Ou est l'utilité alors me dire d'appliquer cette méthode ?

Prenons par exemple la chaine "abcabdabe" (qui sommes toutes est une chaine peux courante dans nos fichiers textes :) )

La méthode BWT demande en théorie la longueur de la chaine au carré d'octets mémoire pour son traitement car pour effectuer cette opération nous devons faire un tableau[LongueurChaine] de Chaine qui sera disposer comme suit :

abcabdabe
bcabdabea
cabdabeab
abdabeabc
bdabeabca
dabeabcab
abeabcabd
beabcabda
eabcabdab

Jusque la, rien de très compréhensible. Trions maintenant ce tableau (et c'est là qu'est concentré mon travail actuellement)

1 abcabdabe <-- chaine originale
2 abdabeabc
3 abeabcabd
4 bcabdabea
5 beabcabda
6 bdabeabca
7 cabdabeab
8 dabeabcab
9 eabcabdab

et maintenant prenons le dernier octet de chaque élément du tableau d'octet. Ce qui nous donne "ecdaaabbb" (n'oublions pas que nous devrons rajouter a ce bloc l'index du tableau, c'est à dire le 1). Nous nous apercevons que la sequence "ab" a été réoganiser de telle manière à ce qu'une compression RLE classique pourrait déjà avoir un avantage notable.

Mais comment retrouver la chaine originale me direz vous ? En fesant l'opération inverse. je m'explique.

La chaine "ecdaaabbb" est ce qu'on apelle la Tranformée de Burrows

Nous savons (puisque nous l'avons fait précédemment) que les données sont triées. Et c'est là qu'est la clé !

donc voici notre tableau de départ

e
c
d
a
a
a
b
b
b

Donc nous allons rajouter les octets triés (c'est un bon début :) )

e a
c a
d a
a b
a b
a b
b c
b d
b e

Bon ensuite je n'ai pas encore beaucoup appronfondu l'algo pour recréer la chaine mais on sait qu'après l'unique c il y a un a donc on met un a après tous les c (euh l'unique aprdon).

e a
c a
d a
a b
a b
a b
b ca
b d
b e

Et ainsi de suite pour arriver au tableau suivant (nous n'aurons pas forcement besoin de calculer l'intégralité de ce tableau)

1 e abcabdabe <-- chaine originale
2 c abdabeabc
3 d abeabcabd
4 a bcabdabea
5 a beabcabda
6 a bdabeabca
7 b cabdabeab
8 b dabeabcab
9 b eabcabdab

A suivre ... La prochaine fois explication du MTF (Move To Front)

Commentaire de psycho81 le 03/11/2005 10:14:36

Ah si j'oubliai, le modèle que j'ai préconisé dans ce modèle es binaire, c'est a dire que plutot que d'avoir une chaine du type abcabdabe nous aurons une chaine du type 01110010000110001100101. Voili voilou.

Commentaire de psycho81 le 03/11/2005 10:35:01

Bientôt les premiers commentaires dans le code ... Le pire es à craindre :)

Commentaire de psycho81 le 03/11/2005 10:37:59

Ce modèle EST binaire.Le pire EST à craindre ... J'ai décidement un petit problème avec mon "t" parfois ... Et d'autres fois avec mon orthographe (je me souviens d'une série de ligne que m'avais donné mon père une fois : Je ne ferai plus de fautes d'orthographe à "orthographe". J'ai trouvé le moyen d'en faire ailleurs ... :p )

Commentaire de chris81 le 03/11/2005 23:08:24

slt, tu as pas l'air de parler tt seul :), bon je vois qu'il est toujours aussi compliqué de comprendre un tel code. c'est bien toi t. Des que j'ai 5 min je te le teste et te dis en attendant bisous a+ :)

Commentaire de psycho81 le 04/11/2005 09:23:57

Salut mon bisouilleur ...
Et vi je me sentais un peu seul. Déjà que dans les méandres de mon cerveau torturé, il y a peu de monde .... Mais bon, tu me dira ... C'est pas avec des codes pareil qu'on attire du monde :p Entre le crypteur multiiidimensionel (à ne pas confondre avec le distruuucteur dimensionneeeeel - allusion à "Hé mec elle est où ma caisse" que Chris81 connait sur le bout des doigts) et çà, je suis pas sur de passer pour quelqu'un de très clair :) ) Enfin test le code, tu verra des résultat surprenant avec des chaines style abcabcabc ou aaaaaaaaa. C'est ... surprenant :)

Bisoux a toi mon unique fan :)

Commentaire de Doodoo256 le 11/11/2005 19:28:42

Bonsoir,

je viens de faire un petit tour dans les sources et je tombe là dessus...
Je vais suivre avec intérêt tes travaux ça m'a l'air révolutionnaire malgré la complexité de l'algo.

Où se situe l'efficacité de cette méthode par rapport à du 7z, LZW et   Huffman par exemple ?

L'algo a déjà été implémenté ? Dans quel soft ?

a++ ;

Commentaire de Doodoo256 le 11/11/2005 20:31:21

Ok, un petit tour sur Google m'a ouvert les yeux..

Le site de Compressia est mort on dirait.

En tout cas, quel algo de compression as-tu l'intention d'appliquer après BWT ?
Question bête :

Si on applique BTW sur un fichier binaire d'environ 500 Ko, il faut une grosse bécane pour faire les rotations ou alors découper en blocs c'est ça ?

Commentaire de us_30 le 12/11/2005 16:48:02

Salut,

Je découvre cet algo, que je cherchais depuis des années dans ma pauvre tête... Pour comprendre, faut mieux lire l'adresse donné sur wikipedia ... Désolé psycho81. Bon, je me pencherai dessus, et si j'ai une bonne remarque, je te tiendrai au courant. Le .NET , c'est pas ma spécialité, mais on le comprend assez bien, en connaissant VB...

Par contre, pour avancer un peu sur le débat, je me pose qlq questions.
- Pourquoi choisir la forme binaire plutôt que par octet directement.
- Ce qui me semble évident, pour répondre à DooDoo, c'est de découper par bloc. Si on pense à des fichiers de plusieurs Méga, voir Giga, on rendrait fou le PC sans bloc ! Mais il reste une question. Y a-t-il une taille optimum... (surement, si on tient compte des déclarations des variables)
- Ensuite, après transformation, je ne vois pas l'intérêt d'utiliser Huffman. Le plus direct serait comme pour le PCX d'antant, non ? (surtout si la taille traitée est assez conséquente)

Amicalement,
Us.

Commentaire de psycho81 le 14/11/2005 09:54:55

Doodoo256,

L'efficacité de cette méthode est ... dans ce cas précis nulle vu qu'elle ne fait que réorganiser les données vers une forme plus ... facilement compressible. Il allourdit meme le packet de la référence de ligne qui permettra de retrouver la chaine originelle. Cependant, la réorganisation effectué permet de dégager un très grand nombre de zéro dans la chaine binaire (vu que le move to front remplace 1111100000 par 1000010000). Pour ce qui est de l'implémentation de cet algorhytme, bzip2 l'utilise ainsi que compressia et ... bien d'autre je pense (au fait Doodoo256 j'ai une version beta de compressia en ligne de commande qui devrait t'interesser, pour que je te le fasse aprvenir contacte moi à rebel_thc AroBaBase yahoo point afrreux -Super ce mail non ? :p)

Pour répondre à la compression qui sera utilisé par la suite, vu le très grand nombre de zéro que nous pourrons trouver, j'ai opté pour une compression arithmétiqe binaire pas au point encore pour le moment( us_30 Huffman serait un acte inutile dans ce cas la vuq ue je travaille en binaire et donc le gain serait nul sous cette forme vu qu'il faudrai au moins 1 bit pour coder 1 bit alors que la compression aritmétique permet de coder n bit avec un seul bit ! je suis arrivé chez moi à n = 1236 bits sans forcer soit un gain considérable !).

Doodoo256, l'avantage de cette méthode est qu'il n'est pas nécessaire d'avoir un tableau (n,n) donc exponentielle mais plutot du genre (3 ou 4,n) donc linéaire ce qui permet d'avoir une montée de mémoire moindre suivant la taille du bloc (le BWT expliqué est toujours de la forme (n,n)). Donc pour conclure... plus la mémoire est grande, plus grand est le buffer, et ... plus la réorganisation des données est efficiente.

Le fait de travailler sous forme binaire permet de trouver des cycles de répétitions plus précis que par octects par exemple ab n'a aucun cycle alors que 0110000101100010 (ab en binaire) contient des cycles ici 011000 01 011000 10

La taille du buffer optimale serait donc de la forme Total mémoire / NombreDeBitsDuBloc*BitsUtilisésPourTraitementDunBit

Bientot la suite ...

Bonne prog

Commentaire de psycho81 le 16/11/2005 09:17:11

Petite information en passant :

La méthode de base de réorganisation BWT a été mise au point en 1994. Depuis, les meilleurs taux de compression réalisés sont souvent à base de cette méthode de réorganisation. Il est à prévoir que de nouvelle méthode post BWT, similaire à l'algorhytme JPEG verront le jour. Pour l'instant les possiblités offertes par cet algorhytme n'ont pas encore été totalement exploités (à l'inverse de Hufmann par exemple dont on a défini une certaine limite). BWT est donc très récent et est donc succeptible de provoquer une véritable révolution dans les méthodes de compression (une autre ...). Bientot dans le zip, je mettrai une documentation sur BWT et MTF, un recueil de texte glané ci et là sur le net.

Bonne prog !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Algorithme de compression LZW [ par PhiPhi ] Je recherche un algorithme de compression LZW pour une application non commerciale, si possible disponible en vb5.0 ou vb6.0 avec le code source.code PNG, CRC32 et compression [ par JMC ] Je cherche à écrire et lire des fichiers PNG. Mais il memanque quelques procedures :- quelqu'un sait-il comment (en VB) calculer un CRC32 (norme ISO 3 Compression [ par casimir ] J'ai récupéré un contrôle qui permet de zipper des fichiers.Pour le moment il m'est impossible de compresser des répertoires. Si quelqu'un se sent cap Base de registre [ par Steph21 ] J'aimerai extraire de la base de registre une donnée binaire. J'ai trouvé sur ce site comment le faire avec d'autres types de données mais pas avec du compression image [ par aprenti ] est ce que quelqu'un a algorithme pour comprimer une image Calcul binaire [ par kequo ] peut on faire du calcul binaire avec VB? si oui comment recherche ocx de compression compatible pkzip [ par Cameleon ] Bonjour voulant intégrer dans un programme un module de compression et que celui-ci soit le plus standard possible je recherche un ocx du style de xce Ecriture dans un fichier binaire avec la methode getchunk du controle inet [ par Yves ] Lorsque je mets les données récupérées avec getchunk dans une variable pour les sauvegarder dans un fichier binaire,VB ajoute deux octets (a chaque éc MSComm en binaire [ par OCh ] L'aide en ligne donne un exemple de lecture binaire du port serie quine fonctionne pas:dim buffer as variantdim Arr( ) as bytebuffer=MSComm1.InputArr= Cryptage de fichiers executables [ par Clovis ] Salut! Voila mon pb, j'ai fait un logiciel de cyptage, il code bien les fichiers texte, mais quand on passe aux fichiers executables ou meme aux image


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,232 sec (4)

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