微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以使用最少存储空间的方式将霍夫曼表保存在文件中?

如何解决如何以使用最少存储空间的方式将霍夫曼表保存在文件中?

这是我在堆栈溢出中的第一个问题。很长,但我已经详细解释了,我认为这是可以理解的。

我正在用 C++ 编写霍夫曼代码,并将字符和代码保存在这样的表格中:

文本:AAAAAAAAAAAAAAAAAAABBBBBBBCCCCddddEEEE

表:(由霍夫曼树制作) Table

现在,我想以最佳方式将此表保存到文件中。

我不能这样保存:A1B001C010D001E000

当它变成位时:01000001101000010001010000110100100010000101000101000

因为我无法解码。

如果我以正常方式保存表格,每个字符使用8位来保存它的代码

虽然我的角色有 1 位或 3 位代码。 (在这种情况下。)

这种方式会占用大量存储空间。

我的想法是添加一个分隔符并为其设置一个代码

如果我们添加一个分隔符并制作哈夫曼树并编写代码,则有一个这样的表格。 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。