Huffman的数据压缩填充和反转代码问题

时间:2014-10-22 18:26:57

标签: c++ compression huffman-code

我刚开始学习霍夫曼的数据压缩算法,我需要有关以下功能的帮助> filltable()和invertcode()

我不明白为什么需要一个可编码表数组。

while (n>0){
   copy = copy * 10 + n %10;
   n /= 10;
}

请帮助我理解这部分函数的作用以及为什么如果n大于0则除以10,因为无论你将它除了多少次,它总是大于0。

代码链接:http://www.programminglogic.com/implementing-huffman-coding-in-c/

void fillTable(int codeTable[], Node *tree, int Code){

    if (tree->letter<27)
        codeTable[(int)tree->letter] = Code;
    else{
        fillTable(codeTable, tree->left, Code*10+1);
        fillTable(codeTable, tree->right, Code*10+2);
    }

    return;
}
void invertCodes(int codeTable[],int codeTable2[]){
    int i, n, copy;

    for (i=0;i<27;i++){
        n = codeTable[i];
        copy = 0;
        while (n>0){
            copy = copy * 10 + n %10;
            n /= 10;
        }
        codeTable2[i]=copy;
}

**编辑**

为了使这个问题更清楚,我不需要对霍夫曼编码和解码进行解释,但我需要解释这两个函数如何工作以及为什么需要代码表。

2 个答案:

答案 0 :(得分:1)

n是一个int。因此,它会随着时间的推移减少到0。如果n在第一次迭代时从302开始,则在第一次n /= 10;之后将减少到30。在while循环的第二次迭代结束时,它将在第四次迭代结束时减少到3.它将等于0(int 4 / int 10 = int 0)。

这是整数数学。没有小数位可以扩展到无穷大。

答案 1 :(得分:1)

我对示例程序进行了一些小的更新,以包含数据代码的结尾。原始示例代码可以在解压缩时在原始数据的末尾附加一个额外的字母。此代码中还有很多“硬编码”的东西,比如代码的数量,这是27,我改为28,包括我添加的数据代码的结尾,以及我输出的文件名。更改为“compress.bin”(如果压缩)或“output.txt”(如果解压缩)。它不是最佳实现,但可以用作学习示例。如果您使用源代码级调试器来执行代码,将会有所帮助。

http://rcgldr.net/misc/huffmanx.zip

更现实的霍夫曼程序将使用表格进行编码和解码。编码表使用输入代码编制索引,每个表条目包含两个值,代码中的位数和代码本身。解码表的索引是由确定代码所需的输入流中的最小位数组成的代码(它至少为9位,但可能需要为10位),并且该表中的每个条目都包含两个值,实际的位数,以及该代码表示​​的字符(或数据的结尾)。由于实际位数可能小于用于确定代码的位数,因此在从压缩文件读取数据之前,需要对剩余位进行缓冲和使用。

类似霍夫曼的过程的一个变体是使代码的长度由每个代码的前导位确定,以减小解码表的大小。