哈夫曼编码的JAVA实现课程设计
数据结构之哈夫曼树(java实现)

数据结构之哈夫曼树(java 实现)所谓哈夫曼树就是要求最小加权路径长度,这是什么意思呢?简而言之,就是要所有的节点对应的路径长度(高度-1)乘以该节点的权值,然后保证这些结果之和最小。
哈夫曼树最常用的应用就是解决编码问题。
一般我们用的ASCII 是固定长度的编码,对于那些常用的字符,使用很长的长度就显得略为浪费空间了。
下面以一个实例来构建一颗哈夫曼编码树。
设字符集S={A ,B ,C ,D ,E ,F},字符出现的频率W={2,3,5,7,9,12},对字符集进行哈夫曼编码(1)以频率为树的节点值,构建6个树节点,保存在一个数据集合T 中(2)选择频率集W 中最小的两个频率,然后相加,将结果作为树的节点值,构建新的树节点,将这两个最小值对应的树节点,分别作为新的节点的左右孩子。
从T 重删除这两个最小值对应的节点,最后将新节点放到T 中。
(3)重复第2步,直到T 中只剩下一个节点,那么该节点就是所需要的哈夫曼树其实说的容易,实现起来也有一点小麻烦,下面用java 实现: 树节点:1 2 3 4 5 6 7 8 9 10 public class TreeNode<t>{public TreeNode<t> leftNode;public TreeNode<t> rightNode;public T data;public TreeNode(T data){this.data=data;}}</t></t></t>构建哈夫曼树:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class TestTree{/** 设S={A,B,C,D,E,F},W={2,3,5,7,9,12}*/static HashMap<character, integer=""> map; public TestTree(){// TODO Auto-generated constructor stub}public static void main(String[] args){Character[] character = { 'A', 'B', 'C', 'D', 'E', 'F' };int[] weight = { 2, 3, 5, 7, 9, 12 };// 有序或者无序都一样map=new HashMap<character, integer="">();for(int i=0;i<weight.length;i++) integer="">> nodes = new ArrayList<treenode<integer>>();for (int i = 0; i < weight.length; i++){nodes.add(new TreeNode<integer>(weight[i]));}while (true){if (nodes.size() <= 1)break; // 找两个最小的 TreeNode<integer> minNode = nodes.get(0);TreeNode<integer> sminNode = nodes.get(1);for (int i = 1; i < nodes.size(); i++){Tree26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 Node<integer> tempNode = nodes.get(i);if (minNode.data >=tempNode.data){sminNode = minNode;minNode = tempNode;}}nodes.remove(minNode );nodes.remove(sminNod e);TreeNode<integer> newNode = new TreeNode<integer>(minN ode.data + sminNode.data);newNode.leftNode = minNode;newNode.rightNode = sminNode;nodes.add(newNode); }TreeNode<integer>hafmanTreeNode=node s.get(0);getHalmanCode(hafmanTreeNode," ");}public static void getHalmanCode(TreeNode<integer>hafmanTreeNode,String blank) {if(hafmanTreeNode==null)return;if(hafmanTreeNode.leftNode==null&&hafmanTr eeNode.rightNode==null){System.out.println("->"+getCha racter(hafmanTreeNode.data));}else{4 8 4 95 0 5 1 5 2 5 3 5 4 5 5 56 57 58 59 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 System.out.print("0"); getHalmanCode(hafmanTreeNode.leftNode,blank+" ");System.out.print(blank+"1" );getHalmanCode(hafmanTreeNo de.rightNode,blank+" ");}}//得到某一个字符的编码public static void getHalmanCode(TreeNode<integer>hafmanTreeNode,Character character){if(hafmanTreeNode==null)return;if(hafmanTreeNode.leftNode==null&&hafmanTr eeNode.rightNode==null){if(getCharacter(hafmanTreeNode.data)==character){System.out.p rint("");}}}//得到权值对应的字符public static Character getCharacter(int weight){Set<map.entry<character,integer="">>set=map.entrySet();for(Iterator<map.entry<character,integer="">> iterator=set.iterator();iterator.hasNext();){Map.Entry<character, integer="">entry=iterator.next();if(entry.getValue()==weigh t){map.remove (entry.getKey());return entry.getKey();}7 0 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 9 0 9 1}return null;}}</character,></map.entry<character,></map.entry<character,></integer></integer></integer></integer></integer></integer></intege r></integer></integer></treenode<integer></weight.length;i++)></char acter,></character,>929394结果:D:00E:01A:1000B:1001C:101F:11。
哈夫曼编码的JAVA实现课程设计

哈夫曼编码的JAVA实现课程设计目录摘要 (2)一、问题综述 (2)二、求解方法介绍 (3)三、实验步骤及结果分析 (4)四、程序设计源代码 (5)参考文献 (8)摘要利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本,试用java语言设计一个哈夫曼编码系统。
通过本课程设计,应使学生掌握哈夫曼编码的特点、储存方法和基本原理,培养学生利用java语言正确编写程序及调试程序的能力,运用数据结构知识解决实际问题的能力。
关键字:哈夫曼编码 JAVA语言类方法一、问题综述1 哈夫曼编码的算法思想哈夫曼编码也称前缀编码,它是根据每个字符出现的频率而进行编码的,要求任一字符的编码都不是其它任意字符编码的前缀且字符编码的总长度为最短。
它主要应用于通信及数据的传送以及对信息的压缩处理等方面。
哈夫曼编码的基础是依据字符出现的频率值而构造一棵哈夫曼树,从而实现最短的编码表示最常用的数据块或出现频率最高的数据,具体的方法是:1.1 建立哈夫曼树把N 个字符出现的频率值作为字符的权值,然后依据下列步骤建立哈夫曼树。
1.1.1 由N 个权值分别作N 棵树的根结点而形成一个森林。
1.1.2 从中选择两棵根值最小的树T1 和T2 组成一棵以结点T 为根结点的增长树,根结点T = T1 + T2 ,即新树的根值为原来两棵树的根值之和,而T1 和T2 分别为增长树的左右子树。
1.1.3 把这棵新树T 加入到森林中,把原来的两棵树T1 和T2 从森林中删除。
1.1.4 重复1.1.2~1.1.3 步,直到合并成一棵树为止。
1.2 生成各字符的哈夫曼编码在上面形成的哈夫曼树中,各个字符的权值结点都是叶子结点,从叶子结点开始向根搜索,如果是双亲的左分支,则用“0”标记,右分支用“1”标记,从叶子结点到根结点所经过的分支编码“0”、“1”的组合序列就是各字符的哈夫曼编码。
2 构造哈夫曼树的算法1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
谈如何用Java语言实现Huffman编码

关键 词 :Hu ma f n树 ;J v ;编 码 ;反 编码 aa
◇
2 建立 Huf n 码树 f ma 编
为 了利用优先队列建立 H f n uf 编码树 , ma 首先须建立优先 队y (r ry q e e的抽 象数据 类型( T)在 Jv 语言 中为 | ot lpi i uu ) AD , a a 数据接 口, 具体程序如下 :
pu i nera e PQ u e bl it f c c eu
一
Байду номын сангаас
。
哈 夫 曼 编 码 , 用 于 通 信 及 数 据 传 送 q 的 二 进 制 编 码 。 如 常 』
在进行快速远距离 电报通信 中, 能将 传送 的文 字信息转换 成 它 由二进制 字符 0 1 和 组成的二进制 串 , 且能使 电文编码最短 、 最
合理 , 而 最 经 济 。 从
本文就 Jv 语 言如何实 现 H f n aa u ma 算法作 了一些探 讨 , 给 出 了一 种 利 用优 先 队 列来 建 立 H f n 码 树 , 而得 到 uf 编 ma 从 H f n 码的方法 , 写出了一个完整 的上 机测试程序 。运 uf 编 ma 并 行该 程序 , 用户只需输入 电报 文 , 系统就 能迅速输 出对 应 电文 的准确二进制编码 , 而其 中哈 夫曼树叶结点及对应权值则 由系 统 自动提供
1 Huf n 法描述 f ma 算
数据结构课程设计哈夫曼编码实验

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。
二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。
写出技术工作报告并附源程序。
三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。
2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。
实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。
2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。
②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。
③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。
④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。
3)练习通过普通树来构造霍夫曼树。
课程设计哈夫曼编码

《数据结构》课程设计报告设计题目哈夫曼(Huffman)编译码器学院名称信息工程学院专业班级 13计本1 姓名 hhh学号1312219999目录一、实验题目-哈夫曼(Huffman)编/译码器 ------------------------------二、问题描述-----------------------------------------------三、设计目标-----------------------------------------------四、需求分析-----------------------------------------------五、概要设计-----------------------------------------------1---系统结构图--------------------------------------2--各个模块功能的详细描述------------------------------- 六、详细设计-----------------------------------------------1——详细代码--------------------------------------a)头文件代码--------------------------------------b)主函数代码--------------------------------------2——系统流程图--------------------------------------七、测试分析-----------------------------------------------八、使用说明-----------------------------------------------1、白盒-----------------------------------------------2、黑盒-----------------------------------------------九、课程设计总结----------------------------------------------一、实验题目哈夫曼(Huffman)编/译码器二、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
哈夫曼编译码程序java

