1
Iは、LZWアルゴリズムを持っている -LZW圧縮 - 修正バージョン
maxNumBits
はトライの最大サイズであると考えられる
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
パラメータを渡すメインクラスで例外がキャッチされたとします。 dict
がHashMap
であり、reader
がFileInputStream
であり、fos
がFileOutputStream
であると仮定する。
私のバージョンでは、トライがいっぱいになると(つまり、trieLength > maxNumBits
)、現在の圧縮率(currentCr
)が最後の圧縮率(lastCr
)未満になるまで圧縮が続きます。
私はこれを〜8MBのファイルで実行しており、トライの長さを変更しても累積圧縮率は変わりません。このコードは
if(dict.containsKey(wi) && ((currentCr >= lastCr)||(trieLength < maxNumBits)))
ここに記載されている要件を満たしていますか?あなたの助けのための
おかげで、
サム
編集 - フォーマットのヘルプに感謝、エドワード
ちょうど好奇心:バイトリードはビットの代わりにバイトを意味しますか?なぜ私はあなたが1バイトだけを読むときに8を追加するのか分かりません。そしてここではtrieLength + = 8は本当にtrieLength + = 1の代わりにどういう意味ですか? – dragon66
dict.get(w)がバイト値より大きい場合、fos.write(dict.get(w))はどうしましたか?これは、intとしてバイトを書き出すことになっています。 – dragon66
私が理解しているように、LZWコードは出力前にバイトに変換されるべきであり、それを行う方法は現在のコード長と関係があります。 – dragon66