一个奇怪的压缩算法的问题

2022-04-05 14:37:05 +08:00
 zzh1ad

想请教一下各位,有没有一种数学方式可以把一个给定的数字转换成一个有一定压缩率的数学公式?例如 1 亿可以表示为 10 的 8 次方。

如果有,那么就可以把一份文件以一个比之前文件小的一个数学公式表示,然后重复这个操作。。。🤣

3954 次点击
所在节点    程序员
35 条回复
thedrwu
2022-04-05 14:41:04 +08:00
中国在建国大业的时候,乡农在搞信息论。
entropy 了解一下
c2r5
2022-04-05 14:44:12 +08:00
我也有过这个想法。但可能会造成,逆向解题(解压缩)时,会有多个答案。
zzh1ad
2022-04-05 14:44:55 +08:00
@thedrwu 我的意思是数学公式不包含原始数据,这个公式算出来的结果才是原始数据,就比如说圆周率的前一百万数字
Puteulanus
2022-04-05 14:47:59 +08:00
压到最后压成了一个数字,42
aceralon
2022-04-05 14:51:11 +08:00
@zzh1ad 所有数据都可以表示为圆周率的某一位到某一位之间的数字了,只是解压可能要花很长时间算 pi
hahasong
2022-04-05 14:55:45 +08:00
浮点数不就是这样表示的 IEEE 754 标准
noe132
2022-04-05 15:06:59 +08:00
压缩都会存在一个极限。

完美的压缩算法是一个 np-hard 问题,但实际上,就算 p=np ,压缩在多项式时间也是完全无法接受的。现在大多数压缩算法都是线性时间复杂度,而且很多还在这个基础上放弃压缩比例优化执行时间。
keith1126
2022-04-05 15:07:48 +08:00
信息论和密码学,非科班出身最缺乏的两门学科,同时也是各种民科造轮子的温床……

老老实实学一下信息论吧。
flynaj
2022-04-05 15:23:11 +08:00
现在的无损压缩都是用字典,所以重复内容越多,压缩越高,字典用二叉树来生成。要深入了解的话学点计算机基础。你说问题都是基础知识
thedrwu
2022-04-05 15:28:16 +08:00
@zzh1ad #3
公式本身就是被包含的信息
AkashicRecords
2022-04-05 18:10:40 +08:00
码率的极限——Shannon's source coding theorem
Tianao
2022-04-05 18:15:17 +08:00
恭喜楼主发明了科学记数法和浮点数。
fkdtz
2022-04-05 18:20:59 +08:00
压缩不可能无限压缩下去,总会达到一个极限,否则就可以无限套娃把压缩结果再压缩,最后压没了。
Mohanson
2022-04-05 18:47:43 +08:00
@zzh1ad

根据信息论, 圆周率提供的信息量是 0.

信息熵是对不确定性的量度, 而圆周率的不确定性为 0.
adoal
2022-04-05 19:07:27 +08:00
能用比原值更简短的简单公式来表示的数字串才是特例
JeffGe
2022-04-05 19:42:32 +08:00
所有正整数都能用 20 个以内的汉字表达出来,例如 1 亿可以表示为“一后面八个零”或者“十的八次方”。

证明:反证法,假设存在无法用 20 个以内汉字表达出来的数,则必然存在一个最小的不能用 20 个汉字表达出来的数,而这个数已经被“最小的不能用二十个以内的汉字表达的数”表示出来了,矛盾。

( doge )
shuax
2022-04-05 20:01:53 +08:00
你说这个叫哈希,要文件的时候去服务器取。
MatDK
2022-04-05 20:07:37 +08:00
一方面,信息论中定义了压缩的极限。
另一方面,这些“公式”[其实是“码表”]本身就是信息。
举个例字,Computation “计算”这个单词,用英语要 11 个字母,但是中文可能“计算”或者“算”就可以表达出这个意思。原因是,英语本身只有 26 个字母(码表的大小只有 26 ),而常用汉字就有 3000 多个(码表远大于英语)。

有其他人说到,所有数据都可以表示成圆周率某位到某位的数字,固然你在表示的时候简单,但是这个码表的长度可能是难以估计的。要不花很多时间去计算这个码表,要不大家花海量的存储去存储一个非常长码表。

现在的各种压缩都已经是针对过不同的场景特化过的了。找了一个效率,码表和压缩率的平衡
yankebupt
2022-04-05 20:39:20 +08:00
楼主没考虑算法的最差情况
压缩算法的最差情况下结果是比原数据长的。
所以一直不停的压最后会越来越长,而不是趋近于一个最小值
ClericPy
2022-04-05 21:01:17 +08:00
有点像进制的转换?

>>> bin(10000000)
'0b100110001001011010000000'
>>> hex(10000000)
'0x989680'

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX