哈夫曼树基本概念与构造

树的权值:每个树节点所在的那个数字。

路径:两个节点之间所经过的分支。

路径长度:某一路径上的分支条数。

节点带权路径长度:节点的权值*该节点的路径长度。

树带权路径长度:所有叶子节点的带全路径长度之和。

a、路径和路径长度

若在一棵树中存在着一个结点序列k1,k2,……,kj,使得ki是ki+1的双亲(1《=i《j),则称此结点序列是从k1到kj的路径。

从k1到kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1.

b、结点的权和带权路径长度

在许多应用中,常常将树中的结点赋予一个有着某种意义的实数,我们称此实数为该结点的权,(如下面一个树中的蓝色数字表示结点的权)

结点的带权路径长度规定为从树根结点到该结点之间的路径长度与该结点上权的乘积。

c、树的带权路径长度

树的带权路径长度定义为树中所有叶子结点的带权路径长度之和,公式为:

其中,n表示叶子结点的数目,wi和li分别表示叶子结点ki的权值和树根结点到ki之间的路径长度。

如下图中树的带权路径长度WPL=9x2+12x2+15x2+6x3+3x4+5x4=122

d、哈夫曼树

哈夫曼树又称最优二叉树。它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。

如下图为一哈夫曼树示意图。

根据哈弗曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

哈弗曼依据这一特点提出了一种构造最优二叉树的方法,其基本思想如下:

下面演示了用Huffman算法构造一棵Huffman树的过程:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。n个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:

(1)将w1、w2、…,wn看成是有n棵树的森林(每棵树仅有一个结点);

