我正在努力在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
答案 0 :(得分:0)
您正在使用一个Uint8 = 1字节=每位8位来编码位序列。因此,您的“压缩”程度比需要的要差8倍。
首先创建一个数据结构,每个字节可以存储8位。