繁体   English   中英

霍夫曼的数据压缩填充表和代码反转问题

[英]Huffman's Data compression filltable and invert code problems

我刚刚开始学习霍夫曼的数据压缩算法,并且需要以下函数的帮助> 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;
}

**编辑**

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM