1

ハフマン エンコーディングで作成されたバイト ファイルをデコードしています。バイトを文字列に変換し、ハフマン ツリーによって与えられた値を検索します。元のファイルのエンコード値とバイト値を含むハッシュ テーブルがあります。これが私のコードです。

for(int i = 0, j = 1; j <= encodedString.length(); j++){

        if(huffEncodeTable.get( encodedString.substring(i, j)) != null){

            decodedString.append(huffEncodeTable.get( encodedString.substring(i, j)));
            i = j;      

        }

それは非常に単純で、すべての文字列を反復するループです。問題は、文字列が大きすぎる場合に発生します-100KBを超えるサイズの圧縮ファイルを使用すると、それらを処理するのに非常に長い時間がかかります。このプロセスをより高速な方法で行う方法、またはエンコード値を hastable の代わりに別の構造に格納する方がよい場合。

huffEncodeTable -> ハッシュテーブル

encodedString -> ハフマン値を持つ文字列

decodedString -> 元のファイルの元のバイトを表す文字列

4

2 に答える 2

0

いくつかの提案:

String に追加するたびに、新しい String が作成されます。StringBuilder代わりに使用する必要があります。私が見ているように、これはおそらく主な問題です。

また、キーの存在を確認するhashtable.containsKey代わりに使用します。getただし、それがパフォーマンスに大きな影響を与えるとは思えません。

substring への呼び出しの結果を保存して、一度だけ呼び出すと、少し時間を節約できます。

だから、何か。

StringBuilder sb = new StringBuilder()
String currentString;
for(int i = 0, j = 1; j <= encodedString.length(); j++){
    currentString = encodedString.substring(i, j)
    if(huffEncodeTable.containsKey( currentString )){

        sb.append(huffEncodeTable.get( currentString ));
        i = j;      

    }
}
return sb.toString(); //Or whatever you do with it.
于 2013-04-24T20:45:29.070 に答える