哈夫曼编译码程序java以下是一个简单的Java实现的Huffman编码程序:```javaimport parator;import java.util.HashMap;import java.util.Map;import java.util.PriorityQueue;class HuffmanNode {int data;char c;HuffmanNode left;HuffmanNode right;}class MyComparator implements Comparator<HuffmanNode> { public int compare(HuffmanNode x, HuffmanNode y) {return x.data - y.data;}}public class HuffmanEncoding {public static void printCode(HuffmanNode root, String s) { if (root.left == null && root.right == null && Character.isLetter(root.c)) {System.out.println(root.c + ":" + s);return;}printCode(root.left, s + "0");printCode(root.right, s + "1");}public static void main(String[] args) {String s = "Huffman coding is a data compression algorithm."; char[] charArray = s.toCharArray();Map<Character, Integer> map = new HashMap<>();for (char c : charArray) {if (map.containsKey(c)) {map.put(c, map.get(c) + 1);} else {map.put(c, 1);}}PriorityQueue<HuffmanNode> queue = newPriorityQueue<>(map.size(), new MyComparator());for (Map.Entry<Character, Integer> entry : map.entrySet()) { HuffmanNode node = new HuffmanNode();node.c = entry.getKey();node.data = entry.getValue();node.left = null;node.right = null;queue.add(node);}HuffmanNode root = null;while (queue.size() > 1) {HuffmanNode x = queue.peek();queue.poll();HuffmanNode y = queue.peek();queue.poll();HuffmanNode newNode = new HuffmanNode();newNode.data = x.data + y.data;newNode.c = '-';newNode.left = x;newNode.right = y;root = newNode;queue.add(newNode);}printCode(root, "");}}```以上程序首先将输入的字符串转换为字符数组,并统计每个字符的出现次数。
哈夫曼算法课程课程设计

