- 浏览: 600265 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权.
哈夫曼树的构造:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树
例:
假设一个文本文件中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13},求这些字符的哈夫曼编码。
//上图的测试:
运行结果:
data:null;weight:105.0;Coding:
data:null;weight:41.0;Coding:0
data:null;weight:64.0;Coding:1
data:D;weight:17.0;Coding:00
data:B;weight:24.0;Coding:01
data:null;weight:30.0;Coding:10
data:E;weight:34.0;Coding:11
data:G;weight:13.0;Coding:100
data:null;weight:17.0;Coding:101
data:C;weight:7.0;Coding:1010
data:null;weight:10.0;Coding:1011
data:F;weight:5.0;Coding:10110
data:A;weight:5.0;Coding:10111
下载源码:
哈夫曼树的构造:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树
import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Queue; public class HuffmanTree<T> { //构造哈夫曼树 public static <T> Node<T> createTree(List<Node<T>> nodes){ while(nodes.size() > 1){ Collections.sort(nodes); Node<T> left = nodes.get(nodes.size()-1); Node<T> right = nodes.get(nodes.size()-2); Node<T> parent = new Node<T>(null, left.getWeight()+right.getWeight()); parent.setLeft(left); parent.setRight(right); nodes.remove(left); nodes.remove(right); nodes.add(parent); } return nodes.get(0); } //递归生成Huffman编码 public static<T> void generateHuffmanCode(Node<T> root){ if (root==null) return; if(root.getLeft()!=null) root.getLeft().setCoding(root.getCoding()+"0"); if(root.getRight()!=null) root.getRight().setCoding(root.getCoding()+"1"); generateHuffmanCode(root.getLeft()); generateHuffmanCode(root.getRight()); } public static <T> List<Node<T>> breadth(Node<T> root){ //广度优先遍历哈夫曼树 List<Node<T>> list = new ArrayList<Node<T>>(); Queue<Node<T>> queue = new ArrayDeque<Node<T>>(); if(root != null){ queue.offer(root); } while(!queue.isEmpty()){ list.add(queue.peek()); Node<T> node = queue.poll(); if(node.getLeft() != null){ queue.offer(node.getLeft()); } if(node.getRight() != null){ queue.offer(node.getRight()); } } return list; } } //哈夫曼树节点 public class Node<T> implements Comparable<Node<T>> { private T data; private double weight; private String coding = ""; //哈夫曼编码 private Node<T> left; private Node<T> right; public Node(T data, double weight){ this.data = data; this.weight = weight; } public T getData() { return data; } public void setData(T data) { this.data = data; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public Node<T> getLeft() { return left; } public void setLeft(Node<T> left) { this.left = left; } public Node<T> getRight() { return right; } public void setRight(Node<T> right) { this.right = right; } public String getCoding(){ return coding;} public void setCoding(String coding){ this.coding = coding;} @Override public String toString(){ return "data:"+this.data+";weight:"+this.weight+";Coding:"+this.coding; } @Override public int compareTo(Node<T> other) { if(other.getWeight() > this.getWeight()){ return 1; } if(other.getWeight() < this.getWeight()){ return -1; } return 0; } }
例:
假设一个文本文件中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13},求这些字符的哈夫曼编码。
//上图的测试:
import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { int a[]={5,24,7,17,34,5,13}; String s[]={"A","B","C","D","E","F","G"}; List<Node<String>> list1 = new ArrayList<Node<String>>(); for(int i=0;i<a.length;i++) list1.add(new Node<String>(s[i],a[i])); root = HuffmanTree.createTree(list1); HuffmanTree.generateHuffmanCode(root); List<Node<String>> list2=HuffmanTree.breadth(root); for(Node<String> node: list2) System.out.println(node); } }
运行结果:
data:null;weight:105.0;Coding:
data:null;weight:41.0;Coding:0
data:null;weight:64.0;Coding:1
data:D;weight:17.0;Coding:00
data:B;weight:24.0;Coding:01
data:null;weight:30.0;Coding:10
data:E;weight:34.0;Coding:11
data:G;weight:13.0;Coding:100
data:null;weight:17.0;Coding:101
data:C;weight:7.0;Coding:1010
data:null;weight:10.0;Coding:1011
data:F;weight:5.0;Coding:10110
data:A;weight:5.0;Coding:10111
下载源码:
发表评论
-
求二叉树上任意两个节点的最近公共父节点
2013-01-09 10:24 2392北大百练题2756: 如上图所示,由正整数1, 2 ... -
JAVA判断二叉树是否是二叉平衡树
2013-01-07 18:59 1985import java.util.*; ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1887POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1395接前文:二维树状数组学习之一:彻底理解http://128kj ... -
二维树状数组学习之一:彻底理解
2012-12-12 20:54 2466当要频繁的对数组元素进行修改,同时又要频繁的查询数组内 ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1818关于树状数组:参看:http://128kj.iteye.co ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1807关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1816关于树状数组,请参考:http://128kj.iteye.c ... -
初步了解树状数组
2012-12-07 14:18 1771一、树状数组是干什么的? 平常我们会遇到一些对数组进 ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2090POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
利用线段树求逆序数(JAVA)
2012-12-04 22:46 2568设A[1…n]是一个包含n个不同数的数组。如果在i< ... -
线段树入门学习(三)懒操作(兼解POJ1823) JAVA
2012-12-02 15:37 2114继续上文"线段树入门学习(二)" ht ... -
线段树入门学习(二)(兼解POJ3468) JAVA
2012-11-30 16:55 2542继续上文http://128kj.iteye. ... -
线段树入门学习(兼解HDU1754)
2012-11-30 11:24 2692先看网上的介绍: 线段树也叫区间树,顾名思义,线段树是 ... -
AVL树及JAVA实现
2012-11-26 16:34 2288一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二 ... -
图解平衡二叉树
2012-11-26 11:34 2060形态匀称的二叉树 ... -
深度优先遍历字典树(统计单词出现的个数)
2012-11-23 22:18 2850例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百 ... -
学习使用字典树(JAVA)
2012-11-22 09:25 2129字典树 又称单词 ... -
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
2012-11-17 21:50 18698堆有最大堆和最小堆之分,最大堆就是每个节点的值都>= ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 4043一、什么是并查集 ...
相关推荐
在Java中实现哈夫曼树和哈夫曼编码,可以分为以下几个关键部分: 1. **创建`HuffmanNode`类**:表示哈夫曼树的节点,包含字符、频率以及指向左右子节点的引用。 2. **优先队列`PriorityQueue<HuffmanNode>`**:用于...
在Java中实现哈夫曼树,我们可以分为以下几个步骤: 1. **哈夫曼编码**:哈夫曼编码是哈夫曼树的基础,它是为每个字符分配一个唯一的二进制码,使得字符出现频率越高,其编码越短。哈夫曼编码的过程是通过构造...
在Java语言中,实现哈夫曼树可以帮助我们理解和掌握数据结构与算法的核心概念。 哈夫曼树的基本思想是基于贪心策略,通过构建最小带权路径长度(Minimum Weighted Path Length, MWPL)的二叉树来达到数据编码的最...
在本项目中,使用Java窗体设计来实现哈夫曼树的可视化操作,用户可以直观地看到哈夫曼树的构建过程和编码结果。 首先,我们需要理解哈夫曼树的构造过程。哈夫曼树的构建通常包括以下几个步骤: 1. 统计字符频率:...
本项目“精选_毕业设计_基于JAVA实现的Huffman哈夫曼树编码与解码_完整源码”是用Java语言实现的,它涵盖了哈夫曼编码的构建、编码和解码过程。下面我们将深入探讨哈夫曼编码的基本原理以及如何用Java进行实现。 ...
从终端读入字符集大小 n,及 n 个字符和 m 个权值,建立哈夫曼树,并将它存于文件 hfmtree 中。 (2)C:编码 (Coding)。利用已建好的哈夫曼树(如不在内存,则从文件 hfmtree 中读入),对文件 tobetrans 中的正文进行...
1. **编码过程**:遍历文本,统计每个字符的出现频率,构建哈夫曼树并生成哈夫曼编码。使用生成的编码对原文本进行编码,得到压缩后的数据。 2. **译码过程**:读取编码文件,利用构建的哈夫曼树,从根节点开始,...
在Java中实现自适应哈弗曼编码,你需要创建一个哈弗曼节点类,表示树的结构;接着是哈弗曼树类,用于构建和维护编码树;还需要一个编码器类,用于根据字符频率构建哈弗曼树并生成编码;最后,解码器类用于解析已...
在Java中实现哈夫曼树,可以创建一个Node类,包含节点的值、左子节点和右子节点。通过比较节点的值,可以构建最小堆,然后按照上述哈夫曼树的构建算法进行操作。具体实现涉及队列或堆的数据结构,以及递归或迭代的...
在Java中实现哈夫曼树的编码和解码过程涉及以下几个主要步骤和概念: 1. **哈夫曼树构建**: - **哈夫曼节点**:每个节点代表一个字符,包含字符及其频率信息。 - **最小堆**:用于存储哈夫曼节点,每次取出频率...
在《严蔚敏奶奶数据结构》一书中,第六章关于树的部分详细介绍了哈夫曼编码的原理和实现。首先,我们理解哈夫曼树的基本概念:这是一棵带权路径长度最短的二叉树,其中权值较小的节点通常位于较深的层次,权重较大的...
在Java中实现哈夫曼树的压缩工具,首先要理解以下几个关键步骤: 1. **字符频率统计**:首先,需要统计输入文本中各个字符的出现频率。这可以通过遍历文本并使用哈希表记录每个字符及其出现次数来完成。 2. **构建...
哈夫曼编码算法与分析(java实现) 哈夫曼编码是一种广泛用于数据文件压缩的十分有效的编码方法,它通过对文件中各个字符出现的频率进行分析,生成各个字符的哈夫曼编码方案。哈夫曼编码的主要思想是通过构造一棵...
下面将详细介绍哈夫曼编码的原理、构建过程以及在Java中的实现。 1. **哈夫曼编码原理**: 哈夫曼编码是建立在频率统计基础上的,通过对输入文本中各个字符出现频率的统计,构造一棵特殊的二叉树——哈夫曼树。在...
代码可能包括定义哈夫曼树节点结构、优先队列(最小堆)的实现、哈夫曼树的构建函数、编码和解码函数等。由于没有提供具体代码,我们无法详细分析每个函数的功能,但可以肯定的是,这个程序能够读取字符频率,构建...
在8.3版本的压缩包中,可能包含了一个实现哈夫曼树压缩和解压缩的程序。这个程序可能包括了对文件进行读取、频率统计、哈夫曼树构建、编码生成、编码文件写入、解码以及哈夫曼树重建等功能。通过学习和理解这个程序...
总的来说,哈夫曼编码在Java中的实现主要涉及数据结构(如二叉树)和算法(如快速排序)的应用,通过构建和遍历哈夫曼树来实现对字符的高效编码。在实际应用中,哈夫曼编码常用于文本、图像等数据的压缩,以减少存储...
总之,哈夫曼编码是数据压缩的重要工具,通过从文件中读取字符串构建哈夫曼树,我们可以实现高效的文本压缩。在实际应用中,哈夫曼编码常与其他压缩技术结合,如LZ77、LZ78等,以进一步提升压缩效率。掌握哈夫曼编码...