数据压缩方案,数学

Posted

技术标签:

【中文标题】数据压缩方案,数学【英文标题】:Data compression scheme, math 【发布时间】:2011-01-10 20:59:20 【问题描述】:

我有大约 42,000 个包含 24 个随机数的列表,全部在 [0, 255] 范围内。例如,第一个列表可能是 [32, 15, 26, 27, ... 11]。第二个列表可能是 [44, 44, 18, 19, .. 113]。如何从每个列表中选择一个数字,以便(所以我最终会得到一个包含大约 42,000 个数字的新列表),这样这个新列表最适合使用 ZIP 压缩?

-- 这个问题与数学、数据压缩有关

【问题讨论】:

这是一个家庭作业问题吗?如果有,请添加homework 标签。 没有。我正在尝试解决marknelson.us/2006/06/20/million-digit-challenge 的 AMillionRandomDigits.bin 压缩挑战(请参阅我的 pete6 帖子)。 你不能压缩真正随机的数据。 【参考方案1】:

ZIP 文件格式使用DEFLATE 作为其压缩算法。因此,您需要考虑该算法的工作原理并选择数据,以便该算法易于压缩。根据***的文章,有两个压缩阶段。第一个使用LZ77 查找重复的数据部分并用短引用替换它们。第二个使用Huffman coding 获取剩余数据并去除整个块中的冗余。这称为熵编码 - 如果信息不是非常随机(熵低),则代码会用短符号替换常见事物,从而增加熵。

一般来说,具有大量重复运行的列表(即 [111,2,44,93,111,2,44,93...])将在第一轮中很好地压缩。在其他随机内容中包含大量重复数字的列表(即 [111,34,43,50,111,34,111,111,2,34,22,60,111,98,2],其中 34 和 111 经常出现)将在第二遍。

要找到合适的数字,我认为最简单的做法是对每个列表进行排序,然后合并它们,保持合并排序,直到得到 42000 个输出数字。当它们发生时,你会得到运行。这不是最优的,您可能在每个输入列表中都有数字 255,而使用这种技术您会错过它们,但这很容易。

另一种方法是将数字直方图分成 256 个 bin。任何突出的 bin 都表示应该分组的数字。在那之后,我想你必须搜索序列。同样,对输入进行排序可能会使这更容易。

我刚刚注意到你有一个限制,你必须从每个列表中选择一个数字。因此,在这两种情况下,您都可以对每个列表进行排序,然后删除重复项。

此外,霍夫曼代码可以使用树生成,所以我想知道是否有一些神奇的树结构可以将数字放入其中自动给出正确答案。

【讨论】:

【参考方案2】:

这对我来说闻起来是 NP 完全的,但我无法证明这一点。在外部,大约有 7.45e+57968 (!) 种可能的配置需要测试。您似乎无法提前选择退出特定配置,因为不可压缩的初始部分稍后可能会大大压缩。

我对“良好”压缩的最佳猜测是计算整个百万元素集合中每个数字的出现次数,并从每个列表中选择出现次数最多的数字。例如,如果每个列表中都存在42,则仅选择它会为您提供一个非常可压缩的数组,其中包含 42,000 个相同值的实例。

【讨论】:

以上是关于数据压缩方案,数学的主要内容,如果未能解决你的问题,请参考以下文章

数据流压缩原理实现(huffman编码,LZ77压缩算法)

图像压缩基于分形编码图像压缩matlab源码

ZIP压缩算法详细分析及解压实例解释

压缩当前数据库

Java数据结构之对称矩阵的压缩算法---

读数据压缩入门笔记02_二进制和熵