首页
学习
活动
专区
工具
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(){ //构造

27220

编码-# 应用——编码

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

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

编码

在一般数据结构书中,那章后面,著者一般都会介绍一下(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.8K90

(郝)及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; } } 拿上面这些数据来说明构造整个过程

42410

编码和字典

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

27310

(Java实现

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

48420

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.初始化所有节点项目为

32520

可以证明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数组来存放整个

60930

学习笔记-构建

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

79440

编码-原理及Java编码实现

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

43030

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个存储空间 。...总结 是二叉应用之一,掌握建立和编码方法对解决实际问题有很大帮助。

54720

C 实现 编码

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

79730

编码-数据结构(C语言

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

44730

(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二进制

41020
领券