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

C++ 实现哈夫曼树

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

30020

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

哈夫曼树 “最优”的二叉树   我们考虑这样一个要求:把成绩从百分制转为五级制。...我们称这样树为最优二叉树,或者哈夫曼树。   那么我们的问题就转变为:给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,......,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算 法,一般还要求以Ti的权值Wi的升序排列。)

    1.9K90

    哈夫曼树(Java实现)

    1、什么是哈夫曼树?...②、哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近 2、哈夫曼树的几个重要概念 1)路径和路径长度:在一颗树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。...WPL最小的就是哈夫曼树。...3、哈夫曼树创建思路 构成哈夫曼树的步骤: 1)从小到大进行排序,将每一个数据,每个数据都是一个结点,每个结点可以看成是一颗最简单的二叉树 2)取出根节点权值最小的两颗二叉树 3)组成一颗新的二叉树...比如上面的哈夫曼树也可以为: 4、哈夫曼树的代码实现 Node类: package com.Tree.HuffmanTree; //为了让Node对象持续排序Collections集合排序,让Node

    55420

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

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

    47410

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

    哈夫曼树         哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树。哈夫曼树常常用于数据压缩,其压缩效率比较高。...哈夫曼树的构建过程可以用贪心算法实现,构建出的哈夫曼树可以保证带权路径长度最短。...该方法的核心思想是,将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,以达到压缩数据的目的。 哈夫曼编码的实现过程可以分为两个阶段: (1)建立哈夫曼树。...哈夫曼编码的编码和解码过程都可以通过哈夫曼树实现,因此哈夫曼编码具有很好的可逆性。...代码实现哈夫曼树 封装哈夫曼树的节点 class HuffmanNode implements Comparable { public int value; // 节点的值

    44110

    【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; } //哈夫曼树构建完成

    14910

    哈夫曼树

    哈夫曼树 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

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

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

    1.3K40

    哈夫曼树 编码-哈夫曼树原理及Java编码实现

    :​​哈夫曼树和哈夫曼编码—​​   哈夫曼编码有两个特点:   带权路径长度WPL最短且唯一;【核心减少编码的操作】编码互不为前缀(一个编码不是另一个编码的开头)【可进行还原用途】。   ...哈夫曼编码是如何进行应用的呢,有什么具体的示例呢?   哈夫曼树是一颗二叉树哈夫曼树 编码,其是根据元素的权重来进行构成的一棵树,在树上的每个节点val都使用0或1来进行表示。   ...此时可以来说明前面一个问题:因为哈夫曼树是带权路径长度最短的树,权值较大的节点离根节点较近。...而带权路径长度是指:树中所有的叶子节点的权值乘上其到根节点的路径长度,这与最终的哈夫曼编码总长度成正比关系的。   ...哈夫曼编码细解& Java 实现​​   [3]. ​​视频:哈夫曼树和哈夫曼编码​​   [4]. ​​【JAVA】KMP算法保姆级教程​​ 本文共 1346 个字数,平均阅读时长 ≈ 4分钟

    47430

    C++ 漫谈哈夫曼树

    该树的带权路径长度是所有可能构建的二叉树中最小的。 则称符合上述条件的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。 构建哈夫曼树的目的是什么?...哈夫曼不等长编码的具体思路如下: 如现在要发送仅由A、B、C、D 4 个字符组成的报文信息 ,A字符在信息中占比为 50%,B的占比是 20%, C的占比是 15%, D的 占比是10%。...具体实现哈夫曼树算法如下: 把n个结点存储到优先队列中,则n个节点都有一个优先权Pi。这里是权值越小,优先权越高。 如果队列内的节点数>1,则: 从队列中移除两个最小的结点。...4.2 使用一维数组 除了上文的使用优先队列之外,还可以使用一维数组的存储方式实现。 在哈夫曼树中,叶子结点有 n个,非叶子结点有 n-1个,使用数组保存哈夫曼树上所的结点需要 2n-1个存储空间 。...总结 哈夫曼树是二叉树的应用之一,掌握哈夫曼树的建立和编码方法对解决实际问题有很大帮助。

    61320

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

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

    52130

    C 实现 哈夫曼编码

    哈夫曼编码是一种用于数据压缩的无损熵编码,根据压缩数据符号出现频率大小进行编码, 出现频率越高,编码后占bit 越少的变长编码。...(其他详细介绍见参考) 刚好这两天看到,大学时信息论学完后基本忘记,顺便复习以下,并尝试C代码实现。 如何编码 假设, 准备压缩的数据源, 评估得到各个符号出现的频率如下, 则其编码过程如下图 ?..., 并插入队列,队列中根据频率从小到大排序(方便下一步构建二叉树) static int8 build_char_freq_list(struct hfm_node *list) { uint32...队列中只剩下一项时, 二叉树建立完成, 该项为二插树根节点。...= NULL) _build_hfm_code_table(root); } 得到对应的编码映射, 便可以对应编码了 解码时, 也需要二叉树, 依据编码值, 寻得叶节点,得到对应的符号。

    83830
    领券