小编Uen*_*enX的帖子

如何压缩一系列非重复数字大小的N位?

我试图压缩一系列非负数,其中:

  • 每个数字的取值范围为0到2 ^ N-1
  • 每个号码只出现一次(这意味着总共有2 ^ N个号码)

    N = 4的示例:

    [14,1,8,2,12,6,0,10,4,13,5,7,15,9,3,11]

因此通常每个数字将花费4位,对于16个数字,我们将不得不使用16x4 = 64位来存储它们.

目前我刚想到压缩它们如下:

  • 对于前8个数字 - >使用4位来存储它们中的每一个.
  • 对于接下来的4个数字--->每个只有3位
  • 对于接下来的2个数字--->每个只有2位
  • 对于接下来的1个数字--->只有1位.
  • 对于最后一个,实际上并不需要存储(显然,如果我们知道所有其他15个数字,我们应该知道最后一个数字是什么)

所以压缩的数据大小将是:

Z = 8 * 4 + 4 * 3 + 2 * 2 + 1 * 1 + 1 * 0 = 49 bits 
Run Code Online (Sandbox Code Playgroud)

压缩率约为76%,这是相当不错的(我认为).

但是对于较大的N值,该比率似乎会降低(对于N = 2048,该比率仅为91%)

所以我想听听你有关更好压缩的建议.

谢谢.

c++ compression algorithm

9
推荐指数
1
解决办法
763
查看次数

压缩大约2百万个数字序列的最佳方法是什么(值范围是1 - > 28)

我想压缩一个整数列表,其中:

  • 没有负数.
  • 项目的价值范围是[1 .... 28]
  • 列表中共有2482113个项目.
  • 目前我使用5位来存储每个数字.
  • "出现"统计数据如下

    • 1:1242149
    • 2:620038
    • 3:309399
    • 4:154983
    • 5:77816
    • 6:38601
    • 7:19651
    • 8:9790
    • 9:4830
    • 10:2447
    • 11:1253
    • 12:597
    • 13:303
    • 14:130
    • 15:73
    • 16:23
    • 17:17
    • 18:4
    • 19:4
    • 20:2
    • 21:1
    • 23:1
    • 28:1

所以请告诉我压缩这类数据的最佳方法(估计压缩比 - 如果可能的话 - 非常感谢).

algorithm integer list lossless-compression

-4
推荐指数
1
解决办法
448
查看次数