当前位置: 首页 > 知识库问答 >
问题:

为什么圆周率的文本表示可以压缩?

罗河
2023-03-14

随机字符串应该是不可压缩的。

pi = "31415..."
pi.size  # => 10000
XZ.compress(pi).size  # => 4540

随机十六进制字符串也会被显著压缩。然而,随机字节字符串不会被压缩。

pi字符串只包含字节48到57。如果整数上有前缀代码,则该字符串可能会被严重压缩。本质上,我是在浪费空间,用字节表示9个不同的字符(十六进制字符串是16个)。这是怎么回事?

有人能给我解释一下基本方法是什么,或者给我指出一些来源吗?

共有2个答案

东方宜
2023-03-14

除了基思·汤普森(Keith Thompson)的优秀答案外,还有一点与LZMA(XZ格式使用的压缩算法)有关。数字pi不是由单个重复的数字串组成的,但也不是完全随机的。它确实包含在较大序列中重复的数字子串。LZMA可以检测到这些,并且只存储重复子串的一个副本,从而减少压缩数据的大小。

朱自明
2023-03-14

这是一个信息密度的问题。压缩是指删除冗余信息。

在字符串“314159”中,每个字符占用8位,因此可以具有2个8个或256个不同值中的任何一个,但实际使用的值只有10个。即使是一个非常简单的压缩方案,也可以使用每位数4位来表示相同的信息;这就是所谓的二进制编码十进制。更复杂的压缩方案可以做得更好(十进制数字实际上是log210,或大约3.32位),但代价是存储一些额外的信息,以便进行解压缩。

在一个随机的十六进制字符串中,每个8位字符有4个有意义的位,所以压缩近50%应该是可能的。绳子越长,越接近50%。如果事先知道字符串只包含十六进制数字,则可以将其压缩50%,但这当然会失去压缩其他任何内容的能力。

在随机字节字符串中,没有压缩的机会;每个字符需要完整的8位来表示每个值。如果它真的是随机的,尝试压缩它可能会稍微扩展它,因为需要一些额外的信息来表明输出是压缩数据

解释压缩工作原理的细节超出了这个答案的范围,也超出了我的专业知识。

 类似资料:
  • 这是我的代码: 由于某种原因,与可接受值相比,这段代码只产生了小数15位的pi值。我试图通过增加精度值来解决这一点;这增加了位数,但只有前15个仍然是准确的。我试着改变它计算算法的方式,它也不起作用。所以我的问题是,是否可以对这段代码做些什么来使它更加精确,或者我必须使用另一种算法?我将非常感谢对此的帮助,因为我不知道如何在Python中使用这么多的数字进行操作。我希望能够控制程序确定和显示的(正

  • 问题内容: 我在WAMP中使用PHP编写PHP应用程序已有一段时间了。现在,我将在工作PC上分别安装PHP和Apache HTTP Server。我已经安装了PHP 5和最新的Apache。我去本地主机,看到它的工作原理! 现在,我添加了一个名为的文件,该文件显示: 但是在浏览器中,它仅显示纯文本。我有明确告诉它使用PHP 5的地方吗? 问题答案: 您需要将其添加到服务器配置中: 那是假设您已经正

  • 我把这个贴在我认为是答案的地方,因为我在这里找不到类似的问题答案。 Python 3.6: 这与浮点表示或我的平台(Mac OS X)有关吗?

  • 本文向大家介绍Java小程序计算圆周率代码,包括了Java小程序计算圆周率代码的使用技巧和注意事项,需要的朋友参考一下 下面我们来介绍两种Java编程中实现计算圆周率的方法。 方法一:割圆法 计算公式为: π≈3*2^n*y_n 其中,n代表割圆次数,y_n代表圆中内嵌正6*n边形的边长 输出结果: 方法二:无穷级数法 求圆周率π的级数公式为: Π=2*(1/1+1/3+1/3*2/5+1/3+2

  • 我们正在使用Flyway来迁移数据库模式,并且我们已经有了100多个迁移脚本。 一旦我们将多个迁移“压扁”为一个单一的第一版本迁移,在开发过程中,当我们删除并重新创建模式时,这就可以了。但在生产中,这是行不通的,因为Flyway无法验证迁移。 在这种情况下,我找不到任何文档或最佳实践。问题是文件数量不断增加,我不想每次都看到数千个迁移文件,本质上是如果生产已经在最新版本。我的意思是,那些版本号低于

  • 增加一个属性为什么会报错 class_name, class_name2 又可以