赫夫曼树编码的算法及应用习题--数据结构

 

赫夫曼树编码的算法及应用习题

1.构造赫夫曼树的方法

1.根据给定的n个权值{w1,w2,---wn},构成n棵二叉树的集合F={T1,T2...,Tn},其中每棵二叉树中只有一个带权为Wi的根结点,其左右子树为空。

2.在F中选取两棵根结点的权值最小的树作为左右子树(一般小左大右)构造新的二叉树,且置新的二叉树的权值为两棵子树权值之和。

3.在F中删除这两个树,同时将新树加入到F中。

4.重复2、3两步,直到F中只有一棵树。

具体实例:

 

 

2.赫夫曼编码:

编码:从叶子结点到根结点的最短路径

译码:从根结点到叶子结点的最短路径

具体算法实现:

 /*求赫夫曼编码。实现算法6.12的程序 */typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree; /* 动态分配数组存储赫夫曼树 */typedef char **HuffmanCode; /* 动态分配数组存储赫夫曼编码表 */#include<string.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* UINT_MAX ,C中常量INT_MAX和INT_MIN分别表示最大、最小整数*/#include<stdio.h> int min1(HuffmanTree t,int i){ /* 函数void select()调用 求赫夫曼树中结点权值最小的的是哪个二叉树*/int j,flag;              //flag是用来标记第几个结点unsigned int k=UINT_MAX; /* 取k为不小于可能的值,无符号整型最大值 */for(j=1;j<=i;j++)if(t[j].weight<k&&t[j].parent==0)k=t[j].weight,flag=j;t[flag].parent=1;return flag;}void select(HuffmanTree t,int i,int *s1,int *s2){ /* s1为最小的两个值中序号小的那个,把它作为左子树 */int j;*s1=min1(t,i);*s2=min1(t,i);if(*s1>*s2){j=*s1;*s1=*s2;*s2=j;}}void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n) /* 算法6.12 */{ /* w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC */int m,i,s1,s2,start;unsigned c,f;HuffmanTree p;char *cd;                        //用来存放字符if(n<=1)return;m=2*n-1;*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /* 0号单元未用,开辟赫夫曼树的存储空间 */for(p=*HT+1,i=1;i<=n;++i,++p,++w){//构建n棵带权值的叶子结点(*p).weight=*w;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;}for(;i<=m;++i,++p){//继续使接下来要构造的赫夫曼树每个非叶子结点为空(*p).parent=0; }for(i=n+1;i<=m;++i) /* 建赫夫曼树 */{ /* 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2 */select(*HT,i-1,&s1,&s2);(*HT)[s1].parent=(*HT)[s2].parent=i;   //把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*));/* 分配n个字符编码的头指针向量([0]不用) */cd=(char*)malloc(n*sizeof(char)); /* 分配求编码的工作空间 */cd[n-1]='\0'; /* 编码结束符 */for(i=1;i<=n;i++){ /* 逐个字符求赫夫曼编码 */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';elsecd[--start]='1';(*HC)[i]=(char*)malloc((n-start)*sizeof(char));/* 为第i个字符编码分配空间 */strcpy((*HC)[i],&cd[start]); /* 从cd复制编码(串)到HC */}free(cd); /* 释放工作空间 */}void main(){HuffmanTree HT;HuffmanCode HC;int *w,n,i;printf("请输入权值的个数(>1):");scanf("%d",&n);w=(int*)malloc(n*sizeof(int));printf("请依次输入%d个权值(整型):\n",n);for(i=0;i<=n-1;i++)scanf("%d",w+i);                    //w是个指针为地址,不加&符号printf("赫夫曼编码为:\n");HuffmanCoding(&HT,&HC,w,n);for(i=1;i<=n;i++){printf("%d\t",i);puts(HC[i]);}}

欢迎关注,更多博文请浏览本人其他文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴咏时:未来基础学科发展的“铁三角”

