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;
}
}
où 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
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
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
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