定义:带权路径长度WPL最小的二叉树(在编写哈夫曼编码时用到的特殊二叉树)

构造过程:

其实就是每次在权值集合中选两个最小结点的组成新树,然后新树的根节点是二者的权值之和,将刚刚两个从集合中删掉,将新树的根节点添加进去,一直到只有一棵树位置。(一般权值小的为左子树)

作用:用来实现哈夫曼编码,以及后续的解码,使用哈夫曼编码来压缩我们在网络传输中的文件

实现原理:在计算机中我们的数据最终都是通过0、1来存储发送的,那么尽管是不同的语言,都有出现频率较高的字符,比如中文中的 “的、了、在、有” 等,英文中的 “a, e, i, o, u” 等元音字母,使用哈夫曼编码可以使这些出现频率较高的字符的编码位数更短,假设字符 A 原本的编码是 ’‘0000“,经过哈夫曼编码之后成为 ”01“ (具体情况具体分析,这里只是举例),这样在数据很多的情况下我们就可以节省很大的空间(所以平时我们编写代码时也应该站在处理数据很大的角度来提升程序的效率)。

假设发送的数据为“BADCADFEED”,六个字母的频率:A 27, B 8, C 15, D 15, E 30, F 5

原本的编码:

用哈夫曼树构造哈夫曼编码:  

哈夫曼编码:

解码:

1、编码非0即1,长短不等的话非常容易混淆,所以设计这种长短不等的代码,我们必须保证任一字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码。仔细观察构造出的哈夫曼编码就是前缀编码。

2、在解码时还需要用到哈夫曼树,即发送方和接收方必须要约定好同样的哈夫曼编码规则,从而成功解码。一般规定哈夫曼树的左分支代表0,右分支代表1。 构造哈夫曼树代码:

//构造哈夫曼树
void CreateHaff(int *weight,int n,HFNode* phfnode)
{int i, j;int min1, min2;//最小值和次小值int min1x, min2x;//最小值和次小值的下标for (int i = 0; i < 2 * n - 1; ++i){//2*n-1 是哈夫曼树总的结点个数if (i < n){//给前n个结点赋值phfnode[i].weight = weight[i];}else{//后面的结点是后续的新结点,开始将权值置0,后续权值为其//左右孩子的权值之和phfnode[i].weight = 0;}//初始化每个结点的信息phfnode[i].leftindex = -1;phfnode[i].rightindex = -1;phfnode[i].parentindex = -1;phfnode[i].flag = 0;}for (i = 0; i < n - 1; i++){min1 = min2 = 65535;min1x = min2x = -1;//在数组中查找最小的和次小的for (j = 0; j < n + i; j++){//比最小值小if (phfnode[j].weight < min1 && phfnode[j].flag == 0){min2 = min1;min2x = min1x;min1 = phfnode[j].weight;min1x = j;}//比次小值小else if(phfnode[j].weight < min2 && phfnode[j].flag == 0){min2 = phfnode[j].weight;min2x = j;}}phfnode[n + i].weight = min1 + min2;phfnode[n + i].leftindex = min1x;phfnode[n + i].rightindex = min2x;phfnode[min1x].parentindex = n + i;phfnode[min1x].flag = 1;phfnode[min2x].parentindex = n + i;phfnode[min2x].flag = 1;}
}

构造哈夫曼编码代码:

void HaffCode(HFNode* phfnode, int n, char code[5][20])
{//char code[5][20]用来存放各个字符的编码int i;char temp[20] = {0};int child;int parent;int end = 20 - 2;//end代表的是下标,19下标是\0所以从18下标开始存放编码for (i = 0; i < n; ++i)//计算n个结点的编码{child = i;parent = phfnode[child].parentindex;end = 20 - 2;temp[20 - 1] = '\0';while (parent != -1){if (child == phfnode[parent].leftindex)temp[end] = '0';else if (child == phfnode[parent].rightindex)temp[end] = '1';end--;child = parent;parent = phfnode[child].parentindex;}//由于最后end--所以拷贝时要+1strcpy(code[i], temp + end + 1);}
}

哈夫曼树与哈夫曼编码:相关推荐

  1. 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码

    实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...

  2. python哈夫曼树_python霍夫曼树

    class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...

  3. 一文看懂哈夫曼树与哈夫曼编码

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...

  4. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现

    闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...

  5. 听说你还不懂哈夫曼树和哈夫曼编码

    基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...

  6. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  7. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  8. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  9. 【数据结构】-哈夫曼树以及哈夫曼编码

    哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...

  10. C++ 实现哈夫曼树和哈夫曼编码

    C++ 实现哈夫曼树和哈夫曼编码 一.哈夫曼树的定义 二.哈夫曼树的构造算法 三.哈夫曼编码 四.哈夫曼算法实现 1.定义一个结点类 2.定义一个哈夫曼编码类 3.定义一个哈夫曼树类 4.设置初始值 ...

最新文章

  1. Mysql数据库常用操作整理
  2. java 进程同步代码_java 实现进程间的同步(源代码)
  3. 求排列的逆序数(信息学奥赛一本通-T1237)
  4. 补发《超级迷宫》站立会议九
  5. 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
  6. js知识学习图谱,新手必看
  7. BatchPreparedStatementSetter,用法
  8. 安卓开发板烧写程序与安装软件的区别_总结一下各大开发板android烧写方式
  9. 第三节:python 交互和调用参数
  10. android 渐变蒙版_干货分享(第八期):PS蒙版教学,利用蒙版制造渐隐效果
  11. IOS10上崩溃错误“View has lost track of its superview, most likely through unsupported use of CALayer”解决方案
  12. hardfault常见原因_STM32如何查找hardfault原因
  13. 达梦体系结构(DM8)_yxy
  14. 水利水电课程指导之建筑制图基础_第二章测试试题
  15. 【MySQL综合练习1】
  16. python学习课件
  17. win7无线热点_智能手机变成台式电脑的无线网卡来使用并连接WIFI上网的方法
  18. 自己用的感觉很好的C++IDE推荐
  19. 论文:TransVG: End-to-End Visual Grounding with Transformers
  20. delphi 对金额double类型向上取整,保留小数位

热门文章

  1. 注意力机制 ——学习笔记
  2. LEC learning5: 对design 中的clock gating 处理
  3. Ubuntu 搜狗输入法显示繁体,一直不显示简体
  4. 我国的选煤工业发展方向
  5. 数据库系列(5):SQL查询
  6. 惠普打印机故障代码_惠普打印机故障排除方法
  7. 无穷小微积分教材的结束语
  8. 人工智能的本质居然是……网瘾少年?
  9. Window7定期批处理删除指定文件且不弹出黑窗口的方法
  10. 每天学习十分钟1之心路历程