[英]Huffman Decoding Algorithm
解碼時,我無法建立霍夫曼樹的結構。
現在,我通過以下方式對樹進行編碼:樹是否有子級以前綴0
,如果沒有子級則以1
。
例如,像(a,b,c,d)
的樹將被編碼為001a1b01c1d
,其霍夫曼代碼為
00|01|10|11
注: |
是為了清楚起見添加的,實際上不在標題中。
這是圖形形式的樹:
/ \
/\ /\
a b c d
現在,當我嘗試使用001a1b01c1d
重建樹時,我遇到的問題是如何正確地重建樹,因為我不確定返回到樹時要檢查的內容(上升的距離)。
Here is the code the index was only added just to try the word 'random' obviously it doesn't work for other cases. I am thinking of using the depth of the tree somehow
void Tree::build(std::queue<char> encodedHeader) {
char currentChar;
this -> thisRoot = new HCNode(0, '\0',0,0,0);
HCNode * newRoot = new HCNode (0,'\0',0,0,0);
HCNode * childZero = new HCNode (0, '\0', 0,0,0);
HCNode * childOne = new HCNode (0, '\0', 0,0,0);
childZero -> p = newRoot;
childOne -> p = newRoot;
newRoot -> c0 = childZero;
newRoot -> c1 = childOne;
this -> foreverRoot = newRoot;
while(!header.empty()) {
currentChar = header.front();
header.pop();
if(currentChar != '\n') {
if (currentChar == '0') {
HCNode * childZero = new HCNode (0, '\0', 0,0,0);
HCNode * childOne = new HCNode (0, '\0', 0,0,0);
child0 -> p = newRoot;
child1 -> p = newRoot;
newRoot -> c0 = childZero;
newRoot -> c1 = childOne;
currentChar = header.front();
while (currentChar == '0') {
newRoot = newRoot -> c0;
header.pop();
currentChar = header.front();
HCNode * childZero = new HCNode (0, '\0', 0,0,0);
HCNode * childOne = new HCNode (0, '\0', 0,0,0);
childZero -> p = newRoot;
childOne -> p = newRoot;
newRoot -> c0 = childZero;
newRoot -> c1 = childOne;
}
}
else {
currentChar = header.front();
header.pop();
if(newRoot -> c0 != NULL) {
newRoot -> c0 -> symbol = currentChar;
newRoot = newRoot -> c1;
}
else {
newRoot -> symbol = currentChar;
while(newRoot -> p != NULL && index != 2) {
index++;
newRoot = newRoot -> p;
}
index = 0;
newRoot = newRoot -> c1;
}
}
}
}
實際上,我只是寫了一些代碼來完成此操作,而您使用的頭格式與我使用的完全相同。 我發現的竅門是,這很容易遞歸實現,如下所示:
Node read_tree(some_input input, string current_code = "") {
Node node;
if (input.readchar() == '0') {
node.left = read_tree(input, current_code + "0");
node.left.parent = node;
node.right = read_tree(input, current_code + "1");
node.right.parent = node;
} else {
node.code = input.readchar();
}
return node;
}
顯然,您需要使用自己的更實際的類型執行類似的操作,但是基本思路應該起作用。
首先,我對我的英語感到非常抱歉(這不是我的母語:-)。 通常,建議通過遞歸來解決樹木問題,這也是一個很好的建議。 這是我認為可以工作的代碼(我沒有對其進行測試,因此可能需要一點工作):
buildTree(std::queue<char> header, HCNode* node)
{
char currentChar = header.front();
header.pop();
if(currentChar == '0')
{
childZero -> p = newRoot;
childOne -> p = newRoot;
node->c0 = new HCNode (0, '\0', 0,0,0);
node->c1 = new HCNode (0, '\0', 0,0,0);
node->c0->p = node;
node->c1->p = node;
buildTree(header, node->c0); // this is the recurtion
buildTree(header, node->c1); // this is the recurtion too
}
else // currentChar == '1'
{
currentChar = header.front();// currentChar = symbol
header.pop();
node-> symbol = currentChar;
}
}
void Tree::build(std::queue<char> encodedHeader)
{
this->foreverRoot = new HCNode(0, '\0',0,0,0);
buildTree(header, foreverRoot);
}
我希望這會有所幫助。 祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.