哈夫曼树的介绍 ---java实现
一、 什么是哈夫曼树
是一种带权路径长度最短的二叉树,也称最优二叉树
带权路径长度:WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln)
N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树。对应的叶结点的路径长度为Li(i=1,2,...n)。
二、 建立哈夫曼树
已知的一组叶子的权值w1,w2,w3……wn;
①首先把 n 个叶子结点看做 n 棵树(仅有一个结点的二叉树)。把它们看做一个森林。
②在森林中把权值最小和次小的两棵树合并成一棵树。该树根结点的权值是两棵子树权值之和。
这时森林中还有 n-1 棵树。
③反复第②步直到森林中仅仅有一棵为止。此树就是哈夫曼树。
现给一组 (n=4) 详细的权值: 2 , 4 , 5 。 8 ,下边是构造详细过程:
n 个叶子构成的哈夫曼树其带权路径长度是唯一的。但树形是不唯一的。由于将森林中两棵权值最小和次小的子棵合并时,哪棵做左子树,哪棵做右子树并不严格限制。
三、 哈夫曼树的应用
a) 哈夫曼编码
利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每一个叶子节点都有一条路径,对路径上的各分支约定指向左子树的分支表示”0”码,指向右子树的分支表示“1”码。取每条路径上的“0”或“1”的序列作为各个叶子节点相应的字符编码,即是哈夫曼编码。
当中A,B,C,D相应的哈夫曼编码分别为:111。10,110。0
b) 二路归并排序
如果如今有n个已经排序的文件{d1,d2,….dn}。每一个文件包括的记录个数相应是{w1,w2,w3…..wn};能够採用两两合并的方法,把所有文件的记录合并到一个大文件里,使得这个文件里的记录所有排序。
问:採用什么合并次序才干使移动个数最少?
答:依照哈夫曼树的结构从外部结点到根节点逐层进行合并,一定是一种最佳的合并顺序。
四、 哈夫曼树的代码实现
public class Huffman {
public static void main(String[] args){
Huffman huffman = new Huffman();
int[] a = {2,3,5,7,11,13,17,19,23,29,31,37,41};
System.out.println(a.length);
HfTree tree = huffman.createHfTree(a.length , a);
System.out.println("ht ww parent lchild rchild ");
for(int i=0;i<tree.node.length;i++){
System.out.println(i +" "+ tree.node[i].ww +" "+ tree.node[i].parent +" "+ tree.node[i].lchild +" "+ tree.node[i].rchild);
}
}
private static int MAXINT=10000;
public HfTree createHfTree(int m , int a[]){
HfTree hfTree = new HfTree(m);
/*初始化哈夫曼树*/
for(int i=0;i<2*m-1;i++){
hfTree.node[i].lchild = -1;
hfTree.node[i].rchild = -1;
hfTree.node[i].parent = -1;
if(i<m){
hfTree.node[i].ww = a[i];
}
}
/*開始生成哈夫曼树*/
for(int i=0; i<m-1;i++){
int x1 = 0;
int x2 = 0;
int m1 = MAXINT;
int m2 = MAXINT;
for(int j=0; j<m+i;j++){
if(hfTree.node[j].ww < m1 && hfTree.node[j].parent == -1){
m2 = m1;
x2 = x1;
m1 = hfTree.node[j].ww;
x1 = j;
}
else if(hfTree.node[j].ww < m2 && hfTree.node[j].parent == -1){
m2 = hfTree.node[j].ww;
x2 = j;
}
}
hfTree.node[x1].parent = m+i;
hfTree.node[x2].parent = m+i;
hfTree.node[m+i].ww = m1+m2;
hfTree.node[m+i].lchild = x1;
hfTree.node[m+i].rchild = x2;
}
hfTree.root = 2*m-2;
return hfTree;
}
}
class HfNode{
public int ww;
public int parent;
public int lchild;
public int rchild;
}
class HfTree{
public HfNode[] node;
public int root;
public int m;
HfTree(int m){
this.m = m;
this.node = new HfNode[2*m-1];
//初始化对象数组是必须每一个对象都创建
for(int i=0;i<2*m-1;i++){
node[i] = new HfNode();
}
}
}
哈夫曼树的介绍 ---java实现的更多相关文章
- 哈夫曼树(三)之 Java详解
前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...
- (哈夫曼树)HuffmanTree的java实现
参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...
- Java数据结构(十二)—— 霍夫曼树及霍夫曼编码
霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...
- java实现哈夫曼树进行文件加解压
目录 1.哈夫曼树简述 2.构造树的节点 3.构造哈夫曼树的类(压缩) 4.构造哈夫曼树的类(解压) 5.整体工程文件(包括测试类) 6.结果 7.参考链接 1.哈夫曼树简述 给定n个权值作为n个叶子 ...
- Java实现WUST 1002: 哈夫曼树
[问题描述] 根据给定的若干权值可以构造出一颗哈夫曼树.构造的哈夫曼树可能不唯一,但是按照下面的选取原则所构造出来的哈夫曼树应该是唯一的. (1)每次选取优先级最低的两个结点,优先级最低的作为左子树, ...
- 哈夫曼树(一)之 C语言详解
本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...
- 哈夫曼树(二)之 C++详解
上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...
- 哈夫曼树——c++
哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这个定 ...
- 数据结构-哈夫曼树(python实现)
好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...
随机推荐
- mysql简单备份脚本
#!/bin/bash #army.han #2016-11-11 #new_gj_DBbackup#备份路径配置 GSdir='/data/dbbackup/mysqlDB' TIME=`date ...
- linux 配置全局jdk环境
1.在usr/local下新建software文件夹(mkdir software),将下载的jdk和tomcat放在此文件夹下 2.解压 tar -xzvf jdk-8u191-linux-x64. ...
- Expression表达式树(C#)
Lambda表达式: 1.下面举例通过Lambda表达式创建了一个用于验证Name的Func委托. //通过Lambda表达式创建一个对象的Name属性验证委托 Func<SearchInfo, ...
- 深入理解Core Data
留给我这忘事精看 Core Data 是什么? 大概八年前,2005年的四月份,Apple 公布了 OS X 10.4,正是在这个版本号中 Core Data 框架公布了.那个时候 YouTube 也 ...
- windows下搭建hadoop-2.6.0本地idea开发环境
概述 本文记录windows下hadoop本地开发环境的搭建: OS:windows hadoop执行模式:独立模式 安装包结构: Hadoop-2.6.0-Windows.zip - cygwinI ...
- 新辰:十种外链终极方法 让SEOer外链之路不再孤独!
大家都知道,外链就是指从别的站点导入到自己站点的链接.导入链接对于新辰站点优化来说是很重要的一个过程.因此,新辰觉得.对于中小型站点来说.外链但是优化的重中之重! 由于也有了"外链专员&qu ...
- es6 -- 透彻掌握Promise的使用,读这篇就够了
Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. 在实际的使用当中,有非常多的应用场景我们不能 ...
- Solr 定义
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- django框架初探
django框架初探 1.web框架介绍 web框架本质是一个socket服务端.每一个端口只能被一个程序监听. web程序分为两个部分: 服务器程序:对socket服务器封装,解析http请求,发送 ...
- 【Hello 2018 C】Party Lemonade
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出凑够2^j最少需要花费多少钱. 即试着把第i种物品买2^(j-i)个,看看会不会更便宜 记录在huafei[0..31]中 然 ...