哈夫曼(Huffman)树及其应用
Huffman树又称最优树,是一类带权路径长度最短的树,带权路径长度为从该节点到树根之间的路径长度与节点上权值的成积。
那么如何构建一个Huffman树呢?就需要Huffman算法
1、利用给定的n个权值构成有n个二叉树的集合F,每个二叉树就只有一个带权值的根节点,其左右子树都为空。
2、选取两课根节点权值最小的树作为左右子树,且重置新的二叉树的根节点的权值为左右子树权值之和。
3、在集合F中删掉这两课子树,并将新得到的二叉树加入到F中去。
4、重复2、3操作直至F中只剩下一棵子树。
如下图:Huffman的构造过程(其中红色数字表示的是节点的权值)

Huffman存储:Huffman树中没有度为一的结点,一棵有n个叶子结点的Huffman树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中。
编码走一条从根路径出发到叶子节点的路径;译码走一条从叶子节点出发到根的路径,对于每个结点而言即需要知道其父亲结点又要知道其左右孩子结点。
Huffman树建立主要代码实现:
:以下代码是借助自己写的堆实现的,也可以用vector容器
void CreateTree(const T* a, size_t size, const T& invalid)
{
assert(a);
Heap<Node*, NodeCompare<T>> minHeap;//一个小堆的结构
for (size_t i = ; i < size; ++i)
{
if (a[i] != invalid)
{
//将a[i]构建成节点,插入堆
Node* node = new Node(a[i]);
minHeap.Push(node);
}
}
while (minHeap.Size()>)
{//得到权值最小的两个元素作为左右子树
Node* left = minHeap.Top();
minHeap.Pop();
Node* right = minHeap.Top();
minHeap.Pop();
//利用左右子树的权值之和构造出结点
Node* parent = new Node(left->_weight + right->_weight);
//进行链接
parent->_left = left;
parent->_right = right;
left->_parent = parent;
right->_parent = parent;
minHeap.Push(parent);
}
_root = minHeap.Top(); }
Huffman编码:约定左分支表示字符'0',右分支表示字符'1',则可以从根节点到叶子节点的路径上分支字符组成的字符串作为该叶子结点字符的编码, 以下写了2 种方法实现记录Huffman编码
1.递归
void _GenerateHuffmanCode(HuffmanTreeNode<FileInfo>* root)//从根节点出发递归生成HuffmanTree编码
{
if (root == NULL)
{
return;
}
_GenerateHuffmanCode(root->_left);
_GenerateHuffmanCode(root->_right);
if (root->_left == NULL && root->_right == NULL)//节点为叶子节点
{
HuffmanTreeNode<FileInfo>* cur = root;
HuffmanTreeNode<FileInfo>* parent = cur->_parent;
string& code = _infos[cur->_weight._ch]._code;//FileInFo即为weight,.ch指的是字符是什么._code表示编码
while (parent)
{
if (parent->_left == cur)
{
code += '';
}
else
{
code += '';
}
cur = parent;
parent = cur->_parent;
}
reverse(code.begin(), code.end());
}
}
文件压缩:
1、打开文件统计字符次数,利用字符次数建立Huffman树。
2、根据Huffman树遍历出Huffman编码。
3、将每一个字符的编码写入压缩文件。
4、将字符总数及每个按文件中出现顺序字符的次数写入配置文件
文件解压缩:
1、读配置文件,将字符写入解压缩文件。
哈夫曼(Huffman)树及其应用的更多相关文章
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 哈夫曼(Huffman)树+哈夫曼编码
前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...
- 数据结构实训——哈夫曼(Huffman)编/译码器
题目4.哈夫曼(Huffman)编/译码器(限1人完成) [问题描述] 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先 ...
- 哈夫曼(Huffman)编码
哈夫曼编码(Huffman Coding)是一种非常经典的编码方式,属于可变字长编码(VLC)的一种,通过构造带权路径长度最小的最优二叉树以达到数据压缩的目的.哈弗曼编码实现起来也非常简单,在实际的笔 ...
- 重温经典之赫夫曼(Huffman)编码
先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...
- 数据结构-哈夫曼(Huffman)
#include <iostream> #include <cstdio> #include <malloc.h> #define LIST_INIT_SIZE 1 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- HUFFMAN 树
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...
- [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...
- 使用F#来实现哈夫曼编码吧
最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...
随机推荐
- AtCoder Beginner Contest 077
A - Rotation Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement You are g ...
- Fire Net HDU - 1045 (二分图匹配)
题意: 给出一张图,图中'X'表示wall,'.'表示空地,可以放置blockhouse同一条直线上只能有一个blockhouse,除非有wall 隔开,问在给出的图中最多能放置多少个blockhou ...
- python 路径操作工具 pathlib,比 os 模块好用太多
在 python 当中,如果你想控制路径,基本上绕不开 os.path.我希望看完这篇文章以后,熟练使用 python 的你能立刻开始使用 pathlib 模块,一刻也不要耽误. pathlib 相对 ...
- vue动态渲染图片,引用路径需要注意的地方
1.把图片放在和src同级的static里面,这用按照正常的方式进行引入,例如: 2.图片可以在其他文件夹,但是在script引入是必须加上require <img :src="ite ...
- django笔记二之数据库
django笔记二之数据库 [同步数据库之前的操作] yum install MySQL-python.x86_64 -y 2)开启数据库服务并创建表 创建数据库设置 为utf8: create da ...
- 【转】sysctl命令及改变net.ipv4.ip_forward = 1方法
转自:https://blog.csdn.net/michaelzhou224/article/details/16979285 sysctl配置与显示在/proc/sys目录中的内核参数.可以用sy ...
- 校内题目T2695 桶哥的问题——吃桶
同T2一样外校蒟蒻可能没看过: 题目描述: 题目背景 @桶哥 桶哥的桶没有送完. 题目描述 桶哥的桶没有送完,他还有n个桶.他决定把这些桶吃掉.他的每一个桶两个属性:种类aia_iai和美味值bib ...
- 深入理解JAVA虚拟机 晚期(运行期)优化(转载)
这一章节的内容实用性不强 所以不再手打笔记 转载了一篇 原文地址是http://blog.csdn.net/qq_27350929/article/details/54837595 在部分的商用虚拟机 ...
- enums应用详解
枚举类: 获取枚举相关值:
- ZROI 19.07.29 线性代数入门/wq
1.高斯消元 在模意义下依然有效,对主元求逆即可. 甚至可以模合数,需要对两个方程辗转相除,复杂度\(O(n^3\log p)\). 辗转相除法只要能定义带余除法就有效. 逆矩阵:对于矩阵\(A\), ...