一、     什么是哈夫曼树

是一种带权路径长度最短的二叉树,也称最优二叉树

带权路径长度: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};能够採用两两合并的方法,把所有文件的记录合并到一个大文件里,使得这个文件里的记录所有排序。

问:採用什么合并次序才干使移动个数最少?

答:依照哈夫曼树的结构从外部结点到根节点逐层进行合并,一定是一种最佳的合并顺序。

 





四、      哈夫曼树的代码实现

用java实现的哈夫曼树
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实现的更多相关文章

  1. 哈夫曼树(三)之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  2. (哈夫曼树)HuffmanTree的java实现

    参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...

  3. Java数据结构(十二)—— 霍夫曼树及霍夫曼编码

    霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...

  4. java实现哈夫曼树进行文件加解压

    目录 1.哈夫曼树简述 2.构造树的节点 3.构造哈夫曼树的类(压缩) 4.构造哈夫曼树的类(解压) 5.整体工程文件(包括测试类) 6.结果 7.参考链接 1.哈夫曼树简述 给定n个权值作为n个叶子 ...

  5. Java实现WUST 1002: 哈夫曼树

    [问题描述] 根据给定的若干权值可以构造出一颗哈夫曼树.构造的哈夫曼树可能不唯一,但是按照下面的选取原则所构造出来的哈夫曼树应该是唯一的. (1)每次选取优先级最低的两个结点,优先级最低的作为左子树, ...

  6. 哈夫曼树(一)之 C语言详解

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  7. 哈夫曼树(二)之 C++详解

    上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...

  8. 哈夫曼树——c++

    哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这个定 ...

  9. 数据结构-哈夫曼树(python实现)

    好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...

随机推荐

  1. Cocos2d-x怎样控制动作速度

    基本动作和组合动作实现了针对精灵的各种运动和动画效果的改变.但这种改变速度匀速的.线性的.通过ActionEase及其的派生类和Speed 类我们能够使精灵以非匀速或非线性速度运动,这样看起了效果更加 ...

  2. 2011年度十大杰出IT博客获奖感言

        2011年度十大杰出IT博客获奖感言 在各位评委.网友的支持下,我的博客从前50名中脱颖而出跻身10强,得到这个消息之后心中充满了喜悦.在这里要感谢51CTO为大家提供这样一个良好的展示平台. ...

  3. ActionListener三种实现

    /** * Simple1.java - 处理事件的第一种方法 * 在这个例子中,利用一个ActionListener来监听事件源产生的事件 * 用一些if语句来决定是哪个事件源 */ import ...

  4. Activemq开启JMX及问题排查

    0.服务端开启JMX服务 一.修改${ ActiveMQ_HOME} /conf/activemq.xml文件 在<broker>标签中添加如下属性:useJMX="true&q ...

  5. centos6.5 数据库的安装

    mongo https://www.cnblogs.com/layezi/p/7290082.html

  6. 微信小程序从零开始开发步骤(一)搭建开发环境

    从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了. 1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: ...

  7. C++异常实现与longjmp, setjmp,栈指针EBP, Active Record

    这篇讲的不错: http://blog.csdn.net/smstong/article/details/50728022 首先Active Record 然后EBP,ESP等指针 2 通过setjm ...

  8. Install Docker Mac OS X

    检查 Mac OS version 要求必须是 OS X 10.6 Snow Leopard or newer to run Boot2Docker 安装 Boot2Docker 列表内容 下载地址: ...

  9. [Javascript] Classify JSON text data with machine learning in Natural

    In this lesson, we will learn how to train a Naive Bayes classifier and a Logistic Regression classi ...

  10. Service-监听手机来电

    public class MonitorPhone extends Activity { TelephonyManager tManager; @Override protected void onC ...