2012-04-26 16 views
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パラメータを渡すメインクラスで例外がキャッチされたとします。 dictHashMapであり、readerFileInputStreamであり、fosFileOutputStreamであると仮定する。

私のバージョンでは、トライがいっぱいになると(つまり、trieLength > maxNumBits)、現在の圧縮率(currentCr)が最後の圧縮率(lastCr)未満になるまで圧縮が続きます。

私はこれを〜8MBのファイルで実行しており、トライの長さを変更しても累積圧縮率は変わりません。このコードは

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

ここに記載されている要件を満たしていますか?あなたの助けのための

おかげで、

サム

編集 - フォーマットのヘルプに感謝、エドワード

+1

ちょうど好奇心:バイトリードはビットの代わりにバイトを意味しますか?なぜ私はあなたが1バイトだけを読むときに8を追加するのか分かりません。そしてここではtrieLength + = 8は本当にtrieLength + = 1の代わりにどういう意味ですか? – dragon66

+0

dict.get(w)がバイト値より大きい場合、fos.write(dict.get(w))はどうしましたか?これは、intとしてバイトを書き出すことになっています。 – dragon66

+0

私が理解しているように、LZWコードは出力前にバイトに変換されるべきであり、それを行う方法は現在のコード長と関係があります。 – dragon66

答えて

0

それはtrieLengthは次の反復をされていた前にチェックされていなかったことが判明これは、新しいトライが満杯になったときに生成されていないことを意味します。