我正在尝试实现霍夫曼编码,无法在不生成查找表的情况下弄清楚如何使用特里编码字符。我不想做的是生成每个字符与其编码的位字符串的映射。我正在尝试编写一种方法,该方法采用霍夫曼(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, "", "");
}
从特里获得字符编码的正确方法是什么?
答案 0 :(得分:3)
每次要发出代码时都必须搜索树的一大块,这将是非常低效的。实际上,您应该为每个符号制作一个代码表。
无论如何,您需要做的是将代码构建在一个通过引用传递的单个字符串中。不要返回字符串。 (在原始通过引用传递的字符串中完成所有操作后,它就会在那里。)如果在叶中找到该符号,则返回true或false。然后,当您在每个分支上调用lookup()
时,请查看其是否返回true。如果是这样,则立即返回true。对于每个呼叫,将适当的位添加到字符串(0或1)。如果第二个分支返回false,则删除添加的位,然后返回false。
然后,如果原始调用找到了符号,则它将返回true,并且字符串将具有代码。如果返回false,则说明该符号不在任何叶子中,并且该字符串为空。