您的位置:首页 > 其它

一步一步写算法(之哈夫曼编码)

2012-05-08 21:51 232 查看
哈夫曼树也称最优二叉树,顾名思义,即所有叶子结点的带权路径长度最短。对数据进行哈夫曼编码,可以大大减少数据传输量。

1.设计Huffman Tree的结点结构,即Huffman Node,并创建Huffman Node

//huffman节点结构
typedef struct _HUFFMAN_NODE{
char str;	//需编译的字符
double frequence;	//字符出现频率
int symbol;	//该节点的编码
_HUFFMAN_NODE *left;
_HUFFMAN_NODE *right;
_HUFFMAN_NODE *parent;
}HUFFMAN_NODE;


//创建HUFFMAN_NODE
HUFFMAN_NODE *creat_huffman_node(char str,double frq)
{
HUFFMAN_NODE *pNode;
pNode=(HUFFMAN_NODE *)malloc(sizeof(HUFFMAN_NODE));

assert(NULL!=pNode);
pNode->str = str;
pNode->frequence = frq;
pNode->left = NULL;
pNode->right = NULL;
pNode->parent = NULL;
pNode->symbol = -1;

return pNode;
}


2.创建Huffman Tree

//创建huffman_Tree
HUFFMAN_NODE *creat_huffman_tree(HUFFMAN_NODE *array[],int len)
{
HUFFMAN_NODE *root;

while(len>1){
root=(HUFFMAN_NODE *)malloc(sizeof(HUFFMAN_NODE));
assert(NULL!=root);
bubble_sort(array,len);
root->left = array[0];
root->right = array[1];
root->frequence = array[0]->frequence + array[1]->frequence;
array[0]->symbol = 1;
array[0]->parent = root;
array[1]->symbol = 0;
array[1]->parent = root;

memmove(&array[0],&array[2],sizeof(HUFFMAN_NODE *)*(len-2));
array[len-2]=root;
len--;
}

return root;

}


3.输出huffman编码

//输出huffman_code
void print_huffman_code(HUFFMAN_NODE *pNode,HUFFMAN_NODE *root)
{
assert(NULL!=root);

printf("%c: %f ",pNode->str,pNode->frequence);
while(pNode!=root){
printf("%d",pNode->symbol);
pNode=pNode->parent;
}
printf("\n");
}

其中bubble_sort()的函数原型如下:

int compare(void *a,void *b)
{
HUFFMAN_NODE *node1=(HUFFMAN_NODE *)a;
HUFFMAN_NODE *node2=(HUFFMAN_NODE *)b;

return node1->frequence>node2->frequence?1:0;
}

void swap(HUFFMAN_NODE **a,HUFFMAN_NODE **b)
{
HUFFMAN_NODE *tmp;

tmp=*a;
*a=*b;
*b=tmp;
}

void bubble_sort(HUFFMAN_NODE *array[],int len)
{
int inner,outer;

for(outer=0;outer<len-1;outer++){
for(inner=0;inner<=outer;inner++)
if(compare(array[inner],array[inner+1]))
swap(&array[inner],&array[inner+1]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: