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

压缩随机32位整数:我们离香农熵有多近?

冯鸿光
2023-03-14

我开发了一种无损压缩算法,将32位整数(频率/概率未知)压缩到每整数31.95824位(对于较小的值,它的效果更好,就像大多数压缩算法一样)。显然,不可能将均匀分布的随机数据压缩到小于其未压缩大小。

因此,我的问题是,假设32位整数,对于伪随机数据,哪些无损压缩算法最接近每整数32位的香农熵?

本质上,我在寻找一个表,其中包括压缩算法和它们各自的位/整数值,用于正的、压缩的、32位整数。

共有3个答案

韩彦君
2023-03-14

这正是分位数压缩(https://github.com/mwlon/quantile-compression/)其目的是:对从数字分布中提取的数字进行无损压缩。我不知道还有其他算法可以做到这一点。您可以在自述文件中看到其结果与理论最优值。它也适用于浮动和时间戳!我不确定你的分布是什么,但现实世界中的分布通常每个数字只需要几位

它的工作原理是将序列中的每个数字编码为一个粗略数字范围的哈夫曼码,然后是该范围内精确位置的偏移量。

卫烨
2023-03-14

恒等式函数需要每32位整数正好32位,这是很难做到的。(如果坚持更改数据流,还有许多其他保持长度的双射。)

我不清楚你会用什么其他标准来html" target="_blank">推荐比这更糟糕的算法。也许您认为输入流不是真正的统一样本;相反,它仅限于(或明显偏向)宇宙的一个子集,但你无法先验地知道该子集是什么。在这种情况下,流的熵小于1(如果子集的大小有一个合理小于宇宙大小的上限),您可能能够实际压缩输入流。

值得注意的是,除非消息是固定长度的,否则在计算熵时需要考虑消息的长度,包括分子和分母。对于很长的消息,这通常可以忽略,但如果消息很短,则消息分隔符(或显式长度指示器)的成本可能会很大。(否则,“压缩”到原始大小的103%有点像HumptyDumpty对“压缩”的定义。)

金皓君
2023-03-14

当你说“它对较小的值更有效”时,我假设你有一个从32位整数到可变位长度表示的转换,该转换针对一些非均匀的预期值分布进行了优化。然后,应用于32位值的均匀分布的相同转换必然需要平均超过32位。还有多少取决于你开始时的分布有多不均匀。

所以答案是,您当然可以通过对数字完全不做任何事情来精确地获得32位。但是,您并没有针对您设计的非均匀分布所隐含的应用程序进行优化。

 类似资料:
  • 我正在寻找使用AVX将压缩的32位整数除以2(即右移1)的最快方法。我没有访问AVX2的权限。据我所知,我的选择是: 下拉至SSE2 如果我需要去SSE2,我会很感激最好的SSE2实现。如果是2),我想知道要使用的内在函数,以及是否有更优化的实现来专门除以2。谢谢!

  • Android API提供了保存位图对象的方法。我创建了一个示例应用程序,它将jpeg图像(一些嘈杂的相机照片)加载到位图中,然后将其压缩回同一个文件。然后,再做5次。 显然,我的位图积累了压缩伪影。让我惊讶的是,这些伪影的数量以一种奇怪的方式取决于压缩的质量。当我将质量设置为100(我认为这是最好的质量)时,工件清晰可见。当我将质量降低到90时,工件的可视性明显降低。质量设置为80会给我最好的效

  • 主要内容:压实问题我们知道动态分区受到外部碎片的影响。 但是,这可能会导致一些严重的问题。 为了避免压缩,我们需要更改规则,该规则指出进程无法存储在内存中的不同位置。 也可以使用压缩来减少外部碎片的可能性。 在压缩过程中,所有的空闲分区都是连续的,所有加载的分区都集中在一起。 通过应用这种技术,可以将更大的进程存储在内存中。 合并可用分区,现在可以根据新进程的需要分配这些分区。 这种技术也称为碎片整理。 如上图所示

  • 我在c编程方面是个新手,我正试图弄清楚更多关于位的知识,二进制E.c.T 例如,我有三个二进制int变量m1=255或11111111;m2=255或11111111(二进制),m3=255或11111111(二进制),m4=0或00000000(二进制)。我试图把所有的主题放在一起到单一的int变量temp。类似于(11111111 11111111 1111111100000000)这里是我的

  • 问题内容: 我知道有人多次问过这个话题,但是 我的问题是关于完整32位int的溢出 。例如: 我发现话题与这个类似的问题,但该算法是不完美的。 有没有简单,快速,安全的方法来检查此内容? 问题答案: 从Java 8开始,该类中提供了一组方法: …以及很长的版本。 如果发生溢出,这些方法中的每一个都会引发。否则,如果它在该范围内,它们将返回正确的结果。 添加示例: 看到此代码在IdeOne.com上

  • 问题 你想要获得两个整数(包含在内)之间的一个随机整数。 解决方案 使用以下的函数。 randomInt = (lower, upper) -> [lower, upper] = [0, lower] unless upper? # 用一个参数调用 [lower, upper] = [upper, lower] if lower > upper #