在哈夫曼编码压缩程序中应该如何存储哈夫曼编码?

来源:百度知道 编辑:UC知道 时间:2024/09/23 08:55:33
如果按照ASCII字符作为源文件中可能出现符号的话,一共可能有256种符号,那么在一种极端情况下,可能形成一个这样的树:
/\
/\
/\
/\
/\
/\
/\
...

也就是说有一个ASCII码出现的概率是其他所有ASCII码出现概率的总和;他的子节点中,有一个子节点出现的概率又是其它所有子节点出现概率的总和,依次类推。
那么这样形成的树应该有128层,那么翻译成哈夫曼编码的话有一个编码长达128个bit,可是我现在知道的数据类型最大只有Int64,才64bit长,存不下这么长的编码。
我做了个用字符串存编码的版本,处理速度巨慢。
我看了2个别人写的c++哈夫曼编码压缩程序用什么类型存编码,一个用了unsigned long,一个用了DWORD,这两个都只有32bit长,这岂不是有很多种树都存不下吗?
请问应该如何高效的存储哈夫曼编码呢?
那个树的模型格式不对,我再传一次:
______/\
_____/\
____/\
___/\
__/\
_/\
/\
...

我想你理解错了……你所说的128Bit是编码和解码时用的
树怎么保存,方法很多,最简单的办法是为0x00到0xFF按它们出现的频率保存顺序;因为只有256个元素,所以用1字节就能保存到它们的顺序,例如
0x00 0x05
0x01 0x04
0x02 0xF5
……
……
要保存这种表示方式也只是要512字节而已;重建树的时候重再根据这些数据来把树创建出来就是了;

最后建议你把哈夫曼编码原理重新再看一次,是看“原理”

你用两个64位的存储啊
假如这个编码为data
long a[2];
前面8bit存取data/(2^8)
后面8bit存取data%(2^8) 不就完了