哈夫曼编码的JAVA实现课程设计

合集下载

数据结构之哈夫曼树(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实现课程设计

哈夫曼编码的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编码

谈如何用Java语言实现Huffman编码
用 。Jv 语 言 是一 种 目前 比较 流 行 的 、 aa 面向 对 象的 程 序 设 计 语 言 , 章 就 如 何 利 用 Jv 的优 先 队 列结 构 建 立 H f n 文 aa u ma 编 码 树 进 行 了探 讨 , 给 出 了编码 与 反 编 码 程序 。 并
关键 词 :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以下是一个简单的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源程序 哈夫曼编码

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编码可能涉及到更多的细节和考虑因素。

哈夫曼编译码程序java

哈夫曼编译码程序java

哈夫曼编译码程序简介哈夫曼编码是一种用于数据压缩的算法,通过根据字符出现的频率来构建一个最优的二叉树,将出现频率高的字符用较短的编码表示,从而实现对数据的高效压缩和解压。

本文将介绍如何使用Java编写一个简单的哈夫曼编译码程序。

我们将分为以下几个部分来讲解:1.哈夫曼编码原理及算法2.构建哈夫曼树3.生成哈夫曼编码表4.编码和解码哈夫曼编码原理及算法在介绍具体实现之前,我们先来了解一下哈夫曼编码的原理和算法。

原理哈夫曼编码是一种变长编码方式,即不同字符可以用不等长的二进制串表示。

它基于出现频率较高的字符使用较短的二进制串进行表示,而出现频率较低的字符使用较长的二进制串进行表示。

这样做可以大大减小数据在传输和存储过程中所占用的空间。

算法步骤1.统计字符频率:遍历待压缩的文本,统计每个字符出现的频率。

2.构建哈夫曼树:根据字符频率构建一个最小堆,每个节点包含字符和频率信息。

通过不断合并两个频率最小的节点,构建一棵哈夫曼树。

3.生成哈夫曼编码表:从根节点开始遍历哈夫曼树,左子树路径为0,右子树路径为1,将每个叶子节点对应的路径作为其编码。

4.编码和解码:使用生成的哈夫曼编码表对待压缩的文本进行编码,将每个字符替换为其对应的二进制串;使用哈夫曼树对编码后的二进制串进行解码。

构建哈夫曼树首先我们需要定义一个节点类来表示哈夫曼树中的节点:class Node implements Comparable<Node> {char character;int frequency;Node left;Node right;// 构造函数public Node(char character, int frequency, Node left, Node right) { this.character = character;this.frequency = frequency;this.left = left;this.right = right;}// 实现Comparable接口public int compareTo(Node other) {return this.frequency - other.frequency;}}然后我们可以利用优先队列(PriorityQueue)来构建最小堆,并通过合并两个频率最小的节点来构建哈夫曼树:import java.util.*;public class HuffmanTreeBuilder {public Node buildHuffmanTree(Map<Character, Integer> frequencyMap) {PriorityQueue<Node> minHeap = new PriorityQueue<>();// 将每个字符的频率作为节点的权重,构建最小堆for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) { char character = entry.getKey();int frequency = entry.getValue();minHeap.offer(new Node(character, frequency, null, null));}// 合并两个频率最小的节点,直到堆中只剩下一个节点while (minHeap.size() > 1) {Node left = minHeap.poll();Node right = minHeap.poll();int combinedFrequency = left.frequency + right.frequency;minHeap.offer(new Node('\0', combinedFrequency, left, right));}return minHeap.poll();}}生成哈夫曼编码表生成哈夫曼编码表是通过遍历哈夫曼树来实现的。

哈夫曼编码课程设计

哈夫曼编码课程设计

1、问题分析为了建立哈夫曼树以及实现哈夫曼编码以及译码,因此我们选择了结点结构体,利用这一结构体,我们定义了一个结构体数组和一个树根指针,数组用来纪录输入数据的多少,树根指针用来连接哈夫曼树。

从程序中可以看到使用哈夫曼算法构造哈夫曼树过程,是从n棵知识一个根结点的树组成的森林开始的。

在算法执行中,哈夫曼树是由若干棵树组成的森林,通过不断地合作树,最后得到一棵哈夫曼树。

为了便于实现哈夫曼树的建树运算,定义程序的哈夫曼树类HfmTree,它包括如下两个私有数据成员tree和weight:其中,tree是一个二叉树BinaryTree类型对象,是一棵哈夫曼树,weight是tree所代表的哈夫曼树的权值。

在本课程设计中使用函数Huffman()。

构造哈夫曼树算法:(1)用给定的一组权值{W1,W2,…,Wn},生成一个有n棵树组成的森林F={T1,T2,…Tn},其中每棵二叉树Ti只有一个结点,即权值为Wi的根结点(也是叶子结点);(2)从F中选择两棵根结点权值最小的树,作为新树根的左右子树,新树根的权值是左右子树根结点的权值之和;(3)从F中删除这两棵树,另将新二叉树加入F中;(4)重复(2)和(3),直到F中只包含一棵树为止。

本次程序设计的是哈夫曼编码。

由建立好的哈夫曼树来进行编码,构造一个CodeNode结构体用来存储编码字符及各字符的编码,从根结点开始,左走一步为‘0’,右走一步为‘1’,并将编码结果存入文件中,译码过程为从文件中逐一扫描码文,并从哈夫曼树的根开始,将扫到的二进制位串中的相邻位与哈夫曼树上标的0,1相匹配,以确定一条从根到叶子结点的路径,一旦到达叶子,则译出了一个字符。

再回到树根从二进位串的下一位开始继续译码。

使用transcode()函数即可完成。

2、算法设计Huffman编码是一种可变长编码方式,是由美国数学家David Huffman创立的,是二叉树的一种特殊转化形式。

编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。

哈夫曼编码系统的设计与实现

哈夫曼编码系统的设计与实现

哈夫曼编码系统的设计与实现
哈夫曼编码是一种用于数据压缩的编码方式,通过将出现频率高的字符用较短的编码表示,从而实现对数据的压缩。

哈夫曼编码系统的设计与实现包括以下几个步骤:
1. 字符频率统计:根据待压缩的数据,统计每个字符出现的频率。

可以使用哈希表或数组来记录每个字符的频率。

2. 构建哈夫曼树:根据字符的频率构建哈夫曼树。

首先将每个字符及其频率作为叶子节点,并按照频率的大小构建一个最小堆。

然后,每次从最小堆中取出两个频率最小的节点,将它们作为子节点构建一个新的节点,频率为子节点频率之和。

将新的节点放回最小堆中,重复上述步骤,直到最小堆中只剩下一个节点,即为哈夫曼树的根节点。

3. 构建编码表:通过遍历哈夫曼树,可以得到每个字符对应的哈夫曼编码。

一种常用的方式是,从根节点开始,每次向左走为0,向右走为1,直到叶子节点,将走过的路径记录下来,即为该字符的哈夫曼编码。

可以使用哈希表来存储每个字符及其对应的哈夫曼编码。

4. 数据压缩:根据构建好的哈夫曼编码表,将待压缩的数据中的每个字符替换为对应的哈夫曼编码,并将编码后的数据保存起来。

由于哈夫曼编码的特性,编码后的数据长度会变短,从而实现对数据的压缩。

5. 数据解压缩:使用相同的哈夫曼树和哈夫曼编码表,将压缩后的数据中的每个哈夫曼编码替换为对应的字符,从而实现对数据的解压缩。

要注意的是,设计和实现哈夫曼编码系统需要考虑到字符频率统计的效率、哈夫曼树的构建算法选择、编码表的存储结构选择等问题。

此外,还需要注意对压缩后的数据进行合理的保存和传输,以便于解压缩时能够正确恢复原始数据。

课程设计---哈夫曼编码编程实现

课程设计---哈夫曼编码编程实现
void statistics()
{
char ch;
while((ch=cin.get())!='#')//从输入流中断获取字符
if (!find_record(ch))//如果在承载字符的链表中以有那个字符,就不记录。退回调用函//数。
recording(ch);//如果在承载字符的链表中没那个字符,就向那个链表插入一个结点//来记录那个字符。
课程设计报告
课程名称:
数据结构课程设计
课程设计题目:
哈夫曼编码编程实现
系:
数学与计算科学系
专业:
信息与计算科学
年级、班:
姓名:
学号:
指导教师:
职称:
讲师
2011年12月
课程设计课题:
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本,试设计一个哈夫曼编码系统。功能要求:从键盘输入一段报文(如"what did you do that made you so happy")或从文档中读取,输出这段报文的哈夫曼编码。
课题分析:
由课题的要求,在编程中要实现字符统计、哈夫曼树的建立及该树的哈夫曼编码的读取。
这三者顺序进行。
实现思路
1、字符统计:
字符统计是为了计算出字符的频数,以之构成哈夫曼树叶子结点的权。在实现中,本人采用一个链表表示字符的统计信息。并把所有字符关联到一起。这个链表在后面称为承载统计字符链表。在链表中的结点是一个结构体。
{
char ch;
int frequency;
struct information_node *next;
enter_huffman_values( n);//哈夫曼树叶子结点的输入

赫夫曼编码课程设计

赫夫曼编码课程设计

赫夫曼编码课程设计一、教学目标本课程旨在让学生了解和掌握赫夫曼编码的基本原理和应用方法。

通过本课程的学习,学生应达到以下目标:1.知识目标:•了解赫夫曼编码的定义、原理和特点。

•理解赫夫曼编码在数据压缩中的应用。

•掌握赫夫曼编码的算法和实现方法。

2.技能目标:•能够运用赫夫曼编码对数据进行压缩和解压缩。

•能够分析和评估赫夫曼编码的压缩效果。

•能够运用编程语言实现赫夫曼编码算法。

3.情感态度价值观目标:•培养学生的创新意识和问题解决能力。

•培养学生对信息技术的兴趣和好奇心。

•培养学生团队合作和沟通的能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.赫夫曼编码的基本原理:介绍赫夫曼编码的定义、原理和特点,包括编码的过程和步骤。

2.赫夫曼编码的应用:讲解赫夫曼编码在数据压缩中的应用,包括图像、音频和视频数据的压缩。

3.赫夫曼编码的算法和实现:详细介绍赫夫曼编码的算法步骤,包括建立编码树、生成编码表和进行数据编码和解码的过程。

4.赫夫曼编码的编程实现:通过编程语言(如Python)实现赫夫曼编码算法,并进行实例演示和分析。

5.赫夫曼编码的压缩效果分析:通过实验和案例分析,评估赫夫曼编码的压缩效果和性能。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法:1.讲授法:教师通过讲解赫夫曼编码的基本原理和应用,引导学生理解和掌握相关知识。

2.案例分析法:通过分析实际案例,让学生了解赫夫曼编码在数据压缩中的应用和效果。

3.实验法:学生通过编程实践,实现赫夫曼编码算法,并评估其压缩效果。

4.讨论法:学生分组讨论和合作解决问题,培养团队合作和沟通能力。

四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:选择一本与赫夫曼编码相关的教材,作为学生学习的基础资料。

2.参考书:提供一些与赫夫曼编码相关的参考书籍,供学生深入学习和参考。

3.多媒体资料:制作PPT和教学视频,用于辅助讲解和演示赫夫曼编码的相关概念和算法。

哈夫曼编码java

哈夫曼编码java

哈夫曼编码java
哈夫曼编码是一种数据压缩算法,可以将原始数据进行编码,使其尽可能少的占用存储空间。

本文将介绍如何使用Java实现哈夫曼编码。

首先,需要通过统计原始数据中每个字符出现的次数来构建哈夫曼树。

可以使用一个HashMap来记录字符出现的次数,然后将每个字符和其出现次数作为叶子节点构建哈夫曼树。

接下来,需要对哈夫曼树进行编码。

可以通过递归遍历哈夫曼树,为每个字符生成对应的编码。

编码可以使用一个
StringBuilder来存储,每次遍历到左子节点则在编码末尾添加0,遍历到右子节点则在编码末尾添加1。

当遍历到叶子节点时,将生成的编码存储在一个HashMap中。

最后,可以将原始数据按照生成的编码进行压缩。

将每个字符对应的编码拼接起来,形成一个二进制字符串,然后将其转换为字节数组,即可将原始数据压缩为最小的存储空间。

以上就是使用Java实现哈夫曼编码的基本流程。

具体的实现细节可以参考相关的代码示例和资料。

- 1 -。

数据结构 哈夫曼编码器课程设计报告

数据结构 哈夫曼编码器课程设计报告

数据结构哈夫曼编码器课程设计报告哈夫曼编码器课程设计报告设计目标:本课程设计的目标是实现一个哈夫曼编码器,能够实现对给定文本文件进行压缩和解压缩操作。

通过使用哈夫曼编码,可以使文本文件的大小大幅度减小,从而节约存储空间。

设计原理及实现方法:本设计主要包括以下几个步骤:1、文本文件的读取:首先需要从外部文件中读取待压缩的文本文件,读取过程可以通过使用文件输入流进行操作。

读取的文本内容将用于构建哈夫曼树和编码表。

2、构建哈夫曼树:哈夫曼树是通过给定文本中的字符出现频率来构建的,出现频率更高的字符将拥有更短的编码。

构建哈夫曼树的过程可以通过使用优先队列和二叉树来实现。

3、编码表:在构建哈夫曼树的过程中,每个字符都会有一个唯一的编码。

根据哈夫曼树的特性,左子树的编码为0,右子树的编码为1,根据这个规则可以通过遍历哈夫曼树来编码表。

4、压缩文本文件:在编码表后,可以利用编码表来对文本文件进行压缩操作。

遍历文本文件中的每个字符,通过编码表将字符转换为对应的哈夫曼编码,并将编码存储在一个压缩文件中。

5、解压缩文本文件:解压缩操作是压缩操作的逆过程。

根据编码表将压缩文件中的哈夫曼编码逐个解码为字符,并将解码后的字符写入解压缩文件中。

附件说明:本文档的附件包括以下内容:1、源代码文件:- HuffmanEncoder:java:包含了哈夫曼编码器的主要实现代码。

- Mn:java:包含了测试哈夫曼编码器的主函数。

2、示例文本文件:- input:txt:用于测试的示例文本文件。

法律名词及注释:本文档中涉及的法律名词及注释如下:1、哈夫曼编码:用于数据压缩的一种编码方式,旨在通过减少字符的编码长度来节省存储空间。

2、压缩:将原始文件经过编码转换为较短的文件,从而减小存储空间的占用。

3、解压缩:将压缩文件经过解码转换为原始文件,恢复原始文件的过程。

全文结束。

Java哈夫曼编码译码器

Java哈夫曼编码译码器

J a v a哈夫曼编码译码器------------------------------------------作者xxxx------------------------------------------日期xxxx课程设计(论文)任务书学院专业班课程名称面向对象技术课程设计题目哈夫曼编码/译码器任务起止日期: 2010 年12 月 06日~ 2010 年12月 24 日学生姓名学号指导教师教研室主任年月日审查课程设计(论文)任务注:1. 此任务书由指导教师填写。

如不够填写,可另加页。

2. 此任务书最迟必须在课程设计(论文)开始前下达给学生。

学生送交全部材料日期学生(签名)指导教师验收(签名)摘要Huffman编码是一种可变长编码方式,是二叉树的一种特殊转化形式。

它的原理是:将使用次数多的代码转换成长度较短的编码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。

本文根据Huffman编码原理,在详细设计中,根据权值和最小的根本原则,我们输入要编码的字符集及其它的权值,再根据在概要设计中提到的节点Node类,算法SuanFa类以及主类JieMian类,建立哈夫曼树,并进行编码,最后输出哈夫曼编码。

在完成Huffman编码后,我们利用其构建的哈夫曼编码树来进行译码。

与编码过程不同,译码过程中,我们将用户输入的二进制代码串依次与字符集中的每个字符的编码进行比较,译出一个字符后,循环比较下一个字符的编码,直到所有二进制码全部译出为止。

在编码和译码的过程中,我们遇到很多问题,诸如算法、语法问题,但我们都通过不断的分析,和调试将这些问题一一解决,最终建立了一个完整的编/译码系统。

关键词:Huffman编码树;最优二叉树;编码;译码AbstractHuffman coding is a encoding of variable length and a special transformation form of the binary tree. Its principle is: the code that be used more often will be changed into the code of shorter lengths, while the codes that be used less often can be transformed into the code of longer lengths and the unique solution of coding will be kept. According to the theory of Huffman coding, firstly we enter the character set which will be used to coding and their weights. Secondly, according to the fundanmental principle that the sum of the weights needs to be the smallest , the program designs Huffman tree in accordance with these class which are initialized in the outline such as class Node,class SuanFa,and class JieMian. At last, the computer will output Huffman coding on user interface.And then, we use the Huffman coding tree to decoding after the completion of Huffman coding tree.Here are difference with encoding process. We will compare the binary string that the user input with the character set one by one during the processs of decoding .And then, the cycle of the next character encoding will continue which is based on the completion of translation of a character. It will be finished until all the binary code is translated.During the process of coding and decoding, we encounter many problems, such as the problem on arithmetic and grammar. However, we try our best to solve these problems through constant analysis and debugging.Eventually, we achieve the goal that establish a complete system on coding and decoding successfully.Key Words:Huffman coding tree;optimal binary tree;coding;decoding目录一、需求分析 (1)二、概要设计 (2) (2) (2) (2)三、详细设计 (6) (6)四、设计和调试分析 (15)五、用户手册 (16)六、测试结果 (20)七、参考文献八、附录哈夫曼编码/译码器一.需求分析1.举例说明,先前快速远距离通信的主要手段是电报,即将需要传送的文字转换成由二进制的字符组成的字符串。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档