霍夫曼压缩不会减少字节数的存储,并存储编码为0和1的树和填充

时间:2019-01-11 18:34:35

标签: swift bit-manipulation huffman-code

我正在努力在Swift中实现一种称为Huffman Coding的无损压缩算法。我从一个使用"1""0"的字符串的版本开始,但是后来了解到单个字符串,例如"0"本身占用了整个字节。现在,我已经将字符串转换为[UInt8](请参见packBits func)。似乎有人通过编写最终可以重构的BitWriter和BitReader来实现它,但是我认为我的方法最终至少得到了相同的[UInt8]结果,这肯定减小了{{1 }}与文本字节相比,但是我需要存储要遍历的树以及用于解码的填充。由于HuffData.code func返回encode(包含所有三个结构),因此我注意到它的大小实际上大于我传递给编码的文本的大小。

例如,一个HuffData等于8959字节,编码为大约21099字节的总数据!其中2763是树,5050是代码,2是填充。我假设的其余部分来自该结构?为什么这些不加起来?

paragraph.utf8.count

let huff = try? Huffman.encode(paragraph) =总数据字节

我想了解为什么这些字节数不累加,而我的代码中的原因导致总数明显大于文本。我是否需要处理更大的文本才能看到真实的结果?我可以用内存效率更高的方式存储树,代码和填充吗?为什么总数不等于树+代码+填充?序列化数据会增加更多字节吗?感谢您的建议!

huff.count

1 个答案:

答案 0 :(得分:0)

您正在使用一个Uint8 = 1字节=每位8位来编码位序列。因此,您的“压缩”程度比需要的要差8倍。

首先创建一个数据结构,每个字节可以存储8位。