您可以使用霍夫曼编码 https://en.wikipedia.org/wiki/Huffman_coding在您要压缩的所有文本中使用共享的霍夫曼树。
虽然您通常为每个要单独压缩的字符串构建一个霍夫曼树,但这将需要大量的存储开销,这里应该避免这种情况。这也是在您的情况下使用标准压缩方案时的主要问题:大多数方案都有一些开销,这会降低非常短字符串的压缩效率。其中一些没有(大)开销,但通常效率较低。
在构建稍后用于压缩和解压缩的霍夫曼树时,通常使用将被压缩的文本来决定哪个字符用哪些位进行编码。由于在您的情况下,要压缩的文本似乎事先是未知的,因此您需要一些“伪”文本来构建树,可能来自人类语言词典或以前用户数据的一些经验。
然后构造霍夫曼树并将其存储在您的应用程序中;要么将其硬编码到二进制文件中,要么以文件的形式提供。然后您可以使用该树压缩和解压缩任何文本。每当您决定更改树时,因为您对压缩文本有了更好的体验,压缩字符串表示也会发生变化。引入版本控制并将树版本与压缩的每个字符串存储在一起可能是个好主意。
您可能会想到的另一个改进是使用多字符霍夫曼编码。您可以找到频繁的音节或单词并将它们放入树中,而不是逐个字符地压缩文本;那么它们在压缩字符串中需要的位数甚至更少。然而,这需要更复杂的压缩算法,但它可能是值得的。
To process a string of bits in the compression and decompression routine in C++(*), I recommend either boost::dynamic_bitset http://www.boost.org/doc/libs/1_55_0/libs/dynamic_bitset/dynamic_bitset.html or std::vector<bool> http://en.cppreference.com/w/cpp/container/vector_bool. Both internally pack multiple bits into bytes.
(*)The question once had the c++ /questions/tagged/c%2b%2b tag, so OP obviously wanted to implement it in C++. But as the general problem is not specific to a programming language, the tag was removed. But I still kept the C++-specific part of the answer.