来源&#xff1a; 节选自《物理》2022年第5期《圆桌论坛&#xff1a;对21世纪物理学的愿景展望》。2021年9月&#xff0c;在清华大学举行“庆祝杨振宁先生百年华诞思想研讨会”圆桌论坛环节上&#xff0c;美国犹他大学教授吴咏时对今后基础物理学做了一番展望。他指出了基础物理…

树的叶子结点与完全二叉树结点计算方法

一&#xff1a;完全二叉树中结点问题 分析&#xff1a; 设叶子节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2 侧有 n0n1n2n (1) 对于二叉树有&#xff1a; n0n21 (2) 由(1)(2) > n0(n1-n1)/2 (3) 由完全二叉树…

图的知识点总结-数据结构

一&#xff1a;图的基本概念和术语 1.图之间的关系可以是任意的&#xff0c;任意两个数据元素之间都可能相关。 2.顶点&#xff1a;数据元素。 3.边or弧&#xff1a;从一个顶点到另一个顶点的路径。<V, W>表示弧&#xff0c;&#xff08;V,W&#xff09;表示边&#x…

当物理学遇到机器学习:基于物理知识的机器学习综述

来源&#xff1a;集智俱乐部作者&#xff1a;潘佳栋 审校&#xff1a;梁金编辑&#xff1a;邓一雪摘要物理信息机器学习&#xff08;Physics-informed machine learning&#xff0c;PIML&#xff09;&#xff0c;指的是将物理学的先验知识&#xff08;历史上自然现象和人类行为…

图的遍历——深度优先搜索+广度优先搜索

一&#xff1a;图的遍历——深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容&#xff0c;更加详细的代码实现及算法分析在此给出。 深度优先搜索&#xff08;DFS&#xff09;类似树的先序遍历。 假设初始状态是图中所有顶点未曾被访问&#xff0c;则深度优先搜索…

RISC-V何以成功?

来源&#xff1a;AI前线作者&#xff1a;BRIAN BAILEY译者&#xff1a;王强策划&#xff1a;刘燕RISC-V 处理器架构的诞生毫无疑问让很多人都为之兴奋不已。然而&#xff0c;尽管许多人都说 RISC-V 预示着我们将迎来更广泛的开源硬件运动&#xff0c;但这种架构究竟为什么取得成…

最小生成树——普里姆算法和克鲁斯卡尔算法

最小生成树 用来解决工程中的代价问题。 一&#xff1a;普里姆算法 具体代码用C语言实现如下&#xff1a; typedef int VRType;typedef char InfoType;#define MAX_NAME 3 /* 顶点字符串的最大长度1 */#define MAX_INFO 20 /* 相关信息字符串的最大长度1 */typedef char Vert…

大雅之美:十位大数学家心中最美的公式

来源&#xff1a;本文译自 http://www.concinnitasproject.org/portfolio/&#xff0c;中译文曾发表于 《中国数学会通讯》2017 年第 1 期。译者&#xff1a;刘云朋&#xff0c;天津大学理学院校译&#xff1a;林开亮大雅之美&#xff1a;十位大数学家心中最美的公式牛顿法Ste…

TabError的解决方法

问题&#xff1a;Python文件运行时报TabError: inconsistent use of tabs and spaces in indentation 原因&#xff1a;说明Python文件中混有Tab和Space用作格式缩进。这通常是使用外部编辑器编辑Python文件时&#xff0c;自动采用Tab进行格式缩进。 解决&#xff1a;将Tab转…

《Nature》:给老年小鼠注射年轻小鼠的脑脊液可以改善记忆力!

来源&#xff1a;生物通一个国际研究团队发现&#xff0c;向老年小鼠注射年轻小鼠的脑脊液可以改善记忆。在发表在《自然》(Nature)杂志上的论文中&#xff0c;该小组描述了一种技术&#xff0c;可以从年轻小鼠体内取出少量脑脊液&#xff0c;并将其注射到年老小鼠的大脑中&…

