【问题标题】:Fastest way to find a subset of strings in another string?在另一个字符串中查找字符串子集的最快方法?
【发布时间】:2013-04-24 20:23:06
【问题描述】:

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

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 KB。这也使编码回看更容易。
  • 我只用过霍夫曼,它确实可以很好地压缩某些类型的文件,但我没有看到这个循环需要很长时间的地方,所以我问我应该在这里改变什么。
  • 内置的霍夫曼编码可以支持多 GB 文件而不会花费越来越长的时间,所以如果这样做我怀疑你有一个错误(如果只是一个性能错误)额外的算术压缩可以使它 2再次缩小 10 倍。
  • 是的,我知道我做错了什么,问题出在我在这里分享的方法上,所以我不知道是否有人能告诉我在这个说明中花费了这么多时间跨度>

标签: java string complexity-theory huffman-code


【解决方案1】:

几个建议:

每次附加到字符串时,都会创建一个新字符串。您应该改用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.

【讨论】:

  • 非常感谢,大大增加了解码过程,感谢=)
【解决方案2】:

对不同长度的字符串使用子字符串确实会减慢速度。在 Java 7 中,它使用原始字符串的副本创建两个对象。您最好创建一个子字符串并针对 NavigableMap 进行搜索。

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

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

注意 2:你会很幸运能够达到内置霍夫曼代码的十分之一的速度(这是为你编写的,是标准的并且有效)所以如果性能很重要,请使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2022-06-17
    • 2011-07-14
    • 2015-01-14
    • 2014-02-09
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多