`
Dev|il
  • 浏览: 125207 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Huffman编码

 
阅读更多
最优二叉树(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编码的java实现

    Huffman编码是一种高效的数据压缩算法,它基于字符出现频率构建最优前缀树,进而为每个字符分配唯一的二进制编码。在Java环境下实现Huffman编码,我们需要理解以下几个关键概念: 1. **字符频率统计**:首先,我们...

    Quake3 自适应huffman编码分析

    ### Quake3自适应Huffman编码分析 #### 一、Huffman编码原理及Quake3应用背景 Huffman编码是一种广泛应用于数据压缩领域的算法,它能够有效地减少存储或传输的数据量,尤其适用于文本数据的压缩。Huffman编码的...

    C语言实现Huffman树,Huffman编码

    在数据压缩技术中,Huffman编码是一种广泛使用的无损数据压缩算法,它基于字符频率进行编码,使得频繁出现的字符拥有较短的编码,从而提高压缩效率。本项目将深入探讨如何使用C语言实现Huffman树和Huffman编码。 ...

    图像的Huffman编码

    ### 图像的Huffman编码详解 #### 一、Huffman编码原理 Huffman编码是一种用于数据压缩的熵编码算法,由David A. Huffman在1952年提出。该算法的核心是通过构建一棵Huffman树(又称为最优二叉树),来为数据中的每...

    Huffman编码和解码的C语言实现

    ### Huffman编码和解码的C语言实现 #### 引言 随着信息技术的快速发展,数据量呈爆炸式增长,这对存储设备的容量、通信线路的带宽以及计算机的处理能力提出了更高要求。在这种背景下,数据压缩技术变得尤为重要。...

    Huffman编码测试文件

    Huffman编码是一种基于频率的无损数据压缩方法,由David A. Huffman于1952年提出。在信息论和计算机科学中,它被广泛应用于文本、图像、音频和其他类型的数据压缩。这个压缩包文件“Huffman编码测试文件”包含了各种...

    Huffman编码C++源代码

    ### Huffman编码C++源代码解析 #### 一、Huffman编码简介 Huffman编码是一种广泛应用于数据压缩领域的编码方法,其基本思想是根据符号出现的频率来决定编码的长度,出现频率高的符号会分配较短的编码,而出现频率...

    基于Matlab的图像Huffman编码的实现

    Huffman编码是一种基于频率的无损数据压缩方法,最初由D.E. Huffman在1952年提出。本项目实现了在Matlab环境下对图像进行Huffman编码的过程,包括图像的灰度化、编码、解码以及计算压缩比和执行时间。 首先,我们要...

    Huffman树 及 Huffman编码 演示程序

    Huffman树,也被称为哈夫曼树或霍夫曼树,是一种特殊的二叉树,用于在数据压缩领域实现高效的编码方法——Huffman编码。这种编码技术是基于频率的,能够为出现频率高的字符分配较短的编码,而为出现频率低的字符分配...

    Huffman编码构成过程.files.rar

    Huffman编码是一种高效的数据压缩算法,由David A. Huffman在1952年提出,主要用于无损数据压缩。它的核心思想是构建一棵特殊的二叉树——Huffman树,通过这棵树来为每个字符生成唯一的二进制编码。下面将详细阐述...

    Huffman编码C++实现

    Huffman编码C++实现 Huffman编码是一种变长前缀编码算法,广泛应用于数据压缩、图像处理、文本处理等领域。下面是对Huffman编码C++实现的详细解释。 Huffman树 Huffman树是一种特殊的二叉树,它的叶子结点代表...

    数据结构上机实验 Huffman编码(二叉树) C语言

    实验三、Huffman编码(二叉树)  实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。  实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现...

    Huffman编码 程序 数据结构实验

    Huffman编码是一种基于二叉树的数据压缩方法,由David A. Huffman在1952年提出,主要用于无损数据压缩。它的核心思想是利用字符出现频率的差异来创建一棵特殊的二叉树——Huffman树,使得频繁出现的字符拥有较短的...

    Huffman编码(MFC版本)

    Huffman编码是一种高效的数据压缩算法,由David A. Huffman在1952年提出,主要用于文本数据的压缩。它的核心思想是构建一棵特殊的二叉树——哈夫曼树,通过这棵树来为每个字符生成一个唯一的前缀编码,使得频繁出现...

    Huffman编码以及其编码效率的计算

    Huffman编码是一种基于贪心策略的数据压缩算法,由David A. Huffman在1952年提出。它通过构建一棵特殊的二叉树——哈夫曼树(Huffman Tree),来为输入符号(通常是一些字符)分配不同的二进制编码,使得出现频率高...

    jpeg压缩编码中的Huffman编码表

    JPEG文件格式中使用了多种技术来实现压缩,其中Huffman编码就是关键技术之一。Huffman编码是一种广泛使用的熵编码方法,属于无损压缩技术,它可以将数据转换为变长编码,使得频繁出现的字符使用较短的编码,不常见的...

    用Huffman编码对文件进行压缩的C语言实现

    ### 用Huffman编码对文件进行压缩的C语言实现 #### 一、引言 随着计算机技术的发展,数据量的增长速度越来越快,如何有效地管理和处理这些数据成为了亟待解决的问题。其中,数据压缩技术因其能够有效减少数据占用...

    huffman编码/译码的实现

    3. **生成Huffman编码**:调用`HuffmanCode()`函数生成每个字符的Huffman编码。 4. **显示编码结果**:使用`HShowCode()`函数展示每个字符及其对应的编码。 5. **文件编码**:通过`CharCodeFile()`函数对文件进行...

Global site tag (gtag.js) - Google Analytics