哈夫曼树及其应用

树——哈夫曼树的概念及其应用 目录 哈夫曼概念 引入 相关概念 举例 基本概念 特点 哈夫曼树的构造算法 1.哈夫曼算法 举例 2.哈夫曼树算法实现: 举例 实现 哈夫曼典型应用—哈夫曼编码 思想 举例 产生的两大问题 算法实现 文件的编码和解码 编码 解码 哈夫曼概念: 引入: 由上述对比,为找到效率最高的判别树,引入了哈夫曼树(最优二叉树)的概念。 相关概念: ... 阅读详情

哈夫曼树树,也称最优二叉树,是指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。

二叉树的路径长度是指由根结点到所有叶结点的路径之和。设二叉树具有n个带权值的叶结点,那么从根结点到各个叶结点的路径长度和相应结点权值的乘积之和叫做二叉树的带权路劲长度。记为:

                                                                                          

其中Wk为第k个叶结点的权值,Lk为第k个叶结点的路径长度。如图所示的二叉树,它的带权路径长度为WPL = 1 x 2 + 3 x 2 + 5 x2 + 7 x 2 = 32 ;

                                                                                       

哈夫曼树种权值越大的结点越靠近根结点,而权值越小的结点则越远离结点。根据这一特点可以得到哈夫曼树的构造方法,构造方法如下:

(1)由给定的n个权值(W1 ,W2, W3, ... ,Wn)构造n棵只有一个叶结点的二叉树,从而得到二叉树的集合F = {T1, T2,..., Tn};

(2)在F张选取根结点的权值最小和次小的两颗二叉树分别最为左右子树构造一颗新的二叉树,这棵新的二叉树的根节点的权值为左右子树结点的权值之和;

(3)在集合F中删除为左右子树的两个二叉树,并将新建立的二叉树加入到集合F中;

(4)重复(2),(3)步骤,当F中只剩下一棵二叉树,即为我们所要建立的哈夫曼树;

由哈夫曼树的构造方法可知,哈夫曼树具有以下特点:

(1)满二叉树不一定是哈夫曼树树;

(2)哈夫曼树不存在度数为1的结点;

(3)根据(2)可得,根据二叉树的性质得n个叶结点的二叉树有n-1个度数为2的结点,所以整棵二叉树共有2n-1个结点;

哈夫曼树的构造:

#include <stdio.h>
#include <stdlib.h>

#define MAXVALUE 1000        //定义最大权值;
#define MAXLEAF 30           //叶结点的最多个数
#define MAXNODE MAXLEAF*2-1  //哈夫曼树的结点个数

typedef struct
{
	int weight;
	int parent;
	int lchild;
	int rchild;
}HNodeType;
/*-----------------------------------
  函数功能:构造哈夫曼树
  函数参数:哈夫曼树HuffNode
            叶子结点的个数n
 -----------------------------------*/

void Huffman(HNodeType HuffNode[],int n)
{
	int m1,m2,x1,x2,i,j;
	//初始化
	for(i = 0;i < 2*n-1;i++)
	{
		HuffNode[i].weight = 0;
		HuffNode[i].parent = -1;
		HuffNode[i].lchild = -1;
		HuffNode[i].rchild = -1;
	}
	//输入结点的权重
	printf("Input the weight of node:");
	for(i = 0;i < n;i++)
	{	
		scanf("%d",&HuffNode[i].weight);
	}
	//构造哈夫曼树n-1个非叶子结点
	for(i = 0;i < n-1;i++)
	{
		//m1,m2分别保存F中权值最小的权重
		m1 = m2 = MAXVALUE;    
		//x1,x2保存两个权值最小的结点的下标
		x1 = x2 = 0;
		for(j = 0;j < n+i;j++)
		{
			if(HuffNode[j].weight < m1 && HuffNode[j].parent == -1)
			{
				m2 = m1;
				x2 = x1;
				m1 = HuffNode[j].weight;
				x1 = j;
			}
			else if(HuffNode[j].weight < m2 && HuffNode[j].parent == -1)
			{
				m2 = HuffNode[j].weight;
				x2 = j;
			}
		}

		//合并为一棵子树
        HuffNode[x1].parent = n+i;
		HuffNode[x2].parent = n+i;
		HuffNode[n+i].weight = HuffNode[x1].weight+ HuffNode[x2].weight;
		HuffNode[n+i].lchild = x1;
		HuffNode[n+i].rchild = x2;
	}
}
哈夫曼树的应用