哈夫曼算法课程课程设计一、教学目标本课程旨在通过哈夫曼算法的教学,让学生了解和掌握数据压缩中的一种重要算法,培养学生分析和解决问题的能力。
1.了解哈夫曼算法的原理和特点。
2.掌握哈夫曼编码和解码的过程。
3.理解哈夫曼算法在数据压缩中的应用。
4.能够运用哈夫曼算法对数据进行编码和解码。
5.能够分析哈夫曼算法的性能,并与其他压缩算法进行比较。
情感态度价值观目标:1.培养学生对计算机科学和数据压缩的兴趣。
2.培养学生通过算法解决问题的方式,提高其创新思维。
二、教学内容本课程的教学内容主要包括哈夫曼算法的原理、编码和解码过程,以及其在数据压缩中的应用。
1.哈夫曼算法的原理:介绍哈夫曼算法的背景和基本思想,讲解算法的构建过程。
2.哈夫曼编码:讲解如何利用哈夫曼算法对数据进行编码,包括编码的步骤和注意事项。
3.哈夫曼解码:讲解如何利用哈夫曼算法对数据进行解码,包括解码的步骤和注意事项。
4.哈夫曼算法在数据压缩中的应用:介绍哈夫曼算法在数据压缩中的重要性,讲解如何运用哈夫曼算法进行数据压缩和解压缩。
三、教学方法为了更好地让学生理解和掌握哈夫曼算法,本课程将采用多种教学方法相结合的方式。
1.讲授法:讲解哈夫曼算法的原理、编码和解码过程,让学生了解算法的具体操作。
2.案例分析法:通过分析具体的案例,让学生了解哈夫曼算法在实际应用中的作用。
3.实验法:安排实验课,让学生亲自动手进行哈夫曼编码和解码,加深对算法的理解。
四、教学资源为了保证教学的质量和效果,我们将准备丰富的教学资源。
1.教材:选择权威、实用的教材,为学生提供系统的学习资料。
2.参考书:推荐学生阅读相关的参考书,拓展知识面。
3.多媒体资料:制作精美的PPT,生动形象地展示哈夫曼算法的原理和操作过程。
4.实验设备:准备充足的实验设备,确保每位学生都能在实验课中亲自动手操作。
五、教学评估为了全面、客观地评估学生的学习成果,本课程将采用多种评估方式。
1.平时表现:评估学生在课堂上的参与程度、提问和回答问题的表现,以及课堂作业的完成情况。
java源程序 哈夫曼编码

