BWT (python)

De GirinoWiki

#!/usr/bin/python
# coding: utf-8
 
import sys
 
class bwt_encoder:
    """
        Transforma um bloco de caracteres em uma seqüência 
        mais facilmente comprimível usando o método de
        Burrows-Wheeler, de acordo com o descrito em
        http://pt.wikipedia.org/wiki/Método_de_Burrows-Wheeler
    """
    def get_permutations(self, str):
        """
            Cria as permutações de um bloco que são
            necessárias ao BWT.            
        """
        ret = []
        for i in range(0, len(str)):
            ret = ret + [str[i:] + str[0:i]]
        return ret
    def encode(self, str):
        """
            A "codificação" coresponde simplesmente a se
            selecionar a última coluna da matriz de 
            permutações ordenadas lexicograficamente, 
            além de informa a posição da cadeia original
            nesta matriz de permutações.
        """
        perms = self.get_permutations(str)
        perms.sort()
        last_column = ''
        for line in perms:
            last_column = last_column + line[len(line)-1]
        index = 0
        for index in range(0, len(perms)):
            if perms[index] == str:
                break
        return (index, last_column)
 
class bwt_decoder:
    """
        Faz a transformação reversa da 
        descrita em bwt_encode.
    """
    def get_indexes(self, str, sorted):
        """
            Os índices mapeiam cada símbolo da cadeia
            "codificada" com os símbolos da cadeia 
            ordenada. Esta lista de índices é o
            elemento essencial na transformação reversa.
        """
        used_pos = dict()
        indexes = []
        for i in range(0, len(str)):
            for j in range(0, len(sorted)):
                if sorted[j] == str[i] and (not used_pos.has_key(j)):
                    used_pos[j] = True
                    indexes = indexes + [j]
                    break
        return indexes
    def decode(self, str, index):
        """
            Usando a lista de índices calculadas no método
            get_indexes e o índice correspondentes a linha
            original na matriz, reconstruímos a linha 
            original, que corresponde ao arquivo decodificado.
        """
        sorted = [str[i] for i in range(0, len(str))]
        sorted.sort()
        indexes = self.get_indexes(str, sorted)
        ret = ''
        T = index
        for i in range(0, len(str)):
            char = str[T]
            ret = char + ret
            T = indexes[T]
        return ret
 
if __name__ == "__main__":
    str = 'a_asa_da_casa'
 
    # encode
    encoder = bwt_encoder()
    (index, last_column) = encoder.encode(str)
    print ('encoded:', index, last_column)
 
 
    # decode
    decoder = bwt_decoder()
    decoded = decoder.decode(last_column, index)
    print ('decoded:', decoded)
Ferramentas pessoais
Social Blogging
  • StumbleUpon
  • Adicionar aos Favoritos BlogBlogs
  • Adicionar esta página no Linkk
  • Add to Technorati Favorites
patrocinadores
Espaço comercial