(1)哈夫曼编码

#define MAXBIT 10  //哈夫曼编码的最大长度
typedef struct
{
<span style="white-space:pre">	</span> int bit[MAXBIT];  //保存哈夫曼编码
<span style="white-space:pre">	</span> int start;        //编码存放在从start+1到MAXBIT
}HCodeType;


/*----------------------------------
 *函数功能:哈夫曼编码
 ----------------------------------*/
void HuffmanCode(HNodeType HuffNode[],int n)
{
       HCodeType HuffCode[MAXLEAF],cd;
       int i,j,c,p;
       //求每一个叶子结点的哈夫曼编码
       for(i = 0;i < n;i++)
       {
            cd.start = MAXBIT-1;
            c = i;
            p = HuffNode[c].parent;
            //从叶子一直往上
            while(p != -1)
            {
               if(HuffNode[p].lchild == c)
                     cd.bit[cd.start] = 0;
               else
                     cd.bit[cd.start] = 1;
               cd.start--;
               c = p;
               p = HuffNode[c].parent;
           }
          //保存哈夫曼编码
          for(j = cd.start+1;j < MAXBIT;j++)
          {
                 HuffCode[i].bit[j] = cd.bit[j];
          }
          HuffCode[i].start = cd.start;
      }
     //输出
     for(i = 0; i < n;i++)
     {
          for(j = HuffCode[i].start+1;j < MAXBIT;j++)
          {
                printf("%d",HuffCode[i].bit[j]);
          }
          printf("\n");
      }
}

/*----------------------------------
  函数功能:对哈夫曼编码进行解码
  函数参数:哈夫曼树HuffNode
            待解码的字符串code
			叶子结点个数n
  ---------------------------------*/
void decoding(HNodeType HuffNode[],char code[],int n)
{
	char *p = code;
	//n个叶结点的哈夫曼树总共有2n-1个结点,根结点的位置为2*n-2
	int i,root = 2*n-2; 
	while(*p != '\0')
	{
		i = root;
		//从根部开始遍历
		while(HuffNode[i].lchild != -1 && HuffNode[i].rchild != -1)
		{
			if(*p == '0')
				i = HuffNode[i].lchild;
			else
				i = HuffNode[i].rchild;
			p++;
		}
		printf("%3d",HuffNode[i].weight);
	}
	printf("\n");

}

(2)判断比较

例如,如果要编制一个将百分之转换为五级分制的程序。通常情况下只需要条件语句便可完成。如:

if (a<60) b=”bad”;
else if (a<70) b=”pass”
else if (a<80) b=”general”
else if (a<90) b=”good”
else b=”excellent”;

如果数据量小的话还好说,可是当数据量大的时候,效率就不会很高这个时候我们就可以通过哈夫曼树来进行判定,把出现频率高的分数段赋予更大的权值,那么比较的时候就会越快。

上述哈夫曼树为静态哈夫曼树,静态哈夫曼编码的最大的缺点就是需要对数据进行两次扫瞄,第一次统计原始字符中各字符出现的频率,第二遍进行编码。为了解决这个问题Faller提出了自适应哈夫曼编码,即动态哈夫曼树,也就是说,对第t+1个字符编码是根据原始数据中前t个字符得到的哈夫曼树来进行的.

在构造动态哈夫曼编码树的过程中需要遵循两条重要的规则

(1)权值大的结点,结点编号也较大。

(2)父结点的节点编号总是大于子节点编号

这两条规则称为兄弟属性。

静态哈夫曼方法的最大缺点就是

它需要对原始数据进行两遍扫描

:

第一

遍统计原始数据中各字符出现的频

率,利用得到的频率值创建哈夫曼树

并将树的有关信息保存起来,便于解

压时使用

;

第二遍则根据前面得到的哈

夫曼树对原始数据进行编码,并将编

