2012-04-26 9 views
1

J'ai un algorithme LZW -compression LZW - Une version modifiée

private void start(int maxNumBits) throws IOException{ 
    System.out.println("Beginning"); 
    /** Compress a string to a list of output symbols. */ 
    // Build the dictionary. 
    for (int i = 0; i < 256; i++) 
     dict.put("" + (char)i, i); 
    int i; 
    String w = ""; 
    int bitsRead = 0; 
    int bitsOutput = 0; 
    int trieLength = 0; 
    float lastCr = 0f; 
    while((i = reader.read()) != EOF){ 
     bitsRead += 8; 
     float currentCr = (float)bitsRead/(float)bitsOutput; 
     if(bytesRead % 1024 == 0) 
      System.out.println(currentCr); 
     String wi = w + (char)i; 
     if (dict.containsKey(wi) && ((currentCr >= lastCr) || (trieLength < maxNumBits))){ 
      w = wi; 
      trieLength += 8; 
     } 
     else { 
      fos.write(dict.get(w)); 
      bitsOutput += 8; 
      // Add wi to the dictionary. 
      dict.put(wi, mapSize++); 
      w = "" + (char)i; 
      trieLength = 0; 
     } 
     lastCr = currentCr; 
    } 
    // Output the code for w. 
    if (!w.equals("")){ 
     fos.write(dict.get(w)); 
     bitsOutput += 8; 
    } 
} 

maxNumBits est censé être la taille maximale de la structure arborescente. Supposons que l'exception est interceptée dans une classe principale qui transmet le paramètre maxNumBits. Supposons que dict est un HashMap, reader est un FileInputStream et fos est un FileOutputStream.

Dans ma version, si le plein devient Trie (c'est trieLength > maxNumBits), la compression continue jusqu'à ce que le ratio de compression (currentCr) est inférieur au dernier taux de compression (lastCr).

J'ai exécuté ceci sur un fichier de ~ 8mb et changer la longueur de trie ne fait rien au taux de compression cumulatif. Ce code est-il

if(dict.containsKey(wi) && ((currentCr >= lastCr)||(trieLength < maxNumBits))) 

corrects pour les exigences décrites?

Merci pour votre aide,

Sam

modifier - merci pour l'aide à la mise en forme, Edward

+1

Juste curieux: bytesRead signifie BYTES au lieu de bits. Je ne sais pas pourquoi vous ajoutez 8 lorsque vous lisez seulement un octet. Et ici trieLength + = 8 est vraiment ce que vous voulez dire au lieu de trieLength + = 1? – dragon66

+0

Comment avez-vous fait ceci: fos.write (dict.get (w)) si dict.get (w) est plus grand que la valeur byte? Il est censé écrire un octet comme int. – dragon66

+0

Si je comprends bien, le code LZW devrait être traduit en octets avant la sortie et la façon de le faire a quelque chose à voir avec la longueur actuelle du code. – dragon66

Répondre

0

Il se trouve que la trieLength n'a pas été vérifiée avant la prochaine itération a été étant vérifié, ce qui signifie qu'un nouveau trie n'a pas été généré lorsqu'il est devenu complet.

Questions connexes