(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

如:对下图中的六个带权叶子结点来构造一棵哈夫曼树,步骤如下:

注意:为了使得到的哈夫曼树的结构尽量唯一,通常规定生成的哈夫曼树中每个结点的左子树根结点的权小于等于右子树根结点的权。

//2、根据数组a中n个权值建立一棵哈夫曼树,返回树根指针

structBTreeNode*CreateHuffman(ElemTypea[],intn)

{

inti,j;

structBTreeNode**b,*q;

b=malloc(n*sizeof(structBTreeNode));

for(i=0;i《n;i++)//初始化b指针数组,使每个指针元素指向a数组中对应的元素结点

b[i]=malloc(sizeof(structBTreeNode));

b[i]-》data=a[i];

b[i]-》left=b[i]-》right=NULL;

}

for(i=1;i《n;i++)//进行n-1次循环建立哈夫曼树

//k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标

intk1=-1,k2;

for(j=0;j《n;j++)//让k1初始指向森林中第一棵树,k2指向第二棵

if(b[j]!=NULL&&k1==-1)

k1=j;

continue;

if(b[j]!=NULL)

k2=j;

break;

for(j=k2;j《n;j++)//从当前森林中求出最小权值树和次最小

if(b[j]-》data《b[k1]-》data)

k2=k1;

elseif(b[j]-》data《b[k2]-》data)

//由最小权值树和次最小权值树建立一棵新树,q指向树根结点

q=malloc(sizeof(structBTreeNode));

q-》data=b[k1]-》data+b[k2]-》data;

q-》left=b[k1];

q-》right=b[k2];

b[k1]=q;//将指向新树的指针赋给b指针数组中k1位置

b[k2]=NULL;//k2位置为空

free(b);//删除动态建立的数组b

returnq;//返回整个哈夫曼树的树根指针

在电文传输中,需要将电文中出现的每个字符进行二进制编码。在设计编码时需要遵守两个原则:

(1)发送方传输的二进制编码,到接收方解码后必须具有唯一性,即解码结果与发送方发送的电文完全一样;

(2)发送的二进制编码尽可能地短。下面我们介绍两种编码的方式。

1.等长编码

这种编码方式的特点是每个字符的编码长度相同(编码长度就是每个编码所含的二进制位数)。假设字符集只含有4个字符A,B,C,D,用二进制两位表示的编码分别为00,01,10,11。若现在有一段电文为:ABACCDA,则应发送二进制序列:00010010101100,总长度为14位。当接收方接收到这段电文后,将按两位一段进行译码。这种编码的特点是译码简单且具有唯一性,但编码长度并不是最短的。

2.不等长编码

在传送电文时,为了使其二进制位数尽可能地少,可以将每个字符的编码设计为不等长的,使用频度较高的字符分配一个相对比较短的编码,使用频度较低的字符分配一个比较长的编码。例如,可以为A,B,C,D四个字符分别分配0,00,1,01,并可将上述电文用二进制序列:000011010发送,其长度只有9个二进制位,但随之带来了一个问题,接收方接到这段电文后无法进行译码,因为无法断定前面4个0是4个A,1个B、2个A,还是2个B,即译码不唯一,因此这种编码方法不可使用。

因此,为了设计长短不等的编码,以便减少电文的总长,还必须考虑编码的唯一性,即在建立不等长编码时必须使任何一个字符的编码都不是另一个字符的前缀,这宗编码称为前缀编码(prefixcode)

(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;

(2)从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码

假设一个文本文件TFile中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13}

利用哈夫曼树可以为文件TFile构造出符合前缀编码要求的不等长编码

具体做法:

1.将TFile中7个字符都作为叶子结点,每个字符出现次数作为该叶子结点的权值

2.规定哈夫曼树中所有左分支表示字符0,所有右分支表示字符1,将依次从根结点到每个叶子结点所经过的分支的二进制位的序列作为该

结点对应的字符编码

3.由于从根结点到任何一个叶子结点都不可能经过其他叶子,这种编码一定是前缀编码,哈夫曼树的带权路径长度正好是文件TFile编码的总长度

THE END
1.2024-静态路由算法:讲解静态路由算法的原理和配置方法,通过示例让学生理解静态路由的应用。 -用时:5分钟 -动态路由算法:详细讲解动态路由算法(如RIP和OSPF)的原理和计算过程,通过动画演示算法的工作机制。 -用时:5分钟 -路由路径优化:通过案例分析,展示如何根据网络状况调整路由路径,提高网络性能。 -用时:5分钟 3.巩固https://m.book118.com/html/2024/1218/7026056030010011.shtm
2.第7集:路径计算教育视频高清540P 2.0x1.5x1.25x1.0x0.8x 50 循环播放 画面色彩调整 登录加入不吐不快的弹幕大军 发送 分享: 播单 手机看 下载 顶 10:44 第7集:路径计算 2019-12-09 14:05 03:00 上马回来居然产生了空虚感,怎么解忧,唯有继续训练!分享几个赛道上看到的让人起鸡皮疙瘩的标语~ http://my.tv.sohu.com/pl/9610109/165753413.shtml
3.如何使用向量计算路径步骤类似于地图导航的应用场景,当在地图里面,知道了起点,知道了终点,那么必然有一条,最短(或者最合适)的路径,有了路径数据,就能在地图上绘制一根路线,当用户遵循这个路线走的过程,就会分解成多个步骤。本片文章旨在如何利用路线的数据,计算出步骤的数据。 问题 https://www.jianshu.com/p/aa11dc9cfc67
4.路径/轨迹规划常见算法的演变和原理路径规划算法历程过程:在全局地图上随机撒点,去除与障碍物重合的点,然后进行路径搜索 输出:连接采样点的路径 缺点: 1,已知全局信息 2,路径不平滑 RRT 输入:局部环境地图 过程:贪心算法 缺点: 1,路径不平滑 Lattic: 优点: 1,环境网格化,因为在规则的道路上行驶,没有必要随机撒点 https://blog.csdn.net/ChenGuiGan/article/details/124411350
5.软件项目活动图关键路径算法演示(转载)haishashou软件项目活动图关键路径算法演示(转载) 如上图,是一个AOE网,点表示状态,边表示活动及其所需要的时间。为了求出关键路径,我们使用一下算法: 1.求出到达各个状态的最早时间(按最大计) 这个过程是要从源点开始向汇点顺推: V1是源点,其最早开始时间是0。https://www.cnblogs.com/haishashou/p/9817184.html
6.机器人是如何规划路径的?动画演示一下吧澎湃号·湃客最近,GitHub 上开源了一个存储库,该库实现了机器人技术中常用的一些路径规划算法,大部分代码是用 Python 实现的。值得一提的是,开发者用 plotting 为每种算法演示了动画运行过程,直观清晰。 项目地址: https://github.com/zhm-real/PathPlanning 该开源库中实现的路径规划算法包括基于搜索和基于采样的规划算法,具https://www.thepaper.cn/newsDetail_forward_9959477
7.路径规划算法的gif演示Github地址:github来自蚁工厂路径规划算法的gif演示 Github地址:github.com/zhm-real/PathPlanning 包括的算法有:└── Search-based Planning ├── Breadth-First Searching (BFS) ├── Depth-First Searching (DFS) ├── Best-Fhttps://weibo.com/2194035935/KC3YUvzpv
8.10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径这篇文章主要介绍了10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且https://www.jb51.net/article/167505.htm
9.蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题。在讲解蚁群算法求解VRPTW问题之前,不知道各位是否观察过现实生活中蚂蚁是怎么觅食的,说得形象一点的话就是成群的蚂蚁前赴后继地找食物吃。大家应该也很容易理解,蚂蚁一般是成群出动,一旦一个蚂蚁找到了食物,那后面的蚂蚁肯定跟着前面蚂蚁的步伐才会https://www.yoojia.com/ask/17-11663630837869846477.html
10.基于GPS轨迹的规律路径挖掘算法Zheng等基于用户的历史轨迹,分析并挖掘了轨迹中的潜在知识,包括交通模式[ 11],感兴趣区域及旅行序列[ 12],以及更高效的出行路径[ 13]等。 本文以用户的历史轨迹数据为基础,对用户的日常规律路径进行挖掘和提取,并识别用户在轨迹中所采用的交通模式。最后基于178名用户4年的轨迹记录,对算法进行了性能测试。并邀请http://xuebao.jlu.edu.cn/gxb/article/2014/1671-5497-44-6-1764.html
11.最短路径模板+解析——(FLoyd算法)[通俗易懂]最短路径模板+解析——(FLoyd算法)[通俗易懂] 大家好,又见面了,我是你们的朋友全栈君。 对于无权的图来说: 若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。 由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即https://cloud.tencent.com/developer/article/2056742
12.最短路径算法小软件v6.0最短路径算法小软件官方下载全局最短路径问题 求图中所有的最短路径。 软件特色 支持进行手工的输入您需要的边长 也支持载入用户的项目 只对一个项目进行支持 也对初始化的质点数据进行设置 可以边长、关系进行定义 包括了对质点的坐标进行快速的输入 也支持对算法进行选择 支持对演示的图形进行快速的查看 https://soft.3dmgame.com/down/254184.html
13.周报北约公布量子技术研究计划;1月欧洲量子技术公司融资9600万韩国科学技术研究院团队演示量子力学中的信息守恒定律 韩国科学技术研究院Hyang-Tag Lim、Seung-Woo Lee团队展示了用于测试不同类型的量子测量并保存全部信息的方案。 测量方案使用了光子qutrit——一个三能级量子系统,其状态由单个光子的路径模式定义。每次测量过程中,研究人员评估了三种类型的信息内容:观察者获得的关于https://www.360doc.cn/article/47812380_1018227781.html
14.游戏中常用的寻路算法(6):地图表示寻路算法不是线性的,而是越来越差。如果需要行进的距离翻倍了,那么会消耗超过两倍的时间来找路径。你可以想象寻路算法是在搜索一个类似圆的区域,当圆的直径加倍时,区域变成原来的四倍。一般来说,在地图表示中,节点越少,A*算法越快。而且节点越匹配角色单元将要移向的位置,路径质量越好。 https://www.gameres.com/msg_489480.html
15.GitHubrichenyunqi/Maze在计算机取得游戏控制权后,程序将使用参数设置模块中用户选中的迷宫寻路算法计算出从游戏入口到游戏出口的路径,并按用户进行游戏的形式按用户选择的进行游戏时每走一步的所用时间将从入口到出口的行走路径演示一遍。 声音设置按钮:即指定是否开启背景音乐的按钮,在用户进行游戏的状态和计算机进行游戏的状态两种状态下均可https://github.com/richenyunqi/Maze-game
16.中心度算法演示中心度算法演示 中心度算法示例 ?两个简单的例子用网络图表示 ?三个计算过程度数中心性、中介中心性和接近中心性 ? 例子一:2 13 4 ? 例子一 2 度数中心性 原理:各个节点直接相连节点数 节点1234计算(直接连接了节点2、3、4)共3(直接连接了节点1、3)共2(直接连接了节点1、2)共2(直接连接https://wenku.baidu.com/view/b3f89d0dcc1755270722080a.html
17.旋转拖布自动抬升?追觅扫拖一体机器人S10Pro全方位解读路径算法及绕障 我看到网上有不少人吐槽追觅的算法过于保守,在清洁地面的时候容易出现较大面积漏扫。比如在上面的这个动图演示中,扫地机在距离踢脚线还有很多距离的时候,就早早地“回头”了▲ 但这真的是因为算法过于谨慎而导致的漏扫么? 我们再来看另一个动图。这个动图展示的是扫地机在进行具体的清扫前,沿着https://m.zhuxiaobang.com/article/7097159383078928904?channel_source=baidu_biji
18.关于A*DijkstraBFS寻路算法的可视化解释雷峰网点此链接进入交互演示页面:https://interactive-pathfinding.netlify.com/ 广度优先搜索、Dijkstra和A*是图上的三种典型路径规划算法。它们都可用于图搜索,不同之处在于队列和启发式函数两个参数。 本项目探索并可视化不同算法如何根据选择参数进行图搜索。 https://www.leiphone.com/news/202101/kXYgvei8w3dBOAee.html
19.算法高级(35)最优路径选择前面我们学习了图算法中的最短路径算法,可以参考我的这篇博文常用的图算法:最短路径(Shortest Path),解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等。简单回顾如下: Dijkstra最短路径算法是基于递推的思想设计的未达顶点的最短路径一定是由已达顶点的最短路径求出。https://blog.51cto.com/u_14351881/5629918