对一个输入符号进行哈夫曼编码并更新编码的流程图如图所示:

                                         


具体实现:

#include <stdio.h>
#include <stdlib.h>


struct Node
{
	unsigned char letter;  //字符
	int weight;            //权重
	int order;             //编号
	struct Node *parent;   //父结点
	struct Node *lchild;   //左孩子
	struct Node *rchild;   //右孩子
	struct Node *front;    //前指针
	struct Node *after;    //后指针
}*Root;

struct LeafNode
{
	struct LeafNode *next;   //叶结点链的next指针
	struct Node *charnode;  
}*Leaf,*Weight;   //叶子链,权重链的头指针


void compression(char string[]);
void decompression(void);
void update(struct Node *);
void addchar(unsigned char);
void producecode(struct Node *);
void InsertWeight(struct Node *Temp);

/**************************************
 函数功能:初始化
 **************************************/
void initial(void)
{
	Root = (struct Node *)malloc(sizeof(struct Node));
	Root->parent = NULL;
	Root->lchild = Root->rchild = NULL;
	Root->front = Root->after = NULL;
	Root->weight = 0;
	Root->letter = 0;
	Root->order = 1000;
	Leaf = (struct LeafNode *)malloc(sizeof(struct LeafNode));
	Weight = (struct LeafNode *)malloc(sizeof(struct LeafNode));
	Leaf->charnode = Root;
	Weight->charnode = NULL;
	Weight->next = Leaf->next = NULL;
}
/**************************************
 函数功能:添加字符,即叶结点
 函数参数:新的字符letter
 **************************************/
void addchar(unsigned char letter)
{
	struct Node *Tempa, *Tempb,*Tempc;
	struct LeafNode *q;
	Tempa = Leaf->charnode;
	Tempb = (struct Node *)malloc(sizeof(struct Node));
	Tempc = (struct Node *)malloc(sizeof(struct Node));

	Tempb->parent = Tempc->parent = Tempa;
	Tempb->lchild = Tempc->lchild = NULL;
	Tempb->rchild = Tempc->rchild = NULL;
	Tempb->front = Tempc->front = NULL;
	Tempb->after = Tempc->after = NULL;
	Tempb->letter = 0;
	Tempc->letter = letter;
	Tempb->weight = 0;
	Tempc->weight = 1;
	Tempb->order = Tempa->order - 2;
	Tempc->order = Tempa->order - 1; 
	Tempa->lchild = Tempb;
	Tempa->rchild = Tempc;

	//将新叶子结点插入到叶子链中
	q = (struct LeafNode *)malloc(sizeof(struct LeafNode));
	q->charnode = Tempc;
	Leaf->charnode = Tempb;
	q->next = Leaf->next;
	Leaf->next = q;
	InsertWeight(Tempc);
}


void producecode(struct Node *Pointer)
{
	char code[50],count = 0,i;
	if(Pointer != Root)
	{
		while(Pointer != Root)
		{
		    if(Pointer == (Pointer->parent->lchild))
				code[count] = '0';
			else
				code[count] = '1';
			count++;
	//		printf("权值:%3d;\n",Pointer->weight);
			Pointer = Pointer->parent;
		}
	}
	for(i = count -1;i >= 0;i--)
	{
		printf("%c",code[i]);
	}
	printf("\n");
}

/**************************************
 函数功能:插入权值
 函数参数:结点Temp
 **************************************/
void InsertWeight(struct Node *Temp)
{
	struct LeafNode *p,*q;
	char flag  = 0;
	struct Node *Tempa;
	p = Weight;
	Temp->after = Temp->front = NULL;
	//查找权重链中与插入结点权重相等的结点
	while(p->next != NULL)
	{
		if(p->next->charnode->weight == Temp->weight)
		{
			flag = 1;
			break;
		}
		else
			p = p->next;
	}
	//没找到,直接插入到权重链尾部
	if(!flag)
	{
		q = (struct LeafNode *)malloc(sizeof(struct  LeafNode));
		p->next = q;
		q->next = NULL;
		q->charnode = Temp;
	}
	else
	{   //按照序号由大到小插入
		Tempa = p->next->charnode;
		//需要插入的结点的序号最大
		if(Temp->order >= Tempa->order)
		{
			Temp->after = Tempa;
			Tempa->front = Temp;
			p->next->charnode = Temp;
		}
		else
		{
			while(Tempa->after != NULL)
			{
				if(Tempa->after->order < Temp->order)
					break;
				else
					Tempa = Tempa->after;
			}
			Temp->after = Tempa->after;
			Temp->front = Tempa;
			Tempa->after = Temp;
			if(Temp->after != NULL)
				Temp->after->front = Temp;
		}
	}
}

