哈夫曼编码

摘要:哈夫曼算法主要用来构造最小编码树

(1)基本思路:

[1]将所有的ASCII字符定义为单节点树,将它的代价定义为 w=i=0(difi) ,将树的权定义为所有树叶的频率之和.

[2]每次选取两个最小代价的编码树,将它们合并,更新新树的权重.

[3]反复进行合并,直到只有一棵树.

(2)所用数据结构

[1]堆,每次选取最权重最小的树合并,将新的树入堆

#include "stdafx.h"
#include "堆.h"

tree combine(tree T1, tree T2)
{
    tree T3;
    if (T1->size > T2->size)
     T3 =   combine(T2,T1);

    else
    {
    T3 = (tree)malloc(sizeof(Treerecord));
    T3->Leftchild = T1;
    T3->Rightchild = T2;
    T3->size = T1->size+T2->size;
    T3->cost = T1->cost + T2->cost;

    }
    return T3;
}
tree Huffman(tree Symbol[],int N)
{
    Heap H = BuildHeap(Symbol,N);
    tree T1,T2,T3;
    while(1)
    {
      T1 = DeleteMin(H);
      T2 = DeleteMin(H);
      T3 = combine(T1,T2);
      Insert(H,T3);
    if (T3->size == N)
        break;
    }
    return T3;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Heap H;
    char S[] = {'a','e','i','s','t','E','n' };
    int Frequency[] = {10,15,12,3,4,13,1};
    int N = sizeof(S)/sizeof(char);
    tree Symbol[10];

    for(int i = 0;i<=N-1;i++)
    {
        Symbol[i] = (tree)malloc(sizeof(Treerecord));
        Symbol[i]->symbol = S[i];
        Symbol[i]->cost = Frequency[i];
        Symbol[i]->Leftchild = NULL;
        Symbol[i]->Rightchild = NULL;
        Symbol[i]->size = 1;
    }

    tree T = Huffman(Symbol,N);
    return 0;
}

你可能感兴趣的:(哈夫曼编码)