算法设计与分析--霍夫曼树编码(C++实现)
来源:互联网 发布:mac os 最稳定 编辑:程序博客网 时间:2024/06/08 09:40
问题描述:
设需要编码的字符集为{d1, d2, …, dn},它们出现的频率为{w1,w2, …, wn},应用哈夫曼树构造最短的不等长编码方案。
Huffman算法:
给定实数w1,w2,···,wt且 w1<=w2<=···<=wt
(1)连接w1,w2为权的两片树叶,得一分支点,其权为w1+w2 ;
(2)在w1+w2, w3+···+wt中选出两个最小的权,连接它们对应的顶点(不一定都是树叶),得分支点及所带的权;
(3)重复(2),直到形成t– 1个分支点,t片树叶为止。
算法实例:
C++代码:
#include<iostream>#include<string>using namespace std;//结点类型struct element{double weight;//字符出现的概率为实数char ch;int lchild, rchild, parent;};//在HuffTer中找权值最小的两个结点i1和i2void Select(element huffTree[], int *a, int *b, int n){int i;double weight = 0;for(i = 0; i <n; i++){if(huffTree[i].parent != - 1)//如果有父结点的,不进行判断continue;else{if(weight == 0){weight = huffTree[i].weight;*a = i;}else{if(huffTree[i].weight < weight){weight = huffTree[i].weight;*a = i;}}}}weight = 0;for(i = 0; i < n; i++){if(huffTree[i].parent != -1 || (i == *a))continue;else {if(weight == 0){weight = huffTree[i].weight;*b = i;}else {if(huffTree[i].weight < weight){weight = huffTree[i].weight;*b = i;}}}}int temp;if(huffTree[*a].lchild < huffTree[*b].lchild)//避免根结点的左右子树混淆{temp = *a;*a = *b;*b = temp;}}//建立霍夫曼树void HuffmanTree(element huffTree[], int w[], char ch[], int n){for(int i = 0; i < 2 * n - 1;i++) //霍夫曼树共有2*n - 1个结点{huffTree[i].parent = -1;//双亲结点huffTree[i].lchild = -1;//左孩子结点huffTree[i].rchild = -1;//右孩子结点}for(int i = 0; i < n; i++)//构造n棵只含有根结点的二叉树{huffTree[i].weight = w[i];//给哈夫曼树赋权值huffTree[i].ch = ch[i];//需要编码的字符}for(int k = n; k < 2 * n - 1; k++)//n-1次合并{int i1 = 0;int i2 = 0;Select(huffTree,&i1,&i2,k);//在HuffTer中找权值最小的两个结点i1和i2huffTree[i1].parent = k;//将i1和i2合并,则i1和i2的双亲是khuffTree[i2].parent = k;huffTree[k].weight = huffTree[i1].weight + huffTree[i2].weight;huffTree[k].lchild = i1;huffTree[k].rchild = i2;}}//霍夫曼编码void HuffmanCode(element huffTree[], int n){int i, j,k;string s = "";for(i = 0; i < n; i++)//在数组HuffTree中前n个元素是叶子结点,需要编码{s = "";//编码s初始化为空串j = i;//暂存i,不破坏循环变量while(huffTree[j].parent != -1)//结点j存在双亲{k = huffTree[j].parent;if(j == huffTree[k].lchild)//结点j是其双亲的左孩子{s = s + "0";}else//结点j是其双亲的右孩子{s = s + "1";}j = huffTree[j].parent;//将结点j的双亲赋给j}cout<<"字符"<<huffTree[i].ch<<"的编码:"<<endl;for(int i =s.size() - 1; i >= 0; i--)//将s作为结点i的编码逆序输出{cout<<s.at(i)<<" ";}cout<<endl;}}int main(){const int n = 6;element huffTree[2 * n];char ch[] = {'a', 'b', 'c','d','e','f'};int w[] = {50, 60, 150, 200, 240, 300};// 构造霍夫曼树HuffmanTree(huffTree,w,ch,n);//编码HuffmanCode(huffTree,n);system("pause");return 0;}
实验结果:
- 算法设计与分析--霍夫曼树编码(C++实现)
- 算法设计与分析--霍夫曼树编码(C++实现)
- 【算法设计与分析】8、哈弗曼编码,贪心算法实现
- base64编码算法与c语言实现
- base64编码算法与c语言实现
- 设计Huffman编码(算法设计与分析课程实验)
- 算法与分析设计 实验——插入排序C语言实现
- Dijkstra(迪杰斯特拉)算法分析与实现(C++)
- 算法设计与分析 Ackerman函数的递归实现算法
- 算法设计与分析 全排列的递归实现算法
- 算法设计与分析 整数划分的递归实现算法
- 算法设计与分析 合并排序的递归实现算法
- 算法设计与分析 快速排序的递归实现算法
- 算法分析与设计
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- Python yield 使用浅析
- The C++ Programing Language读书笔记之(1):Advise
- Downloaded Files for 11i and R12
- gralloc 学习
- 操作系统概论三
- 算法设计与分析--霍夫曼树编码(C++实现)
- TUXEDO错误解析
- 进程的创建与可执行文件的加载
- 模仿网易新闻客户端(RSS版)(一)
- HDU 4198 Quick out of the Harbour (bfs)
- hdu 1856 More is better 并查集
- 各位周末结束后都累了吧,那我们一起来看看【寒冬】的面试题吧(据说阿里的哟)
- 【设计模式】命令
- 模仿网易新闻客户端(RSS版)(二)