Huffman编码C实现

Huffman编码:根据Huffman树进行编码的,用到的数据结构是二叉树。

typedef int elemtype;
typedef struct
{
  elemtype weight;
  int parent,l_child,r_child;
} binarytree;

//2、构建最优二叉树
void CreateHuffman(int leafnum, binarytree *huffmantree)
{
    //leafnum个叶子,决定nodenum个结点数
	int nodenum=2*leafnum-1;
	huffmantree=(binarytree *)malloc(nodenum*sizeof(binarytree));   //0号单元也使用

	//leafnum个叶子,决定nodenum个结点数,也决定了(nodenum-1)个bit位编码
	char *huffmancode;
	huffmancode =(char *)malloc((nodenum-1)*sizeof(char));

	//huffmantree的初始化:叶子结点data权值手动输入,非叶子默认值都为0
	cout<<"请输入叶子权值:";
	int i;
	for(i=0;i<nodenum;i++)
	{
		if(i<leafnum)
		{
			cin>>huffmantree[i].weight;
		}
		else
		{
		   huffmantree[i].weight=0;
		}
		huffmantree[i].parent=huffmantree[i].l_child=huffmantree[i].r_child=0;
	}

	int j;
	//j从leafnum开始,指的是包含了新建子树的结点编号
	for(j=leafnum;j<nodenum;j++)
	{
	  int w1=32767,w2=0; //存储最小权值;
	  int p=0,q=0; //存储最小权值的编号;

	      int k;
		  for(k=0;k<j;k++)
			  {
				  if(huffmantree[k].parent==0)  //判断结点是否使用
				  {
					  if(huffmantree[k].weight<w1)
						  {
						   w2=w1;
						   q=p;
						   w1=huffmantree[k].weight;
						   p=k;					   

						  }
					  else if(huffmantree[k].weight<w2)
						 {
						   w2=huffmantree[k].weight;
						   q=k;
						 }
				  }
			   }
		//p对应左节点,编码为‘0’;q对应左节点,编码为‘1’;
		huffmancode[p]='0';
		huffmancode[q]='1';

		huffmantree[j].weight =w1+w2;
		huffmantree[j].l_child=p;
		huffmantree[j].r_child=q;
		huffmantree[p].parent=j;
		huffmantree[q].parent=j;
	}

//3、寻找从子节点到根节点的编码 HuffmanCoding(int n,binarytree *HuffmanTree)
	//针对每一个叶子,从叶子到根方向寻找huffmancode
	//每一个叶子,对应的编码长度codelength
	const int maxsize=10;
	char iscode[maxsize][maxsize];
	int m;
	for(m=0;m<leafnum;m++)   //从第一个叶子开始找
	{
      int n=0;
	  iscode[m][n]=huffmancode[m];
	  int parent=huffmantree[m].parent;
	  while(parent !=0)
		{
		  iscode[m][++n]=huffmancode[parent];
		  parent=huffmantree[parent].parent;
		};

	  int x;
	  cout<<"第"<<m+1<<"个叶子的HuffmanCode————";
	  for(x=0;x<n;x++)
	   cout<<iscode[m][x];
	  cout<<endl;
	}
}

void main()
{
   binarytree *T=0;
   int leafnum;
   printf("输入叶子数量n=\n");
   cin>>leafnum;
   CreateHuffman( leafnum, T);
   while(1);
}

编译结果如下:

Huffman编码C实现

时间: 2024-10-03 08:14:46

Huffman编码C实现的相关文章

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

Huffman编码学习笔记

主要是在学算导,觉得算导译到中国真是中国人民的福音. 一.编码 编码就是选择有意义的01串,令其首尾相接组成文本.我们并非可以随便挑选01串,原因在于它们是首尾相接的,这为我们识别造成了一些困难.比如说我们不能在文本000000中分清字符00与000. 一般我们使用的方式是定长字符:但更好的方式是前缀码,算导中写道"虽然我们这里不会证明,但与任何字符编码相比,前缀码确实可以保证达到最优数据压缩率.",这显然是一个flag,将来一定会有比前缀码更好的编码方式的. 二.Huffman编码便

