无法理解使用此自定义方案压缩和解压缩整数排序列表的 SO 答案 [重复]

Not able to understand an SO answer on compressing and decompressing a sorted list of integers using this custom scheme [duplicate]

提问人:dearn44 提问时间:11/9/2023 最后编辑:HolyBlackCatdearn44 更新时间:11/10/2023 访问量:78

问:

我偶然发现了这个答案,我不确定我是否理解它是如何工作的。具体而言,大部分原始值使用以下代码进行编码:

// Code num values.
uint64_t code = 0;
size_t k = 1;
do {
  code += k * data[i++];
  k *= i;
} while (--num);

然后声称下面的代码将返回原始值:

// Extract num values from code.
do {
  i++;
  data.push_back(code % i);
  code /= i;
} while (--num);

但是,我不确定我是否理解这怎么可能。如果我们使用一些随机数据运行它,例如:

d = [8, 18, 36]

那么我们将有:

编码

k   d[1]     Code
-----------------
1 * 8  = 8   8
2 * 18 = 36  44
6 * 36 = 216 260

不过,我不确定如何使用建议的程序取回原始数据。

我错过了什么吗?

C++ 压缩

评论


答:

4赞 Mark Adler 11/9/2023 #1

阅读整个答案会有所帮助。特别是,我回答开始时的假设,来自 OP:

每个值必须小于其索引,索引从 1

您的示例不符合该约束。