问题描述
这是我在堆栈溢出中的第一个问题。很长,但我已经详细解释了,我认为这是可以理解的。
我正在用 C++ 编写霍夫曼代码,并将字符和代码保存在这样的表格中:
文本:AAAAAAAAAAAAAAAAAAABBBBBBBCCCCddddEEEE
表:(由霍夫曼树制作) Table
现在,我想以最佳方式将此表保存到文件中。
我不能这样保存:A1B001C010D001E000
当它变成位时:01000001101000010001010000110100100010000101000101000
因为我无法解码。
如果我以正常方式保存表格,每个字符使用8位来保存它的代码。
这种方式会占用大量存储空间。
如果我们添加一个分隔符并制作哈夫曼树并编写代码,则有一个这样的表格。 table2
现在,我们可以这样写代码了。
A0SepB110SepC100SepD1111sepE1110sep。
二进制= 0100000101010100001011010101000011100101010001001111101010001011110101
我是这样解码的:
sep = 101。
- 读取 8 位:01000001 -> 是 A。
休息 = 01010100001011010101000011100101010001001111101010001011110101。
- 读取 1 位:0(与 sep1 不同)
- 读取 1 位:1(如 sep1),读取 1 位:0(如 sep2),读取 1 位:1(如 sep3(end))
- Sep 被找到,所以 A = 一切都在 sep = 0 之前;
休息 = 0100001011010101000011100101010001001111101010001011110101。
- 读取 8 位:01000010 -> 是 B。
休息 = 11010101000011100101010001001111101010001011110101。
- 读取 1 位:1(如 sep1)- 读取 1 位:1(与 sep2 不同)
- 读取 1 位:0(与 sep1 不同)
- 读取 1 位:1(如 sep1)- 读取 1 位:0(如 sep2)- 读取 1 位:1(如 sep3(end))
- 找到了 Sep,所以 B = 一切都在 sep = 110 之前;
等等......
这种方式仍然使用一点存储分隔符(字符数*分隔符大小)
我的问题:有没有办法将第一个表保存在文件中并使用更少的存储空间?
例如:A1B001C010D001E000。
解决方法
不要保存带有代码的表格。只需保存长度。见Canonical Huffman Code。