我想使用任意字符串的ASCII文本,例如“Hello world”,并将其压缩为具有较少字符的版本(尽可能少),但是它可以解压缩。压缩版本应仅由ascii字符组成。有没有办法实现这一点,尤其是在Ruby中?
答案 0 :(得分:8)
如果你知道只使用ASCII字符,那就是每个字节的7个低位。通过位操作,您可以将每8个字节混合为7个(节省12.5%)。如果你可以把它放到一个较小的范围内(只有64个有效字符),你可以删除另一个字节。
但是,因为您希望压缩的表单只包含ASCII字符,所以会丢失一个字节 - 除非您的输入可以限制为64个字符(例如,有损压缩用某些字符替换其他字符,仅以小写字母等存储。)
如果您的字符串不大(> 1k),那么由于标题的大小,使用gzip / bzip2等节省的成本最低。如果你有一个预定义的字典用作霍夫曼表,你可能会得到一些压缩,但在其他情况下,你可以对原始文本臃肿。
事先讨论SO An efficient compression algorithm for short text strings
答案 1 :(得分:4)
有许多优秀的文本压缩算法,如Huffman encoding或LZW,它们擅长将文本字符串压缩为比标准ASCII编码少得多的位串。一旦进行了这样的编码,就可以将bitstring分成7位组,将它们打包成标准的ASCII字符。我确信那里有图书馆可以做到这一点,但我不是一个Ruby编码器,也不知道我的头脑。
答案 2 :(得分:1)
最简单的方法是使用标准算法对其进行压缩,然后对结果进行base64编码。这对于像'Hello world'这样简短的字符串来说不太可能有帮助 - 在这个大小的情况下,除了所有字符串都有类似的受限字符集或模式之外,你可以做很少的事情来减小大小像霍夫曼编码可以利用。
答案 3 :(得分:0)
如果你的语言是英语,那么如果你的单词保持明确,那么你可以通过留下常用字符来逃避。例如,如果您的字典仅包含Hello以匹配Hll和世界以匹配wrld,则“Hello world”可能变为“Hll wrld”。像阿拉伯语这样的闪族语言在他们的书面语言中实际上没有人声,人们仍然设法阅读它们。此外,其他规则(如单词应该是大写的)可用于将字符集缩减为小写字符(假设给定的文本遵循这些规则)。
此外,虽然逐字节压缩适用于文本,但是如果对整个单词进行编码,实际的自然语言可以被更好地压缩,因为词汇量的大小非常有限(如果你查看一组有限的文本,则更加有限) 。但这不是问题,我在这里偏离主题。