数据压缩悖论

最简单形式的数据压缩任务可以与数字及其符号有关。 数字可以用数字表示(数字11表示“十一” ),数学表达式(1048576表示“二十分之二” ),字符串表达式(99999表示“五分之九” ),专有名词(666表示 野兽的数目”“图灵的去世年份” (适用于1954年),或它们的任意组合。 对话者可以明确确定适合哪种说话的任何指定都是合适的。 显然,告知对话者“阶乘八”比等效的称呼“四千三百二十二十”更为有效。 这就提出了一个逻辑问题:给定数字的最短名称是什么?

哲学家贝特朗·罗素(Bertrand Russell)在1908年发表了《贝里悖论》 ,该书解决了对面的数字表示法问题: 最小的数字是什么,表明哪80个字母不够用?
这样的数字必须存在:在80个俄语字母和空格中,您总共可以指定34 80个数字,这意味着使用80个字母您最多可以指定34 80个数字。 因此,不能以这种方式指定不超过34 80的特定数字。

这意味着名称“最小的80个字母不够用”将对应于该数字,其中只有78个字母! 一方面,这个数字必须存在。 另一方面,如果该数字存在,则其名称与之不符。 矛盾!

消除此矛盾的最简单方法是引用口头指定的非正式性。 就像,如果在符号中只允许一组特定的表达式,则“最少80个字母不足的数字”将不是有效的名称,而“阶乘8”类型的实际有用的名称将仍然有效。

是否存在正式的方法来描述对数字的操作的顺序(算法)? 有很多,它们被称为编程语言。 我们将使用打印必要数字的程序(例如,在Python中)来代替语言符号。 例如,对于五个九, print("9"*5)程序print("9"*5)合适的。 对于给定的数量,我们将继续对最短的程序感兴趣。 这种程序的长度称为Kolmogorov数的复杂度 。 这是可以压缩给定数字的理论极限。

现在可以考虑一个类似的问题,而不是Berry悖论: 千字节程序不足的最小数字是多少?

我们将以与以前相同的方式进行争论:存在256,1024千字节的文本,这意味着在千字节程序中最多可以显示256,224个数字。 这意味着不能以这种方式推导出不大于256 1024的某个数字。

但是我们用Python编写了一个程序,该程序会生成所有可能的千字节文本,将其启动以执行,如果它们打印了某个数字,则会将该数字添加到可访问的字典中。 在检查了所有256 1024个可能性之后,无论花费多长时间-程序都会查找字典中没有的最小数字并显示该数字。 显然,这样的程序将适合千字节代码-并且将输出无法在千字节程序中显示的数字!

现在有什么收获? 它不能再归因于符号的非正式性!

如果您对我们的程序需要一个天文数字的内存感到困惑-包含256 1024个元素的字典(或位图)-那么您可以在没有它的情况下执行相同的操作:对于256 1024个数字中的每一个,都可以遍历所有256 1024个程序,直到找到合适的程序为止。 没关系,这样的枚举会持续很长时间:从数字和程序中检查少于(256 10242对后,它将结束并找到非常喜欢的数字。

还是不会结束? 确实,在将要尝试的所有程序中,会有“ while True: pass (以及它的功能对应物)通过-并且检查该程序不会超出范围!

与Berry悖论不同,当时的问题在于符号的非正式性,在第二种情况下,我们对“停止问题”进行了精心掩饰的重新表述。 事实是,根据程序,不可能在有限的时间内确定其结论。 特别是,Kolmogorov的复杂度是无法计算的 :没有一种算法可以让给定的数字找到输出该数字的最短程序的长度。 这意味着Berry问题没有解决方案-对于给定的数字,找到最短单词指定的长度。

Source: https://habr.com/ru/post/zh-CN446976/


All Articles