基于Huffman编码的压缩软件的Python实现

哈夫曼编码是利用贪心算法进行文本压缩的算法,其算法思想是首先统计文件中各字符出现的次数,保存到数组中,然后将各字符按照次数升序排序,挑选次数最小的两个元素进行连结形成子树,子树的次数等于两节点的次数之和,接着把两个元素从数组删除,将子树放入数组,重新排序,重复以上步骤.为了解压,在压缩时首先往文件中填入huffman编码的映射表的长度,该表的序列化字符串,编码字符串分组后最后一组的长度(编码后字符串长度模上分组长度),最后再填充编码后的字符串.本算法中以一个字节,8位作为分组长度,将编码后二进制

基于二叉树和数组实现限制长度的最优Huffman编码

具体介绍详见上篇博客:基于二叉树和双向链表实现限制长度的最优Huffman编码 基于数组和基于链表的实现方式在效率上有明显区别: 编码256个符号,符号权重为1...256,限制长度为16,循环编码1w次,Release模式下.基于链表的耗时为8972ms,基于数组的耗时为1793ms,速度是链表实现方式的5倍. 详细代码例如以下: //Reference:A fast algorithm for optimal length-limited Huffman codes.pdf,http://p

Huffman 编码压缩算法

前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字符出现频率,Priority Queue,和二叉树来进行的一种压缩算法,这种二叉树又叫Huffman二叉树 —— 一种带权重的树.从学校毕业很长时间的我忘了这个算法,但是网上查了一下,中文社区内好像没有把这个算法说得很清楚的文章,尤其是树的构造,而正好看到一篇国外的文章<A Simple Examp

为什么Huffman编码不会发生冲突

关于Huffman编码,这里有一篇漂亮的介绍 http://coolshell.cn/articles/7459.html 似乎介绍Huffman编码的都会有一句“Huffman编码不会发生冲突,即不存在某个编码是另一个编码的前缀”.但是也似乎都没有解释为什么. 细细想明白了之后,觉得似乎又没什么深奥的原理.废话少说,上图. 以上面的图为例子,我们假设这是一个生成Huffman编码的二叉树. 1)所谓的Huffman编码其实就是各个叶节点的路径编码.比如节点H就是010(用左0,右1的规则) 2

Huffman编码

Huffman编码用来解决最小二叉树问题... 用堆来维护,所用用优先队列(稍微修改一下放入方式)每次将两个权值最小的取出来,然后把他们的和再放进去,重复这个操作就可以解决了 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 typedef long long ll; 5 6 int main(){ 7 priority_queue<int>que; 8 int n, x; 9 cin>

UVa10954 Add All (Huffman编码,优先队列)

链接:http://vjudge.net/problem/UVA-10954 分析:Huffman编码建立过程,每次贪心选取两个当前最小数,从集合中删去,然后把它们的和放回集合,用优先队列去模拟集合而且可以优化取最小数过程. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 const int maxm = 500 + 5; 7 8 int

Huffman编码之文件的解/压缩

问题描述:           生活中文件压缩技术可谓随处可见,在数据的密集型传输中文件压缩是一项重要的实用性技术.例如:较大文件的下载,传输等.常见的文件压缩工具有winRAR,2345好压,快压(KuaiZip)等,这些工具已经开发的相当牛逼,但是作为入门级的程序员来说,不能只停留在观摩的立场上,扮演使用者的角色.有必要深入了解其底层的基础实现方式,掌握基础的文件压缩原理,所以在此将其视为一个小型项目列出,以供大家交流探讨,相互学习.... ★在此之前,先来说说什么是文件压缩,用以抛出一个基

Huffman编码——Java实现

Huffman编码 是一种编码方式,常用于无损压缩.本文只介绍用Java语言来实现该编码方式的算法和数据结构. Huffman编码的核心在于构建一颗最优化的二叉树,首先要得到一个原数据编码中的[编码:频率]的列表,然后根据列表构建二叉树,最后对二叉树编码. 第一步: 计算出每个词(编码)出现的频次,并输出到一个列表 例如字符串:"this is an example of a huffman tree", 它的二进制编码是11101001101000110100111100111000