算法速成(十三)树操作之赫夫曼树

今天说下最后一种树,大家可否知道,文件压缩程序里面的核心结构,核心算法是什么?或许你知 道,他就运用了赫夫曼树。

听说赫夫曼胜过了他的导师,被认为”青出于蓝而胜于蓝“,这句 话也是我比较欣赏的,嘻嘻。

一  概念

了解”赫夫曼树“之前,几个必须要知道 的专业名词可要熟练记住啊。

1: 结点的权

   “权”就相当于“重要度” ,我们形象的用一个具体的数字来表示,然后通过数字的大小来决定谁重要,谁不重要。

2: 路径

树中从“一个结点"到“另一个结点“之间的分支。

3: 路径长度

一 个路径上的分支数量。

4: 树的路径长度

从树的根节点到每个节点的路径长度之和。

5: 节点的带权路径路劲长度

其实也就是该节点到根结点的路径长度*该节点的权。

6:   树的带权路径长度

树中各个叶节点的路径长度*该叶节点的权的和,常用 WPL(Weight Path Length)表示。

二: 构建赫夫曼树

上面说了那么多,肯定是为下面 做铺垫,这里说赫夫曼树,肯定是要说赫夫曼树咋好咋好,赫夫曼树是一种最优二叉树,

因为 他的WPL是最短的,何以见得?我们可以上图说话。

时间: 2024-11-02 05:50:24

算法速成(十三)树操作之赫夫曼树的相关文章

经典算法题每日演练——第十三题 赫夫曼树

       赫夫曼树又称最优二叉树,也就是带权路径最短的树,对于赫夫曼树,我想大家对它是非常的熟悉,也知道它的应用场景, 但是有没有自己亲手写过,这个我就不清楚了,不管以前写没写,这一篇我们来玩一把.   一:概念  赫夫曼树里面有几个概念,也是非常简单的,先来看下面的图: 1. 基础概念 <1>  节点的权: 节点中红色部分就是权,在实际应用中,我们用"字符"出现的次数作为权. <2>  路径长度:可以理解成该节点到根节点的层数,比如:"A&quo

数据结构——赫夫曼树

1 基本概念 赫夫曼树(Huffman Tree)又称为最优树,是一类带权路径长度最短的树.本文仅讨论最优二叉树. 树的路径长度是指从树根到树中其余各个结点的路径长度之和.对具有n个结点的二叉树而言,完全二叉树具有最短的树的路径长度. 若在二叉树中,树叶结点带有权值,则有:结点的带权路径长度定义为从树根到该结点之间的路径长度与该结点上所带权值之积. 若树中有n个树叶结点,且每个树叶结点均带有权值,则有:树的带权路径长度定义为树中所有树叶结点的带权路径长度之和,可记为: 有时,也将树的路径长度称为

数据-赫夫曼树的生成,完成赫夫曼编码的输出

问题描述 赫夫曼树的生成,完成赫夫曼编码的输出 实现赫夫曼树的生成,完成赫夫曼编码的输出: 要求 利用动态分配数组存储赫夫曼树,设计一组输入数据(要求为二元组,分别为字符集与每个字符出现的频率),能够对其进行如下操作: 1)对输入的数据构造成一棵Huffman 树. 2)根据生成的Huffman 树进行Huffman 编码,实现对输入数据的Huffman 编码输出. 我承认这是一个作业贴,但确实没时间做了 才来找人帮忙的

赫夫曼树

赫夫曼树又称最优树,是一类带权路径长度最短的树. 路径:由一结点到另一结点间的分支所构成 路径长度:路径上的分支数目 例如上面的a->e的路径长度=2 带权路径长度:结点到根的路径长度与结点上权的乘积 树的带权路径长度:结点到根的路径长度与结点上权的乘积 赫夫曼树:带权路径长度最小的树 上面这个图的树的值为WPL=7*2+5*2+2*2+4*2=36 赫夫曼树构造过程 基本思想:使权大的结点靠近根 操作要点:对权值的合并.删除.替换,总是合并当前值最小的两个 赫夫曼树的构造过程 根据给定的n个权

编码-赫夫曼树出错 ,编译没错 不知道哪里错了运行不了

问题描述 赫夫曼树出错 ,编译没错 不知道哪里错了运行不了 编译没有错误,运行失败 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 没分号";" #define STACKINCREMENT 10 //存储空间分配增量 #define TRUE 1 #def

编码-哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出)

问题描述 哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出) #include #include #include #define maxsize 100 #define max 100 typedef struct { char data; int weight; int parent; int lchild; int rchild; }huffnode; typedef struct { char cd[max]; int start; }

解析C++哈夫曼树编码和译码的实现_C 语言

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

编码-霍夫曼树程序,输入字符串统计字符出现次数并译码。请问如何改成从文件读入字符串?

问题描述 霍夫曼树程序,输入字符串统计字符出现次数并译码.请问如何改成从文件读入字符串? //生成HuffmanCode文件的两个函数void HuffmanEncoding(HuffmanTree HTHuffmanCode HC){//根据HuffmanTreeHT求HuffmanCode表HC int cpi; char cd[n]; int start; cd[num] = ''; for(i = 1;i <= num;i++){ start = num; c = i; while((p

哈夫曼树及哈夫曼编码

         一,引言          如上图,是一个判断体重在什么范围内的判定树,例如,学校体检的时候,我们反复用这个算法,当你输入一个体重:200斤,然后程序就开始反复判断了,经过三次判断,它发现你过重,然后重启系统了,又来一个人,还是200斤,三次判断之后,又系统重启了-后面的200多个200多斤的盘子判断完了之后,来了个120的,终于是个比较正常的体重了,但是系统一判断完,系统还是重启,反复检查之后,发现你那台8086时代的电脑终于撑不住了~      于是你改了下算法,换了一棵判