首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

构造哈夫曼树的算法_哈夫曼树的应用数据结构

大家好,又见面了,我是你们的朋友全栈君。 一、什么是赫夫曼树 给定n个权值作为n个叶子节点,构造一课二叉树,若该树的带权路径长度和(wpl)达到最小,称这样的二叉树为最优二叉树,也就是赫夫曼树。...而该树与上图有相同的叶子节点,但是wpl却是13+16+21+9=59,这是拥有这几个相同叶子节点的树里面wpl最小的,所以这颗树就是一颗赫夫曼树。...我们不难看出,赫夫曼树最大的特点:权越大的节点越靠近根节点 二、如何构建赫夫曼树 举个例子,我们要将{6,1,3,7,13,8,29}这一串数列组建为赫夫曼树 首先,我们对齐从小到大排序,得到{1,3,6,7,8,13,29...首先先写一个节点类: /** * @Author:CreateSequence * @Date:2020-07-17 17:31 * @Description:赫夫曼树使用的节点 */ public...*/ @Override public int compareTo(Node o) { return -(this.val - o.val); } } 实现一个构造赫夫曼树的方法

42610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    哈夫曼树 编码-# 哈夫曼树的应用——哈夫曼编码

    哈夫曼树 “最优”的二叉树   我们考虑这样一个要求:把成绩从百分制转为五级制。...我们称这样树为最优二叉树,或者哈夫曼树。   那么我们的问题就转变为:给N个节点,如何构造这样一棵哈夫曼树。   ...哈夫曼树的构造   我们观察哈夫曼树的形态哈夫曼树 编码,很容易看出,越大的数字应该放在越靠近根节点的位置,这样路径长度比较短:   构造这种树的算法是一种很好理解的贪心算法: 1....`   假设有A B C D E F G这几个节点,他们的权分别是:1 1 4 5 8 9 11,我们看如何构造一棵哈夫曼树:   整个过程还是很容易理解的,每一回合都取出两个最小的节点,构建一棵新树并放入待选集合...实际上并不矛盾,因为这两棵树有相同的带权路径长度,所以他们都是最优的,你可以自己计算一下。   哈夫曼树的应用——哈夫曼编码   哈夫曼树最经典的应用是哈夫曼编码。

    60630

    哈夫曼树和哈夫曼编码

    在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。...首先介绍什么是哈夫曼树。 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。   ...哈夫曼编码步骤: 一、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,......然后,我们利用Huffman算法构造出的各字符的二进制编码为(节点的左子树编码为0,右子树编码为1): A: 1011110 B: 1011111 C: 101110 D: 10110

    1.9K90

    哈夫曼树、哈夫曼编码和字典树

    哈夫曼树         哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树。哈夫曼树常常用于数据压缩,其压缩效率比较高。...哈夫曼树的构建过程主要有两个步骤:(1)选取权值最小的两个节点构造新的二叉树,其权值为两个节点权值之和;(2)将新生成的节点加入到原来的节点集合中,重复执行步骤一和步骤二,直到只剩下一个节点,这个节点就是哈夫曼树的根节点...哈夫曼树的构建过程可以用贪心算法实现,构建出的哈夫曼树可以保证带权路径长度最短。...哈夫曼编码的编码和解码过程都可以通过哈夫曼树实现,因此哈夫曼编码具有很好的可逆性。...所以我们就可以使用哈夫曼编码,也就是最优无前缀编码。 通过这个哈夫曼树得到A:0 B:10 C:110 D:111,原文也就转换成了01001101101110,len= 14。

    44110

    哈夫曼树

    哈夫曼树 1.相关概念 2.哈夫曼树的特点 为了让带权路径长度计算值最小 3,哈夫曼树的基本思想 4.哈夫曼树的构造过程 5.哈夫曼树的存储结构 6....HtnNode { int weight;// 权值 int lchild, rchild, parent; }*Node; //存放哈夫曼树的静态链表的构建和用户输入权值 void creatNode...<< endl; for (int i = 0; i < 4; i++) cin >> w[i]; } //寻找parent为-1的最小的和最次小的节点 //哈夫曼静态链表的树的数组 当前进行构建的节点下标...权值最小的节点下标 权值最次小的节点下标 void select(HtnNode*& node,int k,int& i1,int& i2) { int min=0; //找到哈夫曼树中权值最小和最次小的节点的静态链表数组下标...<< endl; } //哈夫曼树的构建:静态链表数组, 存放权值的数组,节点的个数 void HuffMan(HtnNode*& node, int w[], int n) { //1.初始化所有节点的项目为

    35920

    哈夫曼树

    可以证明哈夫曼树的WPL是最小的。         构造哈夫曼树的算法如下:         1)对给定的n个权值{W1,W2,W3,...,Wi,......例如,对于4个权值为1、3、5、7的节点构造一棵哈夫曼树,其构造过程如下图所示:  可以计算得到该哈夫曼树的路径长度WPL=(1+3)*3+2*5+1*7=26。        ...对于哈夫曼树,有一个很重要的定理:对于具有n个叶子节点的哈夫曼树,共有2*n-1个节点。        ...这里给出构造哈夫曼树的算法(算法实现使用C语言而不是java)。出于简单性考虑,构造的哈夫曼树不是采用链式存储,而是以数组方式存储,其中使用数组位置索引标识节点的链接。...}HTNode;   构造哈夫曼树的算法的实现原理如下:对于n个叶子节点,我们根据上面的定理构造出大小为2*n-1的数组来存放整个哈夫曼树。

    66530

    【C++实验】哈夫曼树与哈夫曼编码实验

    对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的u信息收发编写一个哈夫曼码的编/译码系统。...(2)编码:利用已建好的哈夫曼树,对电文进行编码。 (3)打印编码规则:即字符与编码的一一对应关系。 (4)打印显示电文以及该电文对应的哈夫曼编码。...(5)接收原始数据(哈夫曼编码):从终端输入一串哈二进制哈夫曼编码(由 0和1构成)。 (6)译码:利用已建好的哈夫曼树对该二进制编码进行译码。 (7)打印译码内容:将译码结果显示在终端上。...for(int i=0;i<number;i++) { hfm[i].weight=temp[i][0]; code[i]=new HuffCode(number); } //开始构建哈夫曼树...].lchild=x1; hfm[number+i].rchild=x2; hfm[number+i].weight=hfm[x1].weight+hfm[x2].weight; } //哈夫曼树构建完成

    15010

    哈夫曼树学习笔记-构建哈夫曼树

    什么是哈夫曼树? 哈夫曼树(Huffman Tree)是一种用于数据压缩的树形数据结构,由David A. Huffman在1952年发明。...在构建过程中,需要保证所有节点的左子树的权值总和小于右子树的权值总和。 最终生成的哈夫曼树是一棵带权路径长度最小的二叉树,可以根据哈夫曼树来生成每个字符的编码,从而实现数据压缩。...哈夫曼树构建过程 从数组中选择权值最小的两个结点,作为子结点,生成一棵树。 他们父结点的权值是他们两结点的权值之和。 然后再以此类推,重复两步,当数组中只剩下一棵树的时候,就已经构建好哈夫曼树了。...构建哈夫曼树代码(C++) 下面是使用c++实现的构建哈夫曼树的代码 //哈夫曼树构建 BTreeNode *CreateHuffman(ElemType a[],int n) { BTreeNode...下面是哈夫曼树编码的实现算法: 通过递归调用实现哈夫曼编码,函数首先判断当前结点是否由孩子结点,如果没有孩子结点,就直接遍历静态数组,输出,此时数组就是当前结点的哈夫曼编码。

    1.3K40

    C++ 漫谈哈夫曼树

    前言 什么是哈夫曼树? 把权值不同的n个结点构造成一棵二叉树,如果此树满足以下几个条件: 此 n 个结点为二叉树的叶结点 。 权值较大的结点离根结点较近,权值较小的结点离根结点较远。...该树的带权路径长度是所有可能构建的二叉树中最小的。 则称符合上述条件的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。 构建哈夫曼树的目的是什么?...哈夫曼不等长编码的具体思路如下: 如现在要发送仅由A、B、C、D 4 个字符组成的报文信息 ,A字符在信息中占比为 50%,B的占比是 20%, C的占比是 15%, D的 占比是10%。...如有权值为{3,4,9,15}的 4 个结点,则可构造出不同的二叉树,其带权路径长度也会不同。如下 3 种二叉树中,B的树带权路径长度是最小的。 哈夫曼树的构建过程就是要保证树的带权路径长度最小。...总结 哈夫曼树是二叉树的应用之一,掌握哈夫曼树的建立和编码方法对解决实际问题有很大帮助。

    61320

    C++ 实现哈夫曼树

    离散数学课本最后一章有讲到这一种“近大远小”的数据结构哈夫曼树,这种数据结构是实现哈夫曼编码的基础,书上讲得比较抽象于是尝试用C++简单的实现一下。...0x00 前提 在这看到了一个比较通俗易懂的解释: https://baijiahao.baidu.com/s?...id=1663514710675419737&wfr=spider&for=pc 主要就是通过一个优先队列+树的结构来实现的,之前没用过STL里面的优先队列,因为需要将元素设置为自定义类型的指针,所以需要写一个比较函数来实现升序排列...nodeQueue.push(tmp); //printf("%d\n",tmp->weight); } } Node *huffmanTree(){ //构造哈夫曼树...len:MAXINPUT; for(int i=0;i<len;i++){ scanf("%d",&input[i]); //读取叶子节点的权 } initNodeQueue

    30120

    哈夫曼树 编码-数据结构(C语言)

    导语   本文使用C语言。...对某一输入的字符串,对其构造哈夫曼()树,并由此树的到字符串中每一个字符的哈夫曼编码   本文哈夫曼树和哈夫曼编码采用顺序存储结构实现   哈夫曼树   给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小...,称这样的二叉树为最优二叉树,也称为哈夫曼树( Tree)。...哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。   哈夫曼树,图片来源百度百科哈夫曼编码   在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。...通过该哈夫曼树,我们可以得到每个字符的哈夫曼编码 A=10,B=001,C=01,D=11,E=000   容易证明,每个字符的编码都是前缀编码   C语言实现哈夫曼编码   网上许多大佬实现哈夫曼树的结点都是采用链式存储结构

    52130

    带权树 -- 哈夫曼树,与它的那张哈夫曼编码表

    这里要强调一下,哈夫曼树不是专门的搜索二叉树。你可以把哈夫曼树和密码学搭上边,因为你没有那个哈夫曼表是无法对一个被哈夫曼树加密(压缩)的文件进行解码的。...哈夫曼编码 这里要提一下哈夫曼编码表: 哈夫曼树当然是一种树,不过这种树有些特殊之处。哈夫曼编码呢,是根据哈夫曼树规则生成的编码!...提供一个字符,根据哈夫曼编码规则,你会得到一个哈夫曼编码,不过你提供的字符必须在哈夫曼编码表中有对应的编码才行。...哈夫曼树构造步骤 根据给定的n个权值{W1,W2,…,Wn}构成n棵二叉的集合F={T1,T2,…Tn},其中每棵二叉树Ti只有一个带权为Wi的根结点,其左右子树均为空。...在F中选取2棵根结点最小的树 作为左右子树 构造一棵新的二叉树,且新的二叉树的根结点左右子树根结点权值之和。 在F中删除这2棵子树,同时将新得到的二叉树加入F中。

    1.1K20

    哈夫曼树(Java)

    哈夫曼树:其实就是一个压缩算法,类似于最优解 例子: 有一次考试成绩分为4个等级:A、B、C、D,班级有100人,其中获得A的人数为20人,获得B为40人,获得C为10人,获得D为30人。...一共为: 40 * 1 + 30 * 2 + 20 * 3 + 10 *4 = 200 结果很明显:第二种判断的次数少 哈夫曼树就是基于这个思想而来的,真正存放值的都为叶子节点(重要),把出现次数几率越高的越靠近根节点...,哈夫曼树主要是构建过程,他构建效率是比较低的。...,重新按权重排序 4.循环第2步 当数组只剩一个元素,将它作为根节点 作用:二进制表示每个节点的值,所占空间最少 手写哈夫曼树: /** * 哈夫曼 */ static...10) a(20) 这样对于一个含有20个a,40个b,10个c,30个d的字符串,所用的二进制bit最少 如果左树为0,右数为1 其中 a的二进制表示为:111 b的二进制:0 d的二进制

    43420

    哈夫曼树(赫夫曼树、最优树)详解

    哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。...)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。...图 2 哈夫曼树的构建过程 图 2 中,(A)给定了四个结点a,b,c,d,权值分别为7,5,2,4;第一步如(B)所示,找出现有权值中最小的两个,2 和 4 ,相应的结点 c 和 d 构建一个新的二叉树...直到(D)中,所有的结点构建成了一个全新的二叉树,这就是哈夫曼树。 哈弗曼树中结点结构 构建哈夫曼树时,首先需要确定树中结点的构成。...图 4 两种哈夫曼树 之所以使用此程序构建的哈夫曼树,是图 4(A) 而不是 4(B),是因为在构建哈夫曼树时,结点 2 和结点 5 构建的新的结点 7 存储在动态树组中位置,比权重值为 7 节点的存储位置还靠后

    99310

    哈夫曼树(郝夫曼树)及java实现

    哈夫曼树是美国数学家Huffman发现的一种数据结构,该数据结构用在哈夫曼编码中,哈夫曼编码是一种压缩算法,本文主要针对的是哈夫曼树这种数据结构,哈夫曼编码将在下篇博文中涉及。...在正式开始了解哈夫曼树之前有几个概念需要了解: 1、路径长度:从树种一个节点到另一个节点间的分支构成两个节点之间的路径,路径上的分支数目就是路径长度,所以路径长度是针对两个节点间距离的一种描述,如下图所示...,ln},该树的带权路径长度WPL则为根节点到其他所有节点带权路径长度之和,即WPL=∑ wk*lk,k从1到n 3、WPL最小时对应的二叉树被称为哈夫曼树,也叫做最优二叉树。...q.add(n); } //最后一个节点就是根节点 Node root = q.poll(); //打印哈夫曼树...Override public int compareTo(Node node){ return this.weight - node.weight; } } 拿上面这些数据来说明构造哈夫曼树的整个过程

    47410

    c++ 哈夫曼树简便构造(数据结构作业篇)

    // 用最小栈方式构建哈弗曼树 // 定义一个哈夫曼树的节点 struct MinHeapNode { // One of the input characters char data; // Frequency...{ bool operator()(MinHeapNode* l, MinHeapNode* r)     { return (l->freq > r->freq);     } }; // 递归的方式打印哈夫曼编码从树的根部...freq);         top->left = left;         top->right = right;         minHeap.push(top);     } // 输出哈夫曼编码通过已创建的哈弗曼树...printCodes(minHeap.top(), ""); // 返回哈夫曼树的根 return minHeap.top(); } 以上程序中所用到的知识点如下: 头文件精简法 可以用一个文件包含...c++ 所有的头文件 # 用来精简头文件的结构 哈弗曼树的节点个数 # 建立叶节点个数为n,权值为weight的哈夫曼树共有 2n-1个节点 priority_queue 的用法 用法: priority_queue

    1.5K10
    领券