霍夫曼编码没有查找表的单个字符

时间:2019-02-09 02:52:02

标签: c++ c algorithm huffman-code

我正在尝试实现霍夫曼编码,无法在不生成查找表的情况下弄清楚如何使用特里编码字符。我不想做的是生成每个字符与其编码的位字符串的映射。我正在尝试编写一种方法,该方法采用霍夫曼(Huffman)Trie的根和一个字符,并吐出正确的代码。

我写了下面的代码,这些代码无法正常工作。问题是,我不知道如何在得到正确的结果后停止它。到达正确的叶节点后,它将继续添加到代码中。

string lookup(HuffNode* root, char c, string prevCode, string direction){
  string currentCode = prevCode + direction;
  if(!root->isLeaf()){
    currentCode = lookup(root->getLeft(), c, currentCode, "0");
    currentCode = lookup(root->getRight(), c, currentCode, "1");
  }else{
    if(root->getChar() == c){
      return currentCode;
    }else{
      return prevCode;
    }
  }

  return currentCode;
}

string encodeChar(HuffNode* trie, char c){
  return lookup(trie, c, "", "");
} 

从特里获得字符编码的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

每次要发出代码时都必须搜索树的一大块,这将是非常低效的。实际上,您应该为每个符号制作一个代码表。

无论如何,您需要做的是将代码构建在一个通过引用传递的单个字符串中。不要返回字符串。 (在原始通过引用传递的字符串中完成所有操作后,它就会在那里。)如果在叶中找到该符号,则返回true或false。然后,当您在每个分支上调用lookup()时,请查看其是否返回true。如果是这样,则立即返回true。对于每个呼叫,将适当的位添加到字符串(0或1)。如果第二个分支返回false,则删除添加的位,然后返回false。

然后,如果原始调用找到了符号,则它将返回true,并且字符串将具有代码。如果返回false,则说明该符号不在任何叶子中,并且该字符串为空。