首页
学习
活动
专区
工具
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); } } 实现一个构造方法

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

编码-# 应用——编码

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

52430

编码

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

编码和字典

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

26110

学习笔记-构建

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

75740

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

60530

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

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

26720

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带权路径长度是最小构建过程就是要保证带权路径长度最小。...总结 是二叉应用之一,掌握建立和编码方法对解决实际问题有很大帮助。

54220

编码-数据结构(C语言

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

43830

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

40720

带权 -- ,与它那张编码表

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

1K20

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

42110

编码-原理及Java编码实现

文章目录前言   所有博客文件目录索引:​​博客目录索引(持续更新)​​   源代码:​​Gitee—.java​​​、​​Github—.java​​   一、原理   对于构造以及权值计算原理知识点推荐看这个视频...:​​编码—​​   编码有两个特点:   带权路径长度WPL最短且唯一;【核心减少编码操作】编码互不为前缀(一个编码不是另一个编码开头)【可进行还原用途】。   ...编码是如何进行应用呢,有什么具体示例呢?   是一颗二叉 编码,其是根据元素权重来进行构成一棵,在树上每个节点val都使用0或1来进行表示。   ...问题来了为什么要构成构造成一个?尤其是为什么要根据权重来进行排列分布呢?   ...二、编码(Java题解)   编码思路过程: encode编码:构造 -> 获取字符及路径map -> 根据map去构建指定编码 1、构造: 准备条件:

42430

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.4K10

(Huffman Code)

定义 给定n个权值作为n个叶子结点,构造一棵二叉,若该带权路径长度达到最小,则称之为最优二叉,也就是。... 从权重最小开始构建树叶子节点,即a与n 构建A与N 同样再构建权重排序后最小叶子节点,即u与m 构建U与M 同理...最后,通过一层层子树堆叠,就变成了以下样子,而这就是最终Huffman 最优二叉 最终在左右子树中,加入0与1编码,而对应编码也就是Huffman...部分编码如下: 字符 A H L M 编码 0000 11 011 0011 由于所有的字符都在Huffman叶子节点上,所以编码与解码不会有冲突。...通过这棵编码,就可以对文件进行编解码,来压缩与解压文件了。

65520
领券