1
6
我同意keraba的观点,你需要使用像huffman编码或者lempel-ziv-welch算法之类的东西。比特打包的问题在于你有两个选择:
第一个选项相对容易实现,但除非所有整数都很小,否则确实会浪费很多空间。 第二个选项的主要缺点是必须在输出比特流中以某种方式传递n的变化。例如,每个值都必须有一个与之关联的长度。这意味着您要为每个输入值存储两个整数(尽管是较小的整数)。使用这种方法很有可能增加文件大小。 huffman或lzw的优点是它们创建码本的方式使得代码的长度可以从输出比特流中导出,而不必实际存储长度。这些技巧可以让你非常接近香农极限。 我决定给你的原始想法(常数n,删除未使用的位和包)一个有趣的尝试,这里是我想出的天真的实现:
这是非常低效的,因为一次只执行一个步骤,但这是实现它而不处理持久性问题的最简单方法。我也没有用大范围的值来测试这个,只是测试中的值。此外,没有边界检查,并且假设输出缓冲区足够长。所以我要说的是,这个代码可能只适合教育目的,让你开始。 |
2
5
大多数压缩算法都会接近对整数进行编码所需的最小熵,例如huffman编码,但是像数组一样访问它是不容易的。 |
3
5
今天我发布了: PackedArray: Packing Unsigned Integers Tightly ( github project )
它实现了一个随机访问容器,其中的项在位级别打包。换句话说,它的行为就好像你能够操纵一个
|
4
2
我知道这似乎是一个显而易见的说法,因为我确信实际上有一个解决方案,但是为什么不使用较小的类型,比如
关于学术练习, Bit Twiddling Hacks 是一本好书。 |
5
1
如果您有固定的大小,例如您知道您的数字是38位而不是64位,那么您可以使用位规范来构建结构。有趣的是你还有一些小元素可以放在剩下的空间里。
如果没有一些跳跃,这不是大/小端的安全,因此只能在程序中使用,而不能在导出的数据格式中使用。它经常用于将布尔值存储在单个位中,而不定义移位和掩码。 |
6
1
从jason b的实现开始,我最终编写了自己的版本,它处理位块而不是单个位。一个区别是它是lsb:它从最低的输出位开始到最高的输出位。这只会使使用二进制转储文件(如Linux)进行读取变得更加困难
|
7
0
我认为您不能避免在元素之间迭代。 afaik-huffman编码需要“符号”的频率,除非知道生成整数的“进程”的统计信息,否则必须计算(通过遍历每个元素)。 |
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |