寻求更好的编码和压缩数字的方法

seeking a better way to code and compress numbers

本文关键字:压缩 数字 方法 编码 更好      更新时间:2023-10-16

我有 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。