最优二叉树(Huffman树)
首先给出路径和路径长度的定义:
从树的一个结点到另一个结点之间的分支构成这两点之间的路径,路径上的分支数目叫路径长度,树的路径长度为从根到每一个结点的路径长度之和。
带权路径长度:为该结点到跟的路径长度和结点上权的乘积。
树的带权路径:根到每一个结点的路径长度和结点上权的乘积之和。
其中带权路径长度WPL最小的二叉树称为最优二叉树或赫夫曼树.
如何构造Huffman树:
1.根据给定的n个权值{w1,w2,w3,w4....wn}构造n颗二叉树集合f(t1,t2,t3...tn}
其中每颗二叉树ti中只有一个带权w1的根结点,其左右子树为空。
2.在f中选取两颗权值最小的二叉树作为左右子树构造一棵新的二叉树,新二叉树的根的权值为左右子树权值之和
3.在f中删除权值最小的二叉树,同时把新构造的二叉树加入到f中.
4.重复2、3步骤直到f中只有一棵树为止。
以权值:5 6 3 8 7为例:
C代码实现:
#include <iostream>
using namespace std;
typedef struct{
unsigned int weight;
unsigned parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;
//选取其中权值最小的两棵树
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{
int i, min;
min = 99999;
for(i = 1; i <= n; i++)
{
if(min > HT[i].weight && HT[i].parent == 0)
{
s1= i;
min = HT[i].weight;
}
}
min = 99999;
for(i = 1; i <= n; i++)
{
if(min > HT[i].weight && HT[i].parent == 0 && i != s1)
{
s2 = i;
min = HT[i].weight;
}
}
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{
int i, s1, s2, m;
int start = 0, c, f;
char *cd;
if(n <= 1) return;
m = (n << 1) - 1;
HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
for(i = 1; i <= n; ++i, ++w) //构造n颗二叉树集合F={T1, T2, .... Tn},其中每颗树都只有一个带权为wi的根
{
HT[i].weight = *w;
HT[i].parent = HT[i].lchild = HT[i].rchild = 0;
}
for( ;i <= m; ++i)
HT[i].parent = HT[i].lchild = HT[i].rchild = HT[i].weight = 0; //初始化
//构造Huffman中的2、3步。
for(i = n + 1; i <= m; ++i)
{
Select(HT, i - 1, s1, s2);
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffmanCode)malloc((n + 1) * sizeof(char *));
cd = (char *)malloc(n * sizeof(char));
cd[n - 1] = '\0';
for(i = 1; i <= n; ++i)
{
int start = n - 1;
for(c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
if(HT[f].lchild == c) cd[--start] = '0';
else cd[--start] = '1';
HC[i] = (char *)malloc((n - start) * sizeof(char)); //开辟内存空间
strcpy(HC[i], &cd[start]);
}
free(cd);
free(HT);
}
int main()
{
HuffmanTree HT = NULL;
HuffmanCode HC;
int w[] = {5, 6, 3, 8, 7};
HuffmanCoding(HT, HC, w, 5);
for(int i =1; i <= 5; i++)
cout<<HC[i]<<endl;
return 0;
}
- 大小: 25.3 KB
分享到:
相关推荐
自己实现的Huffman编码,压缩率接近50%,使用字节流写入文件。解码时读取字节流,将字节流转化为二进制串,匹配字符解压。使用I have a dream作为测试文件。
使用文件保存初始的文本数据及最终的结果。 文件名为inputfile1.txt的文件保存的...统计inputfile1.txt中各字符的出现频率,并据此构造Huffman树,编制Huffman编码;根据已经得到的编码,对01形式的编码段进行译码。
实验三、Huffman编码(二叉树) 实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。 实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现...
Huffman编码与解码 (选做)(Huffman编码、二叉树) [问题描述] 对一篇英文文章,统计各字符出现的次数,实现Huffman编码,以及对编码结果的解码。 [基本要求] (1) 输出每个字符出现的次数和编码,其中求最小权值...
本程序实现了利用 Huffman 编码对图像进行无损压缩和解压缩。Huffman 编码是一种基于字符出现频率构建相应前缀码的无损数据压缩算法。 使用方法: 1. 需要安装 OpenCV 和 Numpy 库: pip install opencv-python ...
Huffman编码C++源代码 Huffman编码C++源代码
收集来的Quake3 自适应huffman编码分析,备份一份
图像的Huffman编码 有注释 希望对大家有用!!!!
c语言的huffman编码及编码效率计算,采用两种编码方式,可选择
Huffman编码的测试文件 包括图像 文本 音频和压缩文件
基于Matlab的图像huffman编码的实现,将图像转换为灰度图,并压缩,求其压缩比和时间
Huffman编码的程序代码, #include #include #include #include //极大值用于生成Huffman树 #define MAXSIZE 100000000 //用于生成相应叶子节点Huffman编码的二维字符数组 typedef char* HCode; //Huffman树节点 ...
简单图解释Huffman编码构成过程,简单易懂
Huffman树 及 Huffman编码 演示程序 以画图的方法形象的表示了树的构成,解决了普通控制台应用程序对树的结构表达不清的问题 编译器 VS2008
1.要求对文件进行Huffman编码的算法,以及对一编码文件进行解码的算法 2.熟练掌握二叉树的应用;具体要求如下: 最小冗余码/哈夫曼码
代码中用C++实现了Huffman编码,经过测试通过
包含huffman编码java实现源程序、该java程序的javadoc文档、huffman编码简单原理ppt
韩英杰老师的数据结构中关于Huffman编码算法演示课件