1、描述

Huffman编码,将字符串利用C++编码输出该字符串的Huffman编码。

Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领域有着广泛的应用。在word2vec模型中,在构建层次Softmax的过程中,也使用到了Huffman树的知识。

在通信中,需要将传输的文字转换成二进制的字符串,假设传输的报文为:“AFTERDATAEARAREARTAREA”,现在需要对该报文进行编码。

2、实现过程

  • 统计字符串中出现字符的频率
  • 列出字符串的Huffman树

3、实现代码

#include<iostream>
#include<string>
using namespace std;struct huffTree
{int parent;//父亲int lchild;//左孩子int rchild;//右孩子int weight;//权重string flag;//标志
};struct Lowest_Node//第0级节点的字符与频度
{char ch;int ch_num;
};
//确定每个字符的huffman编码,输出参数为a、b
void coding(int length, huffTree tree[], int n, int &a, int &b)
{int i;int r, s;r = s = length;//节点个数最大不会超过字符串的长度for (i = 0; i < n; i++){if ((tree[i].weight < r) && (tree[i].parent == -1)){r = tree[i].weight;a = i;}}for (i = 0; i < n; i++){if ((tree[i].weight < s) && (i != a) && (tree[i].parent == -1)){s = tree[i].weight;b = i;}}
}//计算每个字符出现的频度并排序
void frequency(string str)
{int length = str.length();//长度// 开辟结构体数组Lowest_Node *node = new Lowest_Node[length];//声明最0级节点int i, j;//循环因子for (i = 0; i < length; i++)node[i].ch_num = 0;//初始化频度int char_type_num = 0;//初始为0种字符for (i = 0; i < length; i++)//循环整个字符串{for (j = 0; j < char_type_num; j++)if (str[i] == node[j].ch || // 判断字符频率结构中,这个字符是否相等(node[j].ch >= 'a'&&node[j].ch <= 'z'&& //判断是否为字符str[i] + 32 == node[j].ch  //判断字符串的大写是否与字符频率结构中字符相等))break;//该字符没有出现过,跳出循环if (j < char_type_num)//该字符重复出现,对应的记数器加1 node[j].ch_num++;else//新出现的字符,记录到ch[j]中,对应计数器加1{if (str[i] >= 'A'&&str[i] <= 'Z')node[j].ch = str[i] + 32;   //字符转换为大写存储起来elsenode[j].ch = str[i];node[j].ch_num++;char_type_num++;//字符的种类数加1 }}//按频度从大到小排序for (i = 0; i < char_type_num; i++) //字符长度{for (j = 0; j < char_type_num-1; j++){//判断为字符就往下走,否则就不往下if (node[j].ch >= 'a'&&node[j].ch <= 'z'){if (node[j].ch_num < node[j + 1].ch_num)//如果前一个小于后一个,交换{int temp;//临时频度char ch_temp;//临时字符temp = node[j].ch_num;ch_temp = node[j].ch;node[j].ch_num = node[j + 1].ch_num; node[j].ch = node[j + 1].ch;node[j + 1].ch_num = temp;node[j + 1].ch = ch_temp;}}}}for (i = 0; i < char_type_num; i++)//打印字符频度cout << "字符" << node[i].ch << "出现了" << node[i].ch_num << "次" << endl;huffTree *huff = new huffTree[2 * char_type_num - 1];//此变量的声明需位于确定char_type_num值后huffTree temp;string *code = new string[2 * char_type_num - 1];//存放各个字符的编码for (i = 0; i < 2 * char_type_num - 1; i++)//节点初始化{huff[i].lchild = -1;huff[i].parent = -1;huff[i].rchild = -1;huff[i].flag = -1;}for (j = 0; j < char_type_num; j++)//将排序后的第0级节点权重赋给树节点{huff[j].weight = node[j].ch_num;}int min1, min2;for (int k = char_type_num; k < 2 * char_type_num - 1; k++)//赋值0级之上的节点{coding(length, huff, k, min1, min2);huff[min1].parent = k;huff[min2].parent = k;huff[min1].flag = "0";huff[min2].flag = "1";huff[k].lchild = min1;huff[k].rchild = min2;huff[k].weight = huff[min1].weight + huff[min2].weight;}for (i = 0; i < char_type_num; i++){temp = huff[i];while (1){code[i] = temp.flag + code[i];temp = huff[temp.parent];if (temp.parent == -1)break;}}cout << "字符串的每个字符huffman编码为:" << endl;for (i = 0; i < char_type_num; i++)cout << node[i].ch << "  " << code[i] << endl;cout << "整个字符串的huffman编码为:" << endl;for (i = 0; i < length; i++){for (j = 0; j < char_type_num; j++){if (str[i] == node[j].ch)cout << code[j];}}//释放内存delete[] node;node = NULL;delete[] huff;huff = NULL;delete[] code;code = NULL;
}int main()
{int length = 0;//字符串长度 string str; //目标字符串cout << "请输入一个字符串:";cin >> str;frequency(str);//求各个元素的频度printf("\n");system("pause");return 0;
}

