寻求更好的编码和压缩数字的方法
seeking a better way to code and compress numbers
我有 13 个数字,从一组包含 13 种数据类型的集合中抽取,每种类型有 4 个项目,因此总共有 52 个项目。我们可以将项目编号为 1,2,3,4,5,6,7,8,9,10,11,12,13,因此将有 4 个"1"、4"2"、...4"13"在套装中。从集合中抽取的 13 个数字是随机的。整个过程重复了数百万次甚至更多,所以我需要一种有效的方法来存储 13 个数字。我想使用某种编码方法将 13 个整数压缩成位。例如,我数了多少个"1"、"2"......首先,用 2 位对每个项目的计数进行编码,并再使用 1 位来表示该项目是否已绘制。所以对于每个项目,我们需要 3 位,总共 13 个项目需要 39 位。它肯定需要 8 个字节才能做到这一点。但是它仍然太多了,因为我谈论的是数百万或数十亿次的计算,并且每个集合都必须在以后存储到文件中。因此,如果我使用 8 个字节,if 仍然会要求大约 80GB 的数据。但是,如果我能将其减少一半,我将节省 40GB。知道如何更有效地压缩此结构吗?我也想使用 5 个字节代替,但比我需要处理不同类型的数字(一个 int + 一个字符),c++ 中是否有任何库可以轻松地为我进行编码/压缩?
谢谢。
Google的Protocol Buffers可以存储位数较少的整数,具体取决于其值。它可能会大大减少您的存储空间。见 http://code.google.com/p/protobuf/
实际协议描述如下:https://developers.google.com/protocol-buffers/docs/encoding
至于压缩,你有没有看过 zlib 如何处理你的数据?
使用您的方案,每只 39 位的手牌由 8 个字节的 64 位表示,将浪费 25 位,大约 40%。
如果你把手分批放在一起,你可以代表它们而不会浪费这些位。
39和 64 没有公因数,因此最低公倍数只是倍数 39 * 64 = 2496 位或 312 字节。这可容纳 64 手,大约是您当前计划规模的 60%。
尝试谷歌搜索LV77和LVZ压缩
也许比你寻找的要复杂一些,但看看HDF5。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- C++中高效的大型稀疏块压缩线性方程
- 嵌入方指针压缩已禁用
- C++使用整数的压缩数组初始化对象
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 在C++中将函数压缩为两种方式
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- 如何在 cpp 中解压缩数字,如果它们是使用 struct.pack(fmt, v1, v2, ..) 打包在 pyth
- 如何压缩一个非重复数字大小的N位序列?
- 高度压缩数字网格
- 寻求更好的编码和压缩数字的方法
- 如何压缩一串数字