/**************************************
 函数功能:调整哈夫曼树
 函数参数:结点Temp
 **************************************/

void update(struct Node *Temp)
{
	struct Node *Tempa,*Tempc,*Pointer;
	struct LeafNode *p,*q,*b;
	unsigned char Letter;
	//当Temp不为Root时,即根节点时
	while(Temp != Root)
	{
		//当Temp->weight
		if(Temp->weight)
		{
			p = Weight;
			//在权重链中找到相同权重的结点
			while(p->next->charnode->weight != Temp->weight )
				p = p->next;
			//如果Temp->front == NULL,那么Temp就是相同权重的结点中序号最大的结点
			if(Temp->front != NULL)
			{
				Tempa = Temp;
				//找到序号最大的结点
				while(Temp->front != NULL)
					Temp = Temp->front;
			//	if(Temp != Tempa->parent)
			//	{
				//交换左孩子
				Pointer = Temp->lchild;
				if(Pointer != NULL)
					Pointer->parent = Tempa;
				Temp->lchild = Tempa->lchild;
				if(Temp->lchild != NULL)
					Temp->lchild->parent = Temp;
				Tempa->lchild = Pointer;
				//交换右孩子
				Pointer = Temp->rchild;
				if(Pointer != NULL)
					Pointer->parent = Tempa;
				Temp->rchild = Tempa->rchild;
				if(Temp->rchild != NULL)
					Temp->rchild->parent = Temp;
				Tempa->rchild = Pointer;
				//交换字符,但是不交换序号和权重,因为权重一样
				Letter = Temp->letter;
				Temp->letter = Tempa->letter;
				Tempa->letter = Letter;
				//如果交换的是叶结点的话,需要更新叶子链,同一个结点,序号没变,内容发生了改变
				if((Tempa->lchild == NULL)&&(Tempa->rchild == NULL))
				{
					b = Leaf;
					while(b != NULL)
					{
						if(b->charnode == Temp)
						{
							b->charnode = Tempa;
							break;
						}
						else
							b = b->next;
					}
				}
				if((Temp->lchild == NULL) && (Temp->rchild == NULL))
				{
					b = Leaf;
					while(b != NULL)
					{
						if(b->charnode == Tempa)
						{
							b->charnode = Temp;
							break;
						}
						else
							b = b->next;
					}
				}
			//	}
			}

			//更新权重链,取下序号最大的结点Temp,后面重新插入以更新
			p->next->charnode = Temp->after;
			if(Temp->after == NULL)
			{
				q = p->next;
				p->next = q->next;
				free(q);
			}
			else
				Temp->after->front = NULL;
		}
		Temp->weight++;
		Temp->after = Temp->front = NULL;
		//重新插入更新
		InsertWeight(Temp);
		Temp = Temp->parent;
	}
}
void compression(char string[])
{
	struct LeafNode *p;
	int i = 0;
	int flag;
	initial();  //初始化哈夫曼树
	while(string[i] != '\0')
	{
		flag = 0;
		p = Leaf->next;    //在叶子链中进行查找
		while(p != NULL)
		{
			//如果存在于叶子链中
			if(p->charnode->letter == string[i])
			{
				flag = 1;
				break;
			}
			else
				p = p->next;
		}
		//如果不存在于叶子链中
		if(!flag)
		{
			
			addchar(string[i]);             //添加此字符到哈夫曼树中
			update(Leaf->charnode->parent); //更新哈夫曼树,从插入结点的父结点开始
			producecode(Leaf->charnode);    //产生此字符的编码
		}
		else
		{	
			update(p->charnode);
			producecode(p->charnode);
		}
		i++;
	}
}