4、参考

数据结构和算法——Huffman树和Huffman编码
http://blog.csdn.net/google19890102/article/details/54848262

转载于:https://www.cnblogs.com/17bdw/p/8472367.html

【算法】Huffman编码(数据结构+算法)相关推荐

  1. 数据结构实验三:Huffman树及Huffman编码的算法实现

    Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...

  2. 算法系列(二):贪心算法--Huffman编码

    算法系列(二):贪心算法--Huffman编码 一.分析 问题描述: 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法使用字符在文件中出现的频率 ...

  3. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察

    ML岗位面试:10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法.回归算法.聚类算法等细节考察 Interview:算法岗位 ...

  4. 【信息科学技术与创新】数据压缩的理论方法与现实意义 信息论 压缩编码 通信的数学理论 Huffman编码 LZ算法 虚幻引擎与数据压缩

    数据压缩的理论方法与现实意义 摘要 首先通过信息论引出数据压缩编码的理论方法 接着结合目前技术发展分析压缩编码的现实意义 最后总结思考未来通信与存储的压缩方法 Navigator 数据压缩的理论方法与 ...

  5. 算法 - Huffman编码

    一.需求分析 统计一篇文章中各个字符出现的频率,按照统计所得的频率使用Huffman算法编码文章,输出编码之后的文件以及Huffman编码 再次解码之前的编码文件,判断编解码前后的文件是否一致,以判断 ...

  6. huffman图像编码C语言,Huffman编码 数据结构 C语言

    为解决广大童鞋的数据结构实验问题写下本文:(只做参考哦.) 实验要求: Huffman编码(二叉树) l实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现. l实现功能:对输入的一串电文 ...

  7. c语言数据结构及算法实现代码,数据结构算法实现及解析―配合严蔚敏_吴伟民编著的数据结构(C语言版和C++版)(作者 高一凡)源代码...

    数据结构算法实现及解析―配合严蔚敏_吴伟民编著的数据结构(C语言版和C++版)(作者 高一凡)源代码 2016-08-22 0 0 0 4.0 分 其他 1 积分下载 如何获取积分? 数据结构算法实现 ...

  8. 算法导论之贪心算法(Huffman编码和拟阵)

    贪心算法,在解决最优化问题上,通过得到子问题的局部最优解来合成问题的一个解,以局部最优选择来输出一个全局最优解. 问题要用贪心算法来求解,需满足和动态规划一样的最优子结构特征,同时还需要再每个子问题最 ...

  9. Huffman编码 - 贪心算法

    编码过程实现最小的数据发送,或者达到最大的压缩

  10. 数据结构算法入门--链表

    2019 年第 76 篇文章,总第 100 篇文章 本文大约 3200 字,阅读大约需要 10 分钟 数据结构算法系列: 数据结构算法入门系列第三篇--链表,链表也是非常常见的数据结构,面试过程中也会 ...

最新文章

  1. 计算机保存文档,2010年职称计算机考试:保存文档
  2. 用SqlDataAdapter.Update(DataSet Ds)更新数据库
  3. AI 名校课程书籍 需要学习
  4. 去除HTML标签--SQL写法
  5. qq接入和分享android,Android社交登录授权、分享SDK,支持微信、微博和QQ
  6. 如何查看某个查询用了多少TempDB空间
  7. AD打板过程简介(搭配某份教程实现)
  8. 力扣-509 裴波那契数
  9. elasticsearch-carrot2插件打包
  10. 实用网站推荐——office模板(PPT)
  11. STM32 串口通讯及实现
  12. 计算机网络实验水晶头,计算机网络实验报告制作网线
  13. golang中net/http包用法
  14. 二次型相似对角化的原因
  15. 88E1111与千兆网口连接
  16. [堆+贪心] CF596C. Wilbur and Points
  17. 网友爆料奇葩leader:日报要精确到0.5小时,每晚检查!每周写周计划,评审ABCD等级,午休不许刷手机、看视频、玩游戏!...
  18. ik中文分词器分词原则、原理
  19. Windows语音朗读
  20. android studio 导入工程问题总结

热门文章

  1. Automapper 3.2.1以下方法或属性之间的调用不明确
  2. 在CKEditor中创建自己的命令按钮
  3. 使用ASP.NET核心应用程序实现存储库模式和工作单元的指南
  4. 在IIS中调试ASP.NET Core应用程序
  5. .NET的Math.Round与数学无关。没关系!
  6. 应用中的图像识别:为什么以及如何使用
  7. 40岁的程序员还能找到工作吗_学会了Vue就能找到前端工作吗
  8. 物联网卡设置_物联网卡该怎样设置和使用——酷易充物联
  9. android标题栏添加按钮_几行代码实现Android通用标题栏(轻松向左右两侧添加Menu)...
  10. linux 线程_Linux线程编程专题之线程和线程函数介绍