1

私はLZWアルゴリズムを持っています -

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あるはずです。パラメータを渡すメイン クラスで例外がキャッチされたとしmaxNumBitsます。dictは 、はHashMapreaderは であるFileInputStreamと仮定fosFileOutputStreamます。

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

これを ~8mb のファイルで実行しましたが、トライの長さを変更しても累積圧縮率には影響しません。このコードですか

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

記載されている要件に合っていますか?

ご協力いただきありがとうございます、

サム

編集 - 書式設定を手伝ってくれてありがとう、エドワード

4

1 に答える 1

0

次の反復がチェックされる前に trieLength がチェックされていなかったことが判明しました。つまり、いっぱいになったときに新しいトライが生成されていませんでした。

于 2012-09-02T19:43:39.027 に答える