数据结构——第二章树和森林:04哈夫曼树与哈夫曼编码

1.结点的路径长度:从根结点到该结点的路径上分支的数目。

2.树的路径长度:树中每个结点的路径长度之和。

3.树的带权路径长度:树中所有叶子结点的带权路径长度之和WPL(T) = ∑wklk(对所有叶子结点)

4.最优树:在所有含n个结点,并带相同权值的m叉树中,必存在一棵其带权路径长度取最小值的树,称为最优树。

5.哈夫曼算法构造最优树:以二叉树为例:

(1)根据给定的n个权值{w1, w2, ... , wn}构造n棵二叉树的集合F = {T1, T2, ... ,Tn},其中每棵二叉树中均只含一个带权值为wi的根结点,其左、右子树为空树;

(2)在F中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;

(3)从F中删除这两棵树,同时加入刚生成的新树;

(4)重复(2)(3),直至F中只含一棵树为止。

例如:已知权值 W= {5, 6, 2, 9, 7}

分析:

答案:

6.前缀编码:指的是,任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。利用赫夫曼树可以构造一种不等长的二进制编码,并且构造所得的赫夫曼编码是一种最优前缀编码,即使得所传电文的总长度最短。

例如:数据传送中的二进制编码,要传送数据state、seat、act、tea、cat、set、a、eat,如何使传送的长度最短?

答:首先规定二叉树的构造为左走0,右走1。为了保证长度最短,先看字符出现的次数,然后将出现次数当作权(a出现7次,c出现2次,e出现5次,s出现3次,t出现8次)。根据上述构造哈夫曼树可以得到各字母的哈夫曼编码:a——10,c——000,e——01,s——001,t——11,所以state的编码为00111101101,该构造满足哈夫曼编码的最短最优性质:

①若两字母不同,则对应的树叶不同,因此前缀码(任一字符的编码都不是另一个字符编码)不同,一个路径不可能是其它路径的一部分,所以字母之间可以完全区别。

②将所有字符变成二进制的哈夫曼编码,使带权路径长度最短。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }
span.s1 { color: #ff0000 }

原文地址:https://www.cnblogs.com/hou36/p/9907650.html

时间: 2024-08-01 18:03:37

数据结构——第二章树和森林:04哈夫曼树与哈夫曼编码的相关文章

数据结构第二章小结

第二章主要学习的是线性表,其中包含了顺序表以及链表,顺序表有两种结构体定义,一种是指针,再申请相应数组空间,一种是直接定义数组,前者数组为堆空间,后者则为栈空间,如果数组长度过大,得考虑空间是否充足问题,因而前者适用性更好: 链表主要为单链表,循环链表,双向链表:主要涉及到删除.查找.插入等操作,在学习链表过程中,主要问题是没能充分理解语句的意思,在插入语句中,类似p=s(p为辅助指针.s为指向新结点的指针)总是理解为这一步就插入成功了,插入应该是通过辅助指针来改变所指向的结点的数据域,这样才是

数据结构第二章实验

1)使用Debug,用E命令和A命令以两种方式将指令写入内存 机器码        汇编指令 b8 20 4e    mov ax,4e20h 05 16 14    add ax,1416h bb 00 20    mov bx,2000h 01 d8         add  ax,bx 89 c3         mov bx,ax 01 d8         add  ax,bx b8 1a 00    mov ax,001ah bb 26 00    mov bx,0026h 00 d

数据结构第二章总结

    顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,顺序表在使用前必须指定其长度,一旦分配内存,则在使用中不可以动态的更改.所以,其优点是访问数据是比较方便,可以随即访问表中的任何一个数据,缺点是定义的长度不可更改造成存储空间的浪费.      链表是通过指针来描述元素关系的一种数据结构,可以是物理地址不连续的物理空间.其优点是:对于数组,可以动态的改变数据的长度,分配物理空间:缺点是不能随即访问链表元素,必须从表头开始,一步一步搜索元素.      建议:如果一个数组在使用中,查询

数据结构第二章

如果存在正常数c和n0使得当N>=n0时,T(N)<=c*f(N),则记为T(N) = O(f(N)).   小于等于 读作:大O 如果存在正常数c 和n0 使得当N>=n0,T(N) >= c*f(N),则记为T(N) = Ω((f(N))  大于等于 读作:omega T(N) = Θ(h(N)) 当且仅当T(N)= O(h(N))且T(N) = Ω(h(N)) 等于 读作:theta 如果T(N)=O(p(N))且T(N) != Θ(h(N)) ,则T(N) = o(p(N)

【数据结构】第二章小结

ps:第一次用博客园写,记录第一次 一.数据结构第二章主要为:顺序表和链表的构造及其增删查改的一些基本操作,以及粗略计算它们的时间or空间的复杂度. 1.顺序表: (1)  特点:逻辑结构上相邻,物理存储上也是相邻的,属于随机存储: (2)  优点:便于使用下标进行查找,例如:查找某数组的第6项的数据是几: 存储密度为1: (3)    缺点:由于其物理存储相邻,故无法将空间中零零散散的碎片空间利用起来: 2.链表: (1)   特点:逻辑结构上相邻,物理存储上不一定相邻的,属于顺序存储: 单链

第二章学习小结

数据结构第二章的学习结束了,了解了顺序表,单链表的建立,插入,删除,查找的算法,以及对它们时间复杂度,空间复杂度的分析.学会区分头指针,头结点和首元结点. 前插法,后插法创建单链表,相比之下,我觉得后插法比较好理解.双向链表就是那个表示被处理结点的前驱的后继(p->prior->next),结点的后继的前驱(p->next->prior)要区分开. 作业,说实话,一开始的时候,我真的很懵,书上的算法描述,我可以看的很明白,同时也感到很奇怪,甚至还一度认为那是可以敲上电脑进行编译运行

5.5树和森林

5.5.1树的存储结构 树的存储结构通常采用如下三种表示方式. 1.双亲表示法 这种存储结构求指定结点的双亲(或祖先包括根)都是十分方便的. 但是在这种存储表示法中,求指定结点的孩子或其他后代则可能需要遍历整个结构. 2.孩子链表法 与双亲表示法相反,孩子链表表示法便于那些涉及孩子结点的操作的实现,而不适用操作Parent(T,x). 3.孩子兄弟表示法 这种存储结构的最大优点是,它和二叉树的二叉链表表示完全一样,因此可利用二叉树的各种算法来实现对树的操作. 5.5.2树.森林与二叉树的转换 树

数据结构——第三章树和二叉树:03树和森林

1.树的三种存储结构: (1)双亲表示法: #define MAX_TREE_SIZE 100 结点结构: typedef struct PTNode { Elem data; int parent; //双亲位置域 } PTNode; (2)孩子双亲链表表示法: typedef struct PTNode { Elem data; int parent; //双亲位置域 struct CTNode* nextchild; } *ChildPtr; (3)树的二叉链表(孩子-兄弟)存储表示法:

javascript实现数据结构: 树和森林

树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个结点中附加一个指示器(整数域) ,用以指示双亲结点的位置(下标值) . 图所示是一棵树及其双亲表示的存储结构.这种存储结构利用了任一结点的父结点唯一的性质.可以方便地直接找到任一结点的父结点,但求结点的子结点时需要扫描整个数组. 代码实现: 1 // 1.双亲表示法 2 // 优点:parent(t