int main()
{
	char string[20];
	scanf("%s",string);
	compression(string);
	return 0;

}






Adaptive-Huffman-coding:自适应霍夫曼编码(也称为动态霍夫曼编码)是一种基于霍夫曼编码的自适应编码技术。 它允许在传输符号时构建代码,没有源分布的初始知识,允许一次性编码和适应数据中不断变化的条件 自适应霍夫曼编码 自适应霍夫曼编码(也称为动态霍夫曼编码)是一种基于霍夫曼编码的自适应编码技术。 它允许在传输符号时构建代码,没有源分布的初始知识,允许一次性编码和适应数据中不断变化的条件。 立即下载

相关推荐

软件测试方法——等价类划分法详解

!如果下面这些资料用得到的话可以直接拿走:1、自学开发或者测试必备的完整项目源码与环境2、测试工作中所有模板(测试计划、测试用例、测试报告等)3、软件测试经典面试题4、Python/Java自动化测试实战.pdf5、Jmeter/postman接口测试全套视频获取6、Python学习路线图。

MXB1220的博客 1万+

自适应哈夫曼编解码

自适应哈夫曼编码的数据压缩与解压技术

iqfqfqf的博客 3694

Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。通过crictl为k8s拉取镜像如下所示。可以通过ctr命令进行镜像推送。往私有仓库推送镜像如下。

Bulut0907 1万+

自适应哈夫曼编码

