一步一步写算法(之哈夫曼编码)
2012-05-08 21:51
232 查看
哈夫曼树也称最优二叉树,顾名思义,即所有叶子结点的带权路径长度最短。对数据进行哈夫曼编码,可以大大减少数据传输量。
1.设计Huffman Tree的结点结构,即Huffman Node,并创建Huffman Node
2.创建Huffman Tree
3.输出huffman编码
其中bubble_sort()的函数原型如下:
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]); } }
相关文章推荐
- 一步一步复习数据结构和算法基础-链表(3)
- 一步一步写算法(之寻路)
- 一步一步写算法(之hash表)
- 一步一步复习数据结构和算法基础-索引顺序表查找
- 选择排序——一步一步算法篇
- 一步一步写算法(之洗牌算法)
- 一步一步写算法(之hash表)
- 一步一步写算法(之hash表)
- 一步一步写算法(之菜单问题)
- 一步一步写算法(开篇)
- 一步一步写算法(之合并排序)
- 一步一步写算法(之排序二叉树删除-3)
- 一步一步写算法(之寻找丢失的数)
- 一步一步写算法(之 最大公约数、最小公倍数)
- 第十一周 项目1(4)哈夫曼编码的算法验证
- 第十一周项目一 验证算法(4)哈夫曼编码的算法验证
- 第11周项目1-验证算法(4)哈夫曼编码的算法验证
- 第10周项目1-验证算法(4)哈夫曼编码的算法验证
- 一步一步写算法(之非递归排序)
- 一步一步写算法(之n!中末尾零的个数统计)