HashSet存储自定义对象保证元素唯一性图解原理及代码优化

HashSet存储自定义对象保证元素唯一性图解原理及代码优化 1.原理&#xff1a; * 1.HashSet原理 * 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数 * 当Hash…

马斯克:推特发帖机器人太多,现在起搁置440亿美元收购

来源&#xff1a;智能研究院前言直播「尽职调查」&#xff0c;压价还是打退堂鼓&#xff1f;「因为现在要计算推特上虚假账号的数量是否占 5% 以下&#xff0c;所以推特的收购暂时被搁置了&#xff0c;」5 月 13 日晚&#xff0c;全球首富伊隆 马斯克突然发推说道。马斯克与推…

Web 3.0?高成本版的P2P而已

来源&#xff1a;AI前线作者&#xff1a;Marcel Waldvogel译者&#xff1a;核子可乐策划&#xff1a;钰莹最近&#xff0c;Web 3.0 火的不行&#xff0c;有人认为&#xff0c;它将是互联网的未来式&#xff0c; Web 3.0 代表着对互联网的根本性改造&#xff0c;一个新的 Web 世…

JAVA面试题:HashMap和Hashtable的区别

HashMap和Hashtable的区别 1.共同点:都是双列集合,底层都是哈希算法 2.区别: * 1.HashMap是线程不安全的&#xff0c;效率高&#xff0c;JDK1.2版本 * Hashtable是线程安全的&#xff0c;效率低&#xff0c;JDK1.0版本 * 2.HashMap可以存储null键和null值 * Hashtable不可以存…

CICC城市大脑术语规范术语与定义征集

2022年2月&#xff0c;《城市大脑系列建设标准规范》项目由中国指挥与控制学会&#xff08;CICC&#xff09;正式启动&#xff0c;4月14日通过立项评审&#xff0c;根据城市大脑标准的前期工作和中国指挥与控制学会《城市大脑系列建设标准规范》立项会的专家意见&#xff0c;形…

最短路径——迪杰斯特拉算法——图的数据结构

最短路径是在工程上经常用到的概念&#xff0c;在这里给出了从单源点到任意顶点的迪杰斯特拉算法。 先来看看基本概念&#xff1a; 用代码C语言实现如下&#xff1a; #include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<…

盖亚假说:地球是一个生命体吗?

来源&#xff1a;微信公众号“集智俱乐部”原文&#xff1a;Is the Earth an organism?https://aeon.co/essays/the-gaia-hypothesis-reimagined-by-one-of-its-key-sceptics。撰文&#xff1a;W Ford Doolittle翻译&#xff1a;Leo审校&#xff1a;赵雨亭在漫长的地球生物的演…

拓扑排序和关键路径

一&#xff1a;拓扑排序 前面讲过拓扑排序只是简单的描述&#xff0c;下面具体的实现。 用顶点表示活动&#xff0c;用弧表示活动间的优先关系的有向图为AOV网。 AOV网中没有环&#xff0c;检测的办法是进行拓扑排序。 步骤&#xff1a; (1)在有向图中选一个没有前驱的顶点…

Science:睡眠医学的突破,大脑会在梦境中巩固积极情绪

来源&#xff1a;学术头条处理情绪&#xff0c;特别是区分危险和安全&#xff0c;对动物的生存至关重要。在人类中&#xff0c;过度的负面情绪&#xff0c;如恐惧反应和焦虑状态&#xff0c;会导致创伤后应激障碍&#xff08;PTSD&#xff09;等病理状态。在欧洲&#xff0c;就…

RISC-V可能不会威胁英特尔,但Arm需警惕

来源&#xff1a;EETOP近期&#xff0c;国外媒体The Register对RISC-V International 首席执行官Calista Redmond 进行了一次采访&#xff0c;在访谈中&#xff0c;Calista Redmond谈及英特尔不太担心自己的x86业务&#xff0c;因此成为了RISC-V ISA联盟的白金会员。Redmond还谈…