哈夫曼树

Java--哈夫曼树创建和遍历

时光总嘲笑我的痴心妄想 提交于 2019-12-09 21:49:30
哈夫曼树的创建和遍历 import java.util.*; public class huffman { public static void main(String[] args) { int []arr={13,7,8,3,29,6,1}; Node root=huff(arr); //前序遍历打印赫夫曼树 if(root!=null){ System.out.println("赫夫曼树前序遍历为:"); root.preOrder();} else{ System.out.println("赫夫曼树为空"); } } //创建赫夫曼树 public static Node huff(int []arr){ //创建Node类型的集合,便于存取节点 List<Node>nodes=new ArrayList<Node>(); for(int a:arr){ nodes.add(new Node(a));//注意:此处是把Node类型节点放入,所以构造新的对象 } while(nodes.size()>1){ //排序,小到大 Collections.sort(nodes);//对集合内部元素排序 //System.out.println(nodes); //(1)取两个节点最小的构建子树 Node left=nodes.get(0); Node right=nodes.get

【算法系列 四】 String

五迷三道 提交于 2019-12-06 21:42:47
1. 字符串循环左移( 九度OJ1362 ),要求时间复杂度O(N),空间复杂度O(1) 这是一道基本的题目,简单说来就是三次翻转 比如:abcdef 左移两位 cdefab 过程: ab 翻转 ba cdef 翻转 fedc 将上面两个翻转后的结果拼接 bafedc 再翻转cdefab得到结果 代码: import java.io.IOException; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { Scanner cin = new Scanner(System.in); int N; String str; while (cin.hasNext()) { str = cin.next(); N = cin.nextInt(); N = N % str.length(); String a = str.substring(0, N); String b = str.substring(N); StringBuffer abuffer = new StringBuffer(a); StringBuffer bbuffer = new StringBuffer(b); StringBuffer areverse =

哈弗曼树(最优二叉树)

自闭症网瘾萝莉.ら 提交于 2019-12-05 09:08:04
主要摘自https://www.cnblogs.com/skywang12345/p/3706821.html感谢大佬 https://www.cnblogs.com/kubixuesheng/p/4397798.html这位大佬举例很好 一、哈夫曼树(霍夫曼树) 注. 哈夫曼树也称最优二叉树。  叶子节点的权值 是对叶子节点赋予的一个有意义的数值量。  设二叉树具有 n 个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做 二叉树的带权路径长度。   给定一组具有确定权值的叶子结点,可以构造处不同的二叉树,将其中带权路径长度最小的二叉树称为 哈夫曼树 。、 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树 初始化 :由给定的 n 个权值 { ω 1 , ω 2 , ⋯ , ω n } {ω1,ω2,⋯,ωn}构造 n 棵只有一个根节点的二叉树,从而得到一个二叉树集合 F = { T 1 , T 2 , ⋯ , T n } F={T1,T2,⋯,Tn}。 选取与合并: 在 F F中选取根节点的权值最小的两颗二叉树分别作为左右子树构造一棵新的二叉树(一般情况下将 权值大的结点作为右子树 。),这棵新二叉树的根节点的权值为其左

哈夫曼树的构造

半腔热情 提交于 2019-12-05 07:40:20
学号 20182315 《数据结构与面向对象程序设计》实验构建哈夫曼树报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 邹家伟 学号:20182315 实验教师:王志强 实验日期:2019年11月15日 必修/选修: 必修 1.实验内容 (1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率 (2)构造哈夫曼树 (3)对英文文件进行编码,输出一个编码后的文件 (4)对编码文件进行解码,输出一个解码后的文件 2. 实验过程及结果 该实验可以粗略分为以下几个步骤: (1)文件读取:将文件中的字符读到Java代码里去,将编完码的数据存到文件中,再将解码文件存入文件。 这部分难度不大,有之前的基础,实现起来很容易。 (2)计算每个字符出现的频数:这部分难度也不大,使用二重循环,把握好循环跳出的条件即可。 (3)根据频数构造哈夫曼二叉树:这部分难度最大,困惑我时间最长。 起初我想用数组来构建二叉树,可是我发现无法区分存取取出节点,从而无法确定哪个结点为字母的频数。 后来我思考到用两个不一样的数组存放字母频数与取出的频数,再将其放入到第三个数组进行排序,但这样进行太过复杂,尤其在后期编码解码过程中,程序尤为复杂,得不偿失。 最后,通过网络搜索,我发现可以哈夫曼树的创建也可使用创建树的基本方法创建,即写出一个节点类,在节点类里存放字符信息

哈夫曼树的构建(C语言)

余生颓废 提交于 2019-12-05 06:45:00
哈夫曼树的构建(C语言) 算法思路 : 主要包括两部分算法,一个是 在数组中找到权值最小、且无父结点两个结点位置 ,因为只有无父结点才能继续组成树; ​ 另一个就是根据这两个结点来修改相关结点值。 结构定义和头文件 1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 #include <string.h> 5 ​ 6 #define OVERFLOW -1 7 ​ 8 typedef struct { 9 int weight;//结点权值 10 int lchild, rchild, parent;//结点左、右孩子、父结点 11 }HNode,*HTree; 在数组中找到目前权值最小的两个结点 由于哈夫曼树规定结点左子树权值小于右子树,所以我这里把权值较小的那个结点位置赋给p1 这部分我先找到前两个无父结点的结点位置赋给p1和p2,再继续遍历之后的与当前的p1和p2位置的结点权值比较 若结点有父结点,直接跳过 若结点无父结点,且权值小于p1,则将该位置赋给p1,令p2等于之前的p1 若结点无父结点,且权值大于p1、小于p2,则将该位置赋给p2 1 void selectMin(HTree HT,int length, int* p1, int* p2) {/

20182310 哈夫曼编码

喜夏-厌秋 提交于 2019-12-05 02:59:16
20182310 《数据结构与面向对象程序设计》实践作业——哈夫曼树的编码 课程:《数据结构与面向对象程序设计》 班级:1823 姓名:周烔 学号:20182310 实验老师:王志强 选修/必修:必修 1.任务详情: 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。 给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。 并完成对英文文件的编码和解码。 要求: (1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率 (2)构造哈夫曼树 (3)对英文文件进行编码,输出一个编码后的文件 (4)对编码文件进行解码,输出一个解码后的文件 (5)撰写博客记录实验的设计和实现过程,并将源代码传到码云 (6)把实验结果截图上传到云班课 2.分析和思路: 1.首先应该了解哈夫曼树的概念,哈夫曼(Haffman)树,也称最优二叉树,是指对于一组带有确定权值的叶结点、构造的具有最小带权路径长度的二叉树。 二叉树的路径长度是指由根结点到所有的叶结点的路径长度之和。 一棵二叉树要想它的带权路径长度最小,必须使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点。 2.哈夫曼算法大致如下: 3.接着了解哈夫曼编码:哈夫曼编码是一个通过哈夫曼树进行的一种编码

20182301 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼实验报告

末鹿安然 提交于 2019-12-05 02:57:16
20182301 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼实验报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 赵沛凝 学号:20182301 实验教师:王志强 实验日期:2019年11月18日 必修/选修: 必修 1.实验内容 设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。 给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。 并完成对英文文件的编码和解码。 要求: 准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率 构造哈夫曼树 对英文文件进行编码,输出一个编码后的文件 对编码文件进行解码,输出一个解码后的文件 撰写博客记录实验的设计和实现过程,并将源代码传到码云 把实验结果截图上传到云班课 2. 实验过程及结果 定义: 哈夫曼树(霍夫曼树)又称为最优树. 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长 结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

7-1 哈夫曼树

左心房为你撑大大i 提交于 2019-12-04 19:56:38
哈夫曼树,第一行输入一个数n,表示叶结点的个数。 需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出哈夫曼树的带权路径长度(WPL)。 输入格式: 第一行输入一个数n,第二行输入n个叶结点(叶结点权值不超过1000,2<=n<=1000)。 输出格式: 在一行中输出WPL值。 输入样例: 5 1 2 2 5 9 输出样例: 37 #include<iostream> #include<stdio.h> #include<string> #include<string.h> #include<cstring> #include<algorithm> #define MAX 0x3f3f3f3f using namespace std; typedef struct { int data; int weight; int parent; int lchild; int rchild; bool tag; int deep; }Huffnode,*HuffmanTree; HuffmanTree HT; int n; void Select(HuffmanTree &HT,int index, int &s1, int &s2) { int min1=MAX; int min2=MAX; for(int i=1;i<=index;++i) {

07_06.哈夫曼树

蹲街弑〆低调 提交于 2019-12-04 05:34:11
实数集w={2, 3, 7, 10, 4, 2, 5},构造一棵哈夫曼树 在(2)中,存在两个权值为4的树,可以选择其中任意一个与权值为3的树合并。不同选择会导致不同的哈夫曼树,但其外部路径的长度一定相等。 from trees.prioqueue import PrioQueue # 优先队列 (较小数优先) from trees.linktree import levelorder # 引入宽度优先遍历 class BinTNode: """二叉树结点""" def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right class HTNode(BinTNode): """哈夫曼树节点类""" def __le__(self, othernode): return self.data <= othernode.data class HuffmanPrioQ(PrioQueue): """哈夫曼优先队列""" def number(self): return len(self._elems) def HuffmanTree(weights): trees = HuffmanPrioQ() for w in weights: trees

程序员需要了解的硬核知识之压缩算法

﹥>﹥吖頭↗ 提交于 2019-12-03 17:08:21
此篇文章是《程序员需要了解的硬核知识》第五篇文章,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 程序员需要了解的硬核知识之磁盘 之前的文章更多的介绍了计算机的硬件知识,会有一些难度,本篇文章的门槛会低一些,一起来看一下计算机中都有哪些 压缩算法 认识压缩算法 我们想必都有过 压缩 和 解压缩 文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间。比如微信上传文件的限制是100 MB,我这里有个文件夹无法上传,但是我解压完成后的文件一定会小于 100 MB,那么我的文件就可以上传了。 此外,我们把相机拍完的照片保存到计算机上的时候,也会使用压缩算法进行文件压缩,文件压缩的格式一般是 JPEG 。 那么什么是压缩算法呢?压缩算法又是怎么定义的呢?在认识算法之前我们需要先了解一下文件是如何存储的 文件存储 文件是将数据存储在磁盘等存储媒介的一种形式。程序文件中最基本的存储数据单位是 字节 。文件的大小不管是 xxxKB、xxxMB等来表示,就是因为文件是以字节 B = Byte 为单位来存储的。 文件就是字节数据的集合。用 1 字节(8 位)表示的字节数据有 256 种,用二进制表示的话就是 0000 0000 - 1111 1111 。如果文件中存储的数据是文字,那么该文件就是文本文件。如果是图形