Algorithm 对于哈夫曼代码,我应该避免以0(零)开头的多位代码吗?

Algorithm 对于哈夫曼代码,我应该避免以0(零)开头的多位代码吗?,algorithm,greedy,huffman-code,Algorithm,Greedy,Huffman Code,当我使用哈夫曼贪婪算法构造二叉树时,如果四个字母的概率相等,我得到以下结果: 00 01 十, 十一, 问题是,我的程序只将00和01视为0和1。我是否应该将以0(零)开始的代码长度限制为1(一)?应该使用什么数据类型来存储哈夫曼代码或其单个位?如果您的“程序仅将00和01视为0和1”,则您的程序存在错误 对于四个等概率符号,代码实际上是00、01、10和11。这意味着您需要在解码时查找所有这些位。解码时,先从左边拉位。所以你得到一个0。这意味着代码不是00就是01。然后你拉下一点。是1。现

当我使用哈夫曼贪婪算法构造二叉树时,如果四个字母的概率相等,我得到以下结果:

  • 00
  • 01
  • 十,
  • 十一,
问题是,我的程序只将00和01视为0和1。我是否应该将以0(零)开始的代码长度限制为1(一)?应该使用什么数据类型来存储哈夫曼代码或其单个位?

如果您的“程序仅将00和01视为0和1”,则您的程序存在错误

对于四个等概率符号,代码实际上是00、01、10和11。这意味着您需要在解码时查找所有这些位。解码时,先从左边拉位。所以你得到一个0。这意味着代码不是00就是01。然后你拉下一点。是1。现在你有了完整的代码01。发出相应的符号,然后重新开始

对于概率不相等且代码长度不同的更典型的情况更容易看到。考虑这个代码:

a - 0
b - 10
c - 110
d - 111
要解码,您需要从流中提取位。第一位是1。现在你知道它一定是a,b,c或d。现在你再拉一个1。你可以把它降到c或d。你拉一个0,现在你知道它的d。你从一开始就从下一位开始

在开始提取位并缩小选择范围之前,您不知道代码的长度。解码后,您将知道代码的长度。

如果您的“程序仅将00和01视为0和1”,则您的程序存在错误

对于四个等概率符号,代码实际上是00、01、10和11。这意味着您需要在解码时查找所有这些位。解码时,先从左边拉位。所以你得到一个0。这意味着代码不是00就是01。然后你拉下一点。是1。现在你有了完整的代码01。发出相应的符号,然后重新开始

对于概率不相等且代码长度不同的更典型的情况更容易看到。考虑这个代码:

a - 0
b - 10
c - 110
d - 111
要解码,您需要从流中提取位。第一位是1。现在你知道它一定是a,b,c或d。现在你再拉一个1。你可以把它降到c或d。你拉一个0,现在你知道它的d。你从一开始就从下一位开始


在开始提取位并缩小选择范围之前,您不知道代码的长度。解码后,您将知道代码的长度。

我的程序将00和01仅视为0和1是什么意思?如果我在哈夫曼代码生成结束时将四个值(即00、01、10、11)中的每一个存储在整数数组中,我在查找过程中得到的值分别为0、1、10、11。(假设实际字符“a”、“b”、“c”和“d”存储在另一个类型字符数组中。索引0、1、2、3将用于查找)。也就是说,0是00,1是01。有什么问题吗?1(a的代码)是前缀11(d的代码)。哈夫曼代码是关于前缀自由的代码。因此,在这种情况下,我是否应该排除01(并反过来排除1)作为可能的哈夫曼代码?我的程序将00和01仅视为0和1是什么意思?如果我在哈夫曼代码生成结束时将四个值(即00、01、10、11)中的每一个存储在整数数组中,我在查找过程中得到的分别是0、1、10、11。(假设实际字符“a”、“b”、“c”和“d”存储在另一个类型字符数组中。索引0、1、2、3将用于查找)。也就是说,0是00,1是01。有什么问题吗?1(a的代码)是前缀11(d的代码)。哈夫曼代码是关于前缀自由的代码。因此,在这种情况下,我应该排除01(进而排除1)作为可能的哈夫曼代码吗?我如何将每个哈夫曼代码的大小信息传递给查找函数?如果“a”的值是二进制数“0000”(例如,存储在C中的char变量中),那么查找函数将如何决定哈夫曼代码的大小,特别是因为哈夫曼代码都是关于可变长度的代码。当您完成哈夫曼代码的解码时,而不是之前,您将决定哈夫曼代码的长度。这是什么意思“解码完成后确定哈夫曼代码的长度”?你能举例说明吗?我如何将每个哈夫曼代码的大小信息传递给查找函数?如果“a”的值是二进制数“0000”(例如,存储在C中的char变量中),查找函数将如何决定哈夫曼码的大小,特别是因为哈夫曼码都是关于可变长度的码。哈夫曼码的长度是在解码完成后确定的,而不是在解码之前。什么是“在解码完成后确定哈夫曼码的长度?”"? 你能举例说明吗?