Algorithm 如何获得bzip2发现的模式?(或任何其他压缩算法)
我有一个由字符“0”、“1”、“2”、“3”组成的巨大文件。没有空格,没有别的。就这4个字。我已经使用bzip2对其进行了压缩,文件大小从X减小到了0.05*X。我想知道bzip2找到了哪些字符串/模式来实现该文件的压缩版本(例如0123213232、0123121222112等)。有没有一种简单的方法可以从实际的bz2文件中提取信息,或者通过运行带有一些特殊命令行选项的bzip2来提取信息 如果你知道其他一些现有压缩程序的答案,我也很有兴趣听一听 谢谢你的帮助 最好的,Algorithm 如何获得bzip2发现的模式?(或任何其他压缩算法),algorithm,compression,Algorithm,Compression,我有一个由字符“0”、“1”、“2”、“3”组成的巨大文件。没有空格,没有别的。就这4个字。我已经使用bzip2对其进行了压缩,文件大小从X减小到了0.05*X。我想知道bzip2找到了哪些字符串/模式来实现该文件的压缩版本(例如0123213232、0123121222112等)。有没有一种简单的方法可以从实际的bz2文件中提取信息,或者通过运行带有一些特殊命令行选项的bzip2来提取信息 如果你知道其他一些现有压缩程序的答案,我也很有兴趣听一听 谢谢你的帮助 最好的, Surikator.B
Surikator.Bzip2使用Burrows-Wheeler变换以可逆的方式将重复的字节序列转换为相同字节的序列。然后使用该算法将重复字节转换为零序列。之后,它将使用较短的符号分配给更频繁的字节(可能是零)。您可以在上找到更多详细信息。bzip2没有此选项,而且它的工作方式与我认为的工作方式不完全相同。无论如何,您可以在算法中找到不同部分的代码。正如@stribika所提到的,它使用Burrows Wheeler和move to front算法,然后通过哈夫曼编码器进行压缩。谷歌应该用你选择的语言为你提供一些Burrow's Wheeler转换的结果 然而,基于您所寻找的,我认为您需要更多的字典式编码器。您可能对LZW算法感兴趣: 它将建立一个如您所示的字符串字典。Burrows-Wheeler变换 它也称为块排序。如果您不喜欢阅读维基百科,请阅读1999年计算机科学数学基础: 哈夫曼编码 输入:
“这是哈夫曼树的一个示例”
。这样的二叉树是构建的:
然后用它来建立编码表:
Char ' ' nr(32) | binary:00100000 | new binary:111
Char 'a' nr(97) | binary:01100001 | new binary:001
Char 'e' nr(101) | binary:01100101 | new binary:000
Char 'f' nr(102) | binary:01100110 | new binary:1101
Char 'h' nr(104) | binary:01101000 | new binary:1100
Char 'i' nr(105) | binary:01101001 | new binary:1001
Char 'l' nr(108) | binary:01101100 | new binary:01101
Char 'm' nr(109) | binary:01101101 | new binary:1000
Char 'n' nr(110) | binary:01101110 | new binary:1011
Char 'o' nr(111) | binary:01101111 | new binary:01100
Char 'p' nr(112) | binary:01110000 | new binary:01111
Char 'r' nr(114) | binary:01110010 | new binary:01110
Char 's' nr(115) | binary:01110011 | new binary:1010
Char 't' nr(116) | binary:01110100 | new binary:0101
Char 'u' nr(117) | binary:01110101 | new binary:01001
Char 'x' nr(120) | binary:01111000 | new binary:01000
只有在具有相同的树的情况下,才能读取新的二进制文件,因此输出中也支持该树。数据的长度也是存储的,因为新二进制的和不是完整的字节数
开放软件
你可以随便看看
- 手册页:
- 或来源:
printf()
s很简单。在官方的bzip2网站上?我肯定那里有C源。我还发现了Burrows-Wheeler变换的Ocaml实现。谷歌可以做到这一点。