Algorithm 如何获得bzip2发现的模式?(或任何其他压缩算法)

Algorithm 如何获得bzip2发现的模式?(或任何其他压缩算法),algorithm,compression,Algorithm,Compression,我有一个由字符“0”、“1”、“2”、“3”组成的巨大文件。没有空格,没有别的。就这4个字。我已经使用bzip2对其进行了压缩,文件大小从X减小到了0.05*X。我想知道bzip2找到了哪些字符串/模式来实现该文件的压缩版本(例如0123213232、0123121222112等)。有没有一种简单的方法可以从实际的bz2文件中提取信息,或者通过运行带有一些特殊命令行选项的bzip2来提取信息 如果你知道其他一些现有压缩程序的答案,我也很有兴趣听一听 谢谢你的帮助 最好的, Surikator.B

我有一个由字符“0”、“1”、“2”、“3”组成的巨大文件。没有空格,没有别的。就这4个字。我已经使用bzip2对其进行了压缩,文件大小从X减小到了0.05*X。我想知道bzip2找到了哪些字符串/模式来实现该文件的压缩版本(例如0123213232、0123121222112等)。有没有一种简单的方法可以从实际的bz2文件中提取信息,或者通过运行带有一些特殊命令行选项的bzip2来提取信息

如果你知道其他一些现有压缩程序的答案,我也很有兴趣听一听

谢谢你的帮助

最好的,
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
只有在具有相同的树的情况下,才能读取新的二进制文件,因此输出中也支持该树。数据的长度也是存储的,因为新二进制的和不是完整的字节数

开放软件 你可以随便看看

  • 手册页:
  • 或来源:

出于某种奇怪的原因,我无法将此链接添加到我的答案中:–Wheeler_transform Ahh,如果您单击它,它会指向错误的位置。这是有效的(通过右键单击“文章”选项卡获得):我猜您的意思是“较短的符号”而不是“排序器符号”(即“新二进制”列中Margus”答案中显示的较少位).官方网站上有源文件。向它们添加一些
printf()
s很简单。在官方的bzip2网站上?我肯定那里有C源。我还发现了Burrows-Wheeler变换的Ocaml实现。谷歌可以做到这一点。