我正在寻找一种压缩小ASCII字符串的算法。它们包含许多字母,但它们也可以包含数字,很少包含特殊字符。它们很小,平均大约50-100字节,最大250个。
示例:
Android show EditText.setError() above the EditText and not below it
ImageView CENTER_CROP dont work
Prevent an app to show on recent application list on android kitkat 4.4.2
Image can't save validable in android
Android 4.4 SMS - Not receiving sentIntents
Imported android-map-extensions version 2.0 now my R.java file is missing
GCM registering but not receiving messages on pre 4.0.4. devices
我想逐个压缩标题,而不是很多标题,我不太关心CPU和内存使用情况。
答案 0 :(得分:3)
您可以在要压缩的所有文本中使用Huffman coding和共享的Huffman树。
虽然您通常为每个要单独压缩的字符串构造一个Huffman树,但这需要大量的存储开销,这里应该避免。这也是在你的情况下使用标准压缩方案时的主要问题:它们中的大多数都有一些开销,这会导致非常短的字符串压缩效率。其中一些没有(大)开销,但通常效率较低。
当构造稍后用于压缩和解压缩的霍夫曼树时,通常使用将被压缩的文本来决定哪个字符用哪些位编码。因为在你的情况下,要压缩的文本似乎事先是未知的,你需要有一些“伪”文本来构建树,可能来自人类语言的字典或以前用户数据的一些经验。
然后构建Huffman树并将其存储在您的应用程序中;要么将其硬编码到二进制文件中,要么以文件的形式提供。然后,您可以使用此树压缩和解压缩任何文本。每当您决定更改树时,因为您获得了更好的压缩文本的经验,压缩的字符串表示也会发生变化。引入版本控制并将树版本与您压缩的每个字符串一起存储可能是一个好主意。
您可能会想到的另一项改进是使用多字符霍夫曼编码。你可以找到频繁的音节或单词并将它们放入树中,而不是逐字符地压缩文本;那么它们在压缩字符串中需要更少的位。然而,这需要更复杂的压缩算法,但这可能是值得的。
要在C ++ (*)中处理压缩和解压缩例程中的一串位,我建议boost::dynamic_bitset
或std::vector<bool>
。两者都在内部将多个位打包成字节。
(*) 这个问题曾经有c++标签,所以OP显然想在C ++中实现它。但由于一般问题并非特定于编程语言,因此删除了标记。但我仍然保留了C ++特定部分的答案。