自适应(动态)霍夫曼编码:对来自文件的数据进行编码和解码

时间:2015-03-28 04:45:28

标签: c huffman-code data-compression

我正在编写的程序应该编码/解码文件中的数据。

字母:8位ASCII码
所以我在这个字母表中有n = 256个符号,最大堆数是2n-1 = 511

我理解自适应霍夫曼编码的算法但我在实现它时遇到了一些问题。

我写了我的代码的第一部分,但我需要一些帮助才能顺利进行。

#define FIRST_NYT 511

struct huffcode {
    int nbits;
    int code;
};

typedef struct huffcode code;

struct huffheap {
    char symbol;    /* character contained in tree node */
    int weight; /* number of times symbol has occured in file so far */
    int order;  /* ordering system, root has order number 511 */

    struct huffheap *left;
    struct huffheap *right;
    struct huffheap *parent;

};

typedef struct huffheap *heap;


static heap heap_create(int symbol, struct heap *root){
    /* if tree is empty, add root */
    if(heap = NULL) {
        heap = (huffheap*)malloc(sizeof(*heap));
        heap- >symbol = /* i dont know what i should when heap doesnt has a symbol like NYT */
        heap- >weight = 0;
        heap- >order = FIRST_NYT;
        heap- >left = NULL;
        heap- >right = NULL;
        heap- >parent = NULL;
    }

    /* TO_DO: check -> is the first time of this symbol ? */

    /* if yes -> add node */

}

以下是程序的链接:Algorithm

  1. 我的树结构是否正确?
  2. 我应该如何存储字母?我写了一个关于代码的结构,但我不知道如何处理符号列表 - > struct huffcode
  3. 我知道如何增加堆的重量等但我不能再进一步了。我有问题“看到这个符号之前/是这个符号在树上的第一次”

1 个答案:

答案 0 :(得分:0)

您可以为每个符号存储节点。

huffheap  sym[256];

你初始化它。

for (int i = 0; i < 256; i++) {
    sym[i].symbol = i;
}

如果parent为null,则这是您第一次将其插入树