java源程序哈夫曼编码实现Huffman编码需要编写一些代码,因此我将提供一个简单的Java程序,演示如何使用Huffman编码对文本进行压缩和解压缩。
这个例子仅用于演示基本概念,实际使用中可能需要进行更多的优化和错误处理。
```javaimport java.util.PriorityQueue;import java.util.HashMap;import java.util.Map;class HuffmanNode implements Comparable<HuffmanNode> {char data;int frequency;HuffmanNode left, right;public HuffmanNode(char data, int frequency) {this.data = data;this.frequency = frequency;}@Overridepublic int compareTo(HuffmanNode o) {return this.frequency - o.frequency;}}public class HuffmanCoding {private static Map<Character, String> huffmanCodes = new HashMap<>();public static void main(String[] args) {String inputText = "hello world";Map<Character, Integer> frequencyMap = buildFrequencyMap(inputText);HuffmanNode root = buildHuffmanTree(frequencyMap);generateHuffmanCodes(root, "", huffmanCodes);System.out.println("Original Text: " + inputText);String encodedText = encode(inputText);System.out.println("Encoded Text: " + encodedText);String decodedText = decode(encodedText, root);System.out.println("Decoded Text: " + decodedText);}private static Map<Character, Integer> buildFrequencyMap(String text) {Map<Character, Integer> frequencyMap = new HashMap<>();for (char c : text.toCharArray()) {frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);}return frequencyMap;}private static HuffmanNode buildHuffmanTree(Map<Character, Integer> frequencyMap) { PriorityQueue<HuffmanNode> priorityQueue = new PriorityQueue<>();for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {priorityQueue.add(new HuffmanNode(entry.getKey(), entry.getValue()));}while (priorityQueue.size() > 1) {HuffmanNode left = priorityQueue.poll();HuffmanNode right = priorityQueue.poll();HuffmanNode mergedNode = new HuffmanNode('\0', left.frequency + right.frequency);mergedNode.left = left;mergedNode.right = right;priorityQueue.add(mergedNode);}return priorityQueue.poll();}private static void generateHuffmanCodes(HuffmanNode root, String code, Map<Character, String> huffmanCodes) {if (root != null) {if (root.left == null && root.right == null) {huffmanCodes.put(root.data, code);}generateHuffmanCodes(root.left, code + "0", huffmanCodes);generateHuffmanCodes(root.right, code + "1", huffmanCodes);}}private static String encode(String text) {StringBuilder encodedText = new StringBuilder();for (char c : text.toCharArray()) {encodedText.append(huffmanCodes.get(c));}return encodedText.toString();}private static String decode(String encodedText, HuffmanNode root) {StringBuilder decodedText = new StringBuilder();HuffmanNode current = root;for (char bit : encodedText.toCharArray()) {if (bit == '0') {current = current.left;} else if (bit == '1') {current = current.right;}if (current.left == null && current.right == null) {decodedText.append(current.data);current = root;}}return decodedText.toString();}}```请注意,这只是一个简单的示例,实际上Huffman编码可能涉及到更多的细节和考虑因素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈夫曼编码的JAVA实现课程设计目录摘要 (2)一、问题综述 (2)二、求解方法介绍 (3)三、实验步骤及结果分析 (4)四、程序设计源代码 (5)参考文献 (8)摘要利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本,试用java语言设计一个哈夫曼编码系统。
通过本课程设计,应使学生掌握哈夫曼编码的特点、储存方法和基本原理,培养学生利用java语言正确编写程序及调试程序的能力,运用数据结构知识解决实际问题的能力。
关键字:哈夫曼编码JA V A语言类方法一、问题综述1 哈夫曼编码的算法思想哈夫曼编码也称前缀编码,它是根据每个字符出现的频率而进行编码的,要求任一字符的编码都不是其它任意字符编码的前缀且字符编码的总长度为最短。
它主要应用于通信及数据的传送以及对信息的压缩处理等方面。
哈夫曼编码的基础是依据字符出现的频率值而构造一棵哈夫曼树,从而实现最短的编码表示最常用的数据块或出现频率最高的数据,具体的方法是:1.1 建立哈夫曼树把N 个字符出现的频率值作为字符的权值,然后依据下列步骤建立哈夫曼树。
1.1.1 由N 个权值分别作N 棵树的根结点而形成一个森林。
1.1.2 从中选择两棵根值最小的树T1 和T2 组成一棵以结点T 为根结点的增长树,根结点T = T1 + T2 ,即新树的根值为原来两棵树的根值之和,而T1 和T2 分别为增长树的左右子树。
1.1.3 把这棵新树T 加入到森林中,把原来的两棵树T1 和T2 从森林中删除。
1.1.4 重复1.1.2~1.1.3 步,直到合并成一棵树为止。
1.2 生成各字符的哈夫曼编码在上面形成的哈夫曼树中,各个字符的权值结点都是叶子结点,从叶子结点开始向根搜索,如果是双亲的左分支,则用“0”标记,右分支用“1”标记,从叶子结点到根结点所经过的分支编码“0”、“1”的组合序列就是各字符的哈夫曼编码。
2 构造哈夫曼树的算法1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F 中。
4)重复2)和3),直到集合F中只有一棵二叉树为止。
例如,对于4个权值为1、3、5、7的节点构造一棵哈夫曼树,其构造过程如下图所示:图1 构造哈夫曼树的过程示例二、求解方法介绍以往的哈夫曼编码程序实现都是利用PASCAL 或C 语言描述的,而这两门语言都有相应的指针类型来解决,实现起来较为容易,但是,JAVA语言是面向对象的编程语言,没有提供指针类型,所以在实现上应该结合JAVA 的应用环境,采用静态的方法解决。
同时,JAVA 语言是具有平台无关性的网络编程语言,用JAVA 语言实现哈夫曼编码不论在教学中或是在实际应用中都有一定的意义。
本程序是用哈夫曼树来实现哈夫曼编码的功能,根据输入的报文进行分析,建立哈夫曼树。
统计输入字符串的长度,并对每个字符的频度进行计算。
对每个字符及相应的频度作为叶结点建立哈夫曼树。
哈夫曼树的建立过程采用把结点看作树每次选最小的两个建立树,并把他们的频度相加,再继续选取最小的两个数建立,直到所有的结点建立完,才形成完整的哈夫曼树。
接下来是对没个结点进行编码,从第一个结点开始看它的双亲,若它双亲做左孩子则记0,若是右孩子则记1,依次往上推,直到哈夫曼的根结点为止。
记录编码打印出来。
为了体现程序中各个功能的独立性,结合JAVA 语言的编程要求,对程序中所用到的类和方法进行说明:1 公共类Tree:组成哈夫曼树的最小单元。
其成员变量有:1.1lchild:最小单元的左孩子。
1.2rchild:最小单元的右孩子。
1.3parents:最小单元的双亲。
2 公共类Huffman:描述哈夫曼编码的整个过程,其成员变量有:2.1 numsMo:储存要进行编码的一组数。
2.2 nums:临时储存要进行编码的这组数,会随着后面的调用而变化。
2.3 trees:储存哈夫曼树,由若干最小单元构成。
2.4 temp:中间变量,是字符串类型。
3 核心方法及流程3.1main 方法:用于程序的执行入口。
其中定义了一个Huff 类实体,调用方法start() 完成数组初始排序,实现哈夫曼编码等一系列的操作。
3.2 addNum 方法:用于方法初始化给定的要进行编码的数组,数组通过控制台键盘录入。
3.3 minTo 方法:在一组数中选择最小的两个,按递增顺序返回。
3.4 compareNum 方法:是公共类Huffman的核心算法之一,该方法是将一组树形成哈夫曼树,左孩子为较小值。
3.5 print 方法:是公共类Huffman的核心算法之一,该方法利用递归打印出编码。
其流程图如下:三、实验步骤及结果分析测试数据:0.01 0.03 0.07 0.13 0.19 0.26 0.31程序运行:请输入一组数,中间用空格分隔:0.010.03 0.07 0.13 0.19 0.26 0.31输出结果为:0.01 : 01000 码长:50.03 : 01001 码长:50.07 : 0101 码长:40.13 : 011 码长:30.19 : 00 码长:20.26 : 10 码长:20.31 : 11 码长:2心得体会:在本次的课程设计中,就在编写好源代码后的调试中出现了不少的错误,遇到了很多麻烦及困难。
我的调试及其中的错误和我最终找出错误,修改为正确的能够执行的程序中,通过分析,我学到了:在递归调用方法时最好不要有返回值,否则会使程序变得逻辑混乱,复杂难懂;当从叶结点向上编码时,根据本程序的特点会有可能重复的tree,所以要分成同tree和不同tree进行不同的逻辑编程。
通过本次的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树及哈夫曼编码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识,真正学会了一种算法。
当求解一个算法时,不是拿到问题就不加思索地做,而是首先要先对它有个大概的了解,接着再详细地分析每一不怎么做,无论自己以前是否有处理过相似的问题,只要按照以上的步骤,必定会顺利地做出来。
四、程序设计源代码import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Huffman {private List<Double> nums;private List<Double> numsMo;private List<Tree> trees;private String temp;public Huffman() {nums = new ArrayList<Double>();numsMo = new ArrayList<Double>();trees = new ArrayList<Tree>();temp="";}public void addNums() {// 给定一组数System.out.println("请输入一组数,中间用空格分隔:");Scanner sca = new Scanner(System.in);String str = sca.nextLine();String[] strs = str.split(" ");for (int i = 0; i < strs.length; i++) {nums.add(Double.parseDouble(strs[i]));numsMo.add(Double.parseDouble(strs[i]));}}public void compareNum(List<Double> nums,List<Tree> trees) {// 递归算法double[] min = new double[2];if(nums.size()>1){min = minTwo(nums);Tree t = new Tree(min[0],min[1],min[0]+min[1]);nums.remove(Double.valueOf(min[0]));nums.remove(Double.valueOf(min[1]));nums.add(min[0]+min[1]);trees.add(t);compareNum(nums,trees);}}public void print(double num) {// 递归打印编码for(Tree t : trees){if(num == t.getRchild()){temp = 1+temp;print(t.getParents());break;}else if(num == t.getLchild()){temp = 0+temp;print(t.getParents());break;}}}public void write(double d){temp = "";System.out.print(d+" : ");print(d);System.out.print(temp);System.out.println(" 码长:"+temp.length());}public double[] minTwo(List<Double> nums) {// 在一组数中选则最小的两个,按递增排序返回Double temp = 0.0;for (int j = 0; j < 2; j++) {for (int i = 1; i < nums.size(); i++) {if (nums.get(i - 1) < nums.get(i)) {temp = nums.get(i);nums.set(i, nums.get(i - 1));nums.set(i - 1, temp);}}}double[] n ={nums.get(nums.size()-1),nums.get(nums.size()-2)};return n;}public void start(){addNums();compareNum(nums,trees);while(numsMo.size()>1){double[] mins = minTwo(numsMo);if(mins[0]!=mins[1]){numsMo.remove(Double.valueOf(mins[0]));write(mins[0]);}}if(!numsMo.isEmpty()){write(numsMo.get(0));}}public static void main(String[] args){new Huffman().start();}}参考文献1(美)Stuart Reges,(美)Marty Stepp著陈志等译,java程序设计教程,机械工业出版社,20082(英)David J.C.Mackay著肖明波,席斌,许芳,王建新译,信息论、推理与学习算法,高等教育出版社,2006。