在另一个字符串中查找字符串子集的最快方法?

时间:2013-04-24 20:23:07

标签: java string complexity-theory huffman-code

我正在解码由霍夫曼编码生成的字节文件,我将字节转换为字符串,然后搜索我由霍夫曼树给出的值。我有一个哈希表,其中包含编码值和原始文件的字节值。这是我的代码。

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 - &gt;哈希表

encodedString - &gt;具有霍夫曼值的字符串

encodedString - &gt;字符串,表示原始文件的原始字节

2 个答案:

答案 0 :(得分:0)

一些建议:

每次附加到String时,都会创建一个新的String。您应该使用StringBuilder代替。这可能是我看到的主要问题。

另外,我会使用hashtable.containsKey代替get来检查密钥是否存在。我怀疑它会影响你的表现。

如果将调用结果存储到子字符串,也可以节省一些时间,因此只调用一次。

所以,像。

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.

答案 1 :(得分:0)

对不同长度的字符串使用子字符串会降低速度。在Java 7中,它需要创建两个对象的原始字符串的副本。你最好创建一个子字符串并对NavigableMap进行搜索。

使用NavigableMap可以在一次操作中找到最长的匹配字符串,并减少需要存储在地图中的字符串数量。

注意:即使如此,地图的大小也是O(N ^ 2),其中N是您可以回顾的最大字符串长度,因此您必须对N的大小设置合理的限制。

注意2:你很幸运能获得内置霍夫曼代码的速度的十分之一(这是为你编写的,是标准的和有效的)所以如果性能很重要,那就使用它。