按关键词阅读:

文章图片

文章图片

文章图片
【算法|客观地说:能否把1GB的数据压缩到1MB,甚至更小的体积呢?】
有没有想过 , 表示位置的下标值如果大于数据本身了呢?比如说我1G的电影 , 这个排列会在π的第xxxxxxxxx位出现你这个下标显然就会超级大 。 我觉还可以压缩到更小 , 结合水洗 , 浸泡等方式 , 还可以压缩到无限小 。
就像一个有无数小黄鸭的图片 , 可以压缩到只有一个小黄鸭多点 , 多的一点是记录小黄鸭的位置信息 , 所以那叫实时计算 , 和压缩无关 。 理论可以证明 , 完全随机的数据不可压缩 。 所谓压缩 , 就是用特殊编码表达信息的重复性 。(因此 , 信息冗余量很大的图像、图形和视频-连续图像-文件往往可以有很大的压缩率 , 而比较随机的可执行代码就只有很小的压缩率) 楼主提到哈希编码 , 但完全不懂数据压缩是怎么回事儿 。
256位字符串组成多少种? 假如有一组文件 , 每个文件只是由256位字符组成的 , 那257位的字符文件怎么编码成256位字符串?只有一种可能:一个生成出来的256位字符串对应的文件有无数个 , 只是先阶段技术限制 , 很难找出来而已!
理论上应该可以 , 但是麻烦 。 比如说2进制变为16进制 , 理论上位数应该是缩短了很多 , 应该能降低体积 。 再假如 , 2的1000次方进制呢?忘了 , 这是猜的 。 手动压缩可以做到 , 但是想做出通用的压缩软件就很难了 , 以前网上那些15G的游戏和视频压缩成64K就是手工压缩的 , 原理是基本跳过操作系统 , 直接和硬件对话 , 这样就省掉了大量的沉郁数据 , 就像工厂直接卖东西给消费者 , 跳过批发商和层层批发商一样 。 以前我们研究过 , 09年的笔记本 , 弄出的算法导入1G视频可以30秒内压缩到3M多 。
如果在无穷算力和时间尺度上 , 都是可以做到的 。 任何大小和复杂度的数据 , 都可以用两个无理数的交集来表示 。 只要保存这两个无理数的公式就好了 。 理论上可以的 , 1GB的数据在存储的时候也是一串有限的二进制编码 , 二进制可以除以一个固定的数 , 位数就减少了 , 再反复除 , 一直到位数用1M能装下为止 , 提取数据的时候逆运算就行了 。
这只是理论上 , 事实上有很多问题:1.一般不能除尽 , 可能存在很多位小数 , 所以大部分数据无法实现这种压缩2.反复运算增加了错误几率 , 再反复逆运算再次增加错误几率 , 会导致大概率恢复后数据错误 , 丢失信息 。 所以压缩的算法一般比较复杂 , 有多重运算方式和错误验证方式 , 压缩的第一目的是保证数据安全而不是尽可能的小 , 所以现在的压缩往往都并不会压缩的像你想象的那么小 。
如果超高性能的计算机问世 , 如量子计算机 , 可实现任意大小 , 也就是无限大小的文件 , 可统一压缩至32字节 , 也就是0.0000305MB , 只需要对摘要结果进行逆向爆破碰撞进行还原 , 在原理上是可行的 。 比如说一个人拿着一个移动硬盘想把地球所有的知识都装进去 , 但是硬盘容量太小 , 装不下那么多 , 于是就把二进制数据转换成十进制或者很大的进制 , 然后就把小数点移到最前面 , 这样就得出来了一个数 , 然后把硬盘的长度当作1 , 然后划一条线 , 得到两个长度 , 这两个长度做除法 , 足够精确 , 得到一个数 , 然后就可以得到存储数据的那个数 。 只要计算机足够强大 , 一条线就可以带走整个地球的所有知识 。
主要看数据本身的结构和代表的含义 。 跟用什么技术关系不大 。 举个例子 , 一张2000万像素的照片 , 如只是一个纯色 , 那么就可以压缩的很小 , 完全可以用一个像素的信息重复2000万倍 , 这就是一个用计算代替实际信息的过程 。 但如果每个像素的信息都不一样 , 甚至毫无规律 , 那么可压缩性就非常小(这里指无损压缩) , 如果还想减少其文件体积 , 那么就必须通过特定的取舍和计算来记录和还原这个信息 , 这个过程称为编解码 , 一般这种方式都属于有损压缩 。分页标题#e#
先将任何信息转化为10进制数字的排列组合 , 那么这一串排列组合一定会出现在π当中 , 因为π是一个无理数 , 包含了所有可能的数字的排列组合 。 那么我们只要记录这串信息是从第几位开始到第几位结束就可以了 。 不管多长的信息 , 都可以用两个数字 , 记录开始和结束的位置 。 但是计算派是一个工程量极大的事情 , 也许有一天计算机速度足够快 , 在瞬间可以完成π的极长位数的计算 , 那么信息传输就再也不是问题 。
有人说 , 如果外星人来到地球 , 找一个棍棒 , 在中间做个记号就可以把地球的大量数据带走了 , 棍子的两个部分相除就可以得到应该有的数据 。 至于二进制表示还是十进制表示都是可以的 。 但现实中的问题是要想得到精度这么高的数据 , 相除的两个数也是精度比较大的数(正好遇到1除以3得到循环小数的来表示应存储的数太巧合) 。 如果真有这么两个数相除能得到应存储的数据 , 具体计算的时候都计算机的精确度是有要求的 , 程序设计语言中对整数的取值范围都有要求 , 关键的地方就是计算机的处理能力不是无限的 。
首先计算机表示小数就要用浮点方式 , 二进制表示的小数是补码形式 , 实际上表示的数字并不是你输入的小数 , 只是在你预期的精确度内近似相等 , 但不是数学意义上的相等 , 你压缩过程用除法 , 解压过程用乘法 , 那么逆运算的结果肯定不是你之前输入的数据 。
准确说 , 这个压缩的不是原文件 , 而是保存下这个文件的算法 , 以及后期计算时需要的关键数据 。 解压缩时 , 通过算法和关键数据来恢复整个文件 。 类似游戏 , 比如某个3D游戏中某个渲染的场景 , 这个场景中的所有看到的物体都是即时渲染出来的 , 不是贴图 。 那么实际上游戏引擎就是在依据开发者写入的关键数据进行即时计算后呈现出来 。
我们都知道2×2×2…不断乘下去很快就能达到一个极大的数字 。 那么反过来把一个极大的数字不断除以2就可以很快得到一个极小的数字 , 最终的数据只需要记录除以2的次数以及哪几次除以2后有余数1即可 。
我认为可以 , 而且是无损压缩 , 但有几点需注意 , 一是这个十进制小数不可能展开成二进制存储 , 否则又回去了;二是并不能保证每个大位数的十进制小数表示两个整数的商时(总是可以表示的 , 这个没问题) , 这两整数的位数之和总是小于原数的位数 。

来源:(历史深度解秘)
【】网址:/a/2021/0219/kd722000.html
标题:算法|客观地说:能否把1GB的数据压缩到1MB,甚至更小的体积呢?