哈弗曼编码
来源:互联网 发布:js实现图片3d效果轮播 编辑:程序博客网 时间:2024/06/05 09:15
哈弗曼编码
问题描述:给定字符集C和每个字符的频率,求关于C的一个最优前缀码。
算法分析:构造最优前缀码的贪心算法就是哈夫曼算法(Huffman)
二元前缀编码存储:二叉树结构,每个字符作为树叶,对应这个字符的前缀码看作根到这片树叶的一条路径,每个结点通向左二子的边记作0,通向右儿子的边记作1.
#include <iostream>#include <string>#include <vector>#include<algorithm>using namespace std;class Huffman{public:char elementChar;//节点元素int weight;//权重char s;//哈夫曼编码Huffman* parent;//父节点Huffman* leftChild;//左孩子Huffman* rightChild;//右孩子public:Huffman();Huffman(char a, int weight);bool operator < (const Huffman &m)const { return weight < m.weight;}};Huffman::Huffman(){this->s = ' ';this->elementChar = '*';//非叶子节点this->parent = this->leftChild = this->rightChild = NULL;}Huffman::Huffman(char a, int weight):elementChar(a),weight(weight){this->s = ' ';this->elementChar = '*';//非叶子节点this->parent = this->leftChild = this->rightChild = NULL;}//递归输出哈夫曼值void huffmanCode(Huffman & h){if(h.leftChild == NULL && h.rightChild == NULL){//如果是叶子节点,输出器哈夫曼编码string s;Huffman temp = h;while(temp.parent != NULL){s = temp.s + s;temp = *temp.parent;}cout << h.elementChar << "的哈夫曼编码是:" << s << endl;return;}//左孩子huffmanCode(*h.leftChild);//右孩子 huffmanCode(*h.rightChild);}int main(){string huffmanStr;cout << "请输入一串字符序列:" << endl;cin >> huffmanStr;//得到字符串信息int i=0,j,n,m[100],h,k=0;char cha[100];n = huffmanStr.length();cout << "字符串总共有字符" << n << "个" << endl;for(int i = 0; i < n; i++){j = 0; h = 0;while(huffmanStr[i] != huffmanStr[j])j++;if(j == i){cha[k] = huffmanStr[i];cout << "字符" << cha[k] << "出现";}//如果j !=i 则略过此次循环elsecontinue;for(j = i; j < n; j++){if(huffmanStr[i] == huffmanStr[j])h++;}cout << h << "次" << endl;m[k] = h;k++;}//哈夫曼编码Huffman huffmanTemp;vector < Huffman > huffmanQueue;//初始化队列for(int i = 0; i < k; i++){huffmanTemp.elementChar = cha[i];huffmanTemp.weight = m[i];huffmanQueue.push_back(huffmanTemp);} //得到哈夫曼树所有节点int huffmanQueue_index = 0;sort(huffmanQueue.begin(), huffmanQueue.end());while(huffmanQueue.size() < 2 * k - 1){//合成最小两个节点的父节点huffmanTemp.weight = huffmanQueue[huffmanQueue_index].weight + huffmanQueue[huffmanQueue_index + 1].weight;huffmanQueue[huffmanQueue_index].s = '0';huffmanQueue[huffmanQueue_index + 1].s = '1';huffmanTemp.elementChar = '*';//将父节点加入队列huffmanQueue.push_back(huffmanTemp);sort(huffmanQueue.begin(), huffmanQueue.end());huffmanQueue_index += 2;}//把所有节点构造成哈夫曼树int step = 0;//步长while(step + 2 < 2 * k){for(int j = step + 1; j <= huffmanQueue.size(); j++){if(huffmanQueue[j].elementChar == '*' && huffmanQueue[j].leftChild == NULL && (huffmanQueue[j].weight == huffmanQueue[step].weight + huffmanQueue[step+1].weight)){huffmanQueue[j].leftChild = &huffmanQueue[step];huffmanQueue[j].rightChild = &huffmanQueue[step+1];huffmanQueue[step].parent = huffmanQueue[step+1].parent = &huffmanQueue[j];break;}}step += 2;}//cout << huffmanQueue.size() << endl;//序列最后一个元素,即哈弗曼树最顶端的节点huffmanTemp = huffmanQueue.back();huffmanCode(huffmanTemp);return 0;}
0 0
- 香农编码、费诺编码、哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码
- 哈弗曼编码(C++)
- Continue ,Break,Return这三个关键字的区别
- 安卓 用户界面 Preference 教程翻译
- Leetcode 350. Intersection of Two Arrays II 数组交集2 解题报告
- PowerPoint2007无法嵌入某些字体
- 根据Value设置Radio选项的状态值
- 哈弗曼编码
- Android APK瘦身/减小包体
- Palindrome Linked List
- pl/sql 创建并执行oralce存储过程,并返回结果集
- 阿里云上centos6安装docker问题!
- LeetCode 350:Intersection of Two Arrays II
- View的绘制
- iOS创建管理当前账号的单例类
- EDitText