网上自适应哈夫曼编码的文章大多来自同一篇,而且在转载的过程中还有一定的错误。花了一天多的时间看懂了自适应哈夫曼编码的原理并且用链式树的结构完成了代码。原理:        自适应哈夫曼树的节点结构体如下:struct Node { int weight; int num; Node* p_left; Node* p_right; Node* p_parent; Node(Node* p...

qq_36533706的博客 1万+

MTK Linux Charger驱动分析(二) - power_supply_core.c

的核心作用可以概括为:提供统一的电源管理框架;管理电源设备注册、属性访问、事件通知;封装sysfs 接口和 uevent 通知,屏蔽硬件细节;驱动开发者只需要实现,不关心底层通知和接口细节。简单来说,它是电源子系统的“大脑和中枢”,具体的电池/充电器只是“信息源”。

iTom1900 1488

OpenFOAM-v2006重叠网格挖洞问题实战:如何手动修复overset代码中的边缘识别缺陷

本文深入探讨了OpenFOAM-v2006中重叠网格挖洞问题的实战解决方案,重点修复overset代码中的边缘识别缺陷。通过逆向工程解析挖洞决策机制,设计最小侵入式的函数override方案,并建立多级验证体系,有效解决了网格挖洞区域覆盖不全的问题,提升了计算流体动力学模拟的准确性和可靠性。

weixin_29216049的博客 430

自适应霍夫曼编码

与传统的静态霍夫曼编码相比,自适应霍夫曼编码的优点在于它不需要提前获取整个数据流的统计信息,而是在编码过程中根据实际观察到的数据进行动态调整。然后,从该字符节点开始,向根节点遍历,逐步更新各个节点的权重,并根据权重大小调整节点的位置,以保持编码的前缀性质。自适应霍夫曼编码的核心思想是将频率较高的字符用较短的编码表示,而频率较低的字符用较长的编码表示,从而实现数据的压缩。解码过程与编码过程相反,根据当前的霍夫曼编码树和读取的编码比特流,逐步遍历编码树,直到找到对应的字符或符号。

sun13047140038的博客 975

复古与新生:老毛子Padavan固件在旧设备上的现代化应用之旅

本文探讨了如何通过刷入Padavan固件,让小米路由器3G(R3G)等老旧设备重获新生,实现现代化应用。详细介绍了从硬件潜力分析、智能家居中枢搭建,到轻量级服务器部署和网络功能扩展的全过程,为技术爱好者提供了一条低成本、高性能的设备改造之路。

k8s6orchestrator的博客 1061

自适应Huffman编码

自适应Huffman编码,可用初始编码表(数字音视频技术,实验二) 如果你已经理解了 自适应Huffman编码 ,那么你不应该浪费时间在无聊的实验上 实验目的 1、深入掌握自适应Huffman编码的原理 2、掌握自适应Huffman编码算法的实现过程 3、掌握和熟悉利用编程语言实现自适应Huffman编码器和解码器 实验要求 1、实现编码器,对输入字符给出相应的编码结果; 2、实现解码器,对步骤1中的编码结果进行解码; 3、请使用初始编码表如下: 4、对字符串ABBCADAD进行编码; 5、截图显示编码中

qq_20082231的博客 2955

生信技能53 - WisecondorX自动化批量npz转换和reference构建

wiseconrdoX分析CNV适用于CNVseq、NIPT和WGS等项目。

LittleComputerRobot的博客 465

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

本文介绍了如何利用Unity和WebRTC技术实现远程画面传输。通过配置Render Streaming组件、设置信令管理器和视频流发送器,构建了一个可同步的Unity场景。文中详细说明了从场景搭建到浏览器端测试的完整流程,并提供了常见问题排查方法。该方案适用于远程调试、云游戏、VR共享等场景,具有低延迟、高兼容性等特点。文章还包含项目源码下载链接,方便读者实践操作。最终实现了Unity端到浏览器端的实时画面传输,为后续实现双向互动奠定了基础。

每日出拳老爷子的博客 1841

【数据结构(25)】5.7 哈夫曼树及其应用

严蔚敏版【数据结构】一、哈夫曼树的基本概念: 1. 哈夫曼树的特点。 二、哈夫曼树的构造算法: 1. 哈夫曼树的构造过程、 2. 哈夫曼算法的实现: 2.1 哈夫曼算法思路、 2.2 哈夫曼算法实现。 三、哈夫曼编码: 1. 哈夫曼编码思想: 1.1 前缀编码、 1.2 哈夫曼编码、 1.3 哈夫曼编码的性质、 2. 哈夫曼编码的算法实现、 3. 文件的编码和解码。

shangguanxiu的博客 2789

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【数据结构——哈夫曼树及其应用】

【数据结构——哈夫曼树及其应用】一、哈夫曼树的基本概念二级目录三级目录二、哈夫曼树的构造算法二级目录三级目录三、哈夫曼编码二级目录三级目录 一、哈夫曼树的基本概念 二级目录 三级目录 二、哈夫曼树的构造算法 二级目录 三级目录 三、哈夫曼编码 二级目录 三级目录 ...

lflcodeplus的博客 6270

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

通识哈夫曼树及其应用,一起来构造属于自己的哈夫曼树

本文主要介绍了哈夫曼树的背景、算法构造以及实际应用,然后,让我们一起来编写自己的哈夫曼树吧!!!!

Williamtym的博客 2867

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构——哈夫曼树及其应用

文章目录前言一、哈夫曼树的基本概念1.路径2.结点的路径长度3.树的路径长度4.权5.结点的带权路径长度6.哈夫曼树二、哈夫曼树的构造1.算法思想1.算法实现三、哈夫曼编码1.哈夫曼编码1.哈夫曼编码的实现四、文件的编码和解码1.编码2.解码 前言 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1L1+W2L2+W3L3+…+Wn..

qq_51594995的博客 1325

【数据结构】哈夫曼树及其应用

【数据结构】哈夫曼树及其应用

FishC的博客 1163

哈夫曼树Huffman Tree及其应用——哈夫曼编码

构造这种树的算法最早由哈夫曼于1952年提出的,因此称之为哈夫曼树。 **什么是哈夫曼树(Huffman Tree)+概念 ** (1)带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带 有权值 wk,从根结点到每个叶子结点的长度为 Lk,则每个叶子结 点的带权路径长度之和就是:WPL=w1L1+w2L2+…+wn*Ln。 最优二叉树或哈夫曼树: WPL最小的二叉树 。 (2)结点的权:在许多的应用中,将树中的结点赋予一个有着实际意义的数值,称此数值为该结点的权。 (3)结点的带权路径长

further_的博客 1796
上一篇: Windows文件操作
float_wind
博客等级 码龄11年 2粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值