LZW Compression/Decompression
« il: Gennaio 05, 2019, 22:42 »
salve a tutti ragazzi. vorrei chiedere alcuni consigli sullo sviluppo di questo algoritmo come progetto.
premetto che siamo gia ad un buon punto col ragazzo con cui collaboro, solo che dopo aver sviluppato un trie e la funzione di compressione...abbiamo provato a creare la medesima funzione con un dict in modo da sfruttare la def Compression() sia se si usa un trie ( nel caso nella def si avrà un parametro che può essere t=trie o d=dict) sia un dict. ora qui sotto trovate il codice della Compression() e della classe dict che implementa le medesime funzioni del trie....i risultati ovviamente non sono uguali in quanto il trie crea una compressione corretta mentre il dict crea una compressione dove il penultimo valore non è corretto. attendo consigli.


def Compression(input_File):
   
    stringa_compressa = []
    T = lzw_dict()
       
    dim = len(input_File)
    counter = 0
   
    #ciclo che esamina ogni carattere   
    for C in input_File:
        #provo a cercare il prossimo carattere
        val = T.search(C)
        counter = counter + 1 #incremento il contatore dei caratteri
       
        if T.check() :
            stringa_compressa.append(val)
       
        if counter == dim :
            stringa_compressa.append(val)
   
    stringa_compressa.append(256);
   
    return stringa_compressa

test = Compression("BANANA")
print(test)



classe dict :

class lzw_dict() :

    def __init__(self) :
        self.dim = 256
        self.dict = {chr(i) : i for i in range(self.dim)}
        self.prev = ""
        self.conta = 0
        self.value = 0
        self.stringa = []
        self.key = ""
   

    def search(self, char) :
        self.key = self.prev + char
        if self.key in self.dict :
            self.prev = ""
            self.conta= 0
            self.stringa.append(self.dict[self.prev])
            self.value = self.stringa.pop(0)
            return self.value
           
        else:
            self.prev = char
            self.dim += 1
            self.dict[self.key] = self.dim
            self.conta = -1
            return self.conta
       


   
    def check(self) :
        if self.conta == -1 :
            return True
        else :
            return False