实现Huffman树

原创 2016年08月30日 11:13:10

为了使得WPL即带权的外部结点路径最小,基本原则是:让权值大的结点离根近一些,权值小的结点离根远一些。实现方法:每次从未加入到树中的结点中选择两个权值最小的,即去权值最小和次小的结点作为左右子结点产生父结点,父结点的权值为这两个结点的权值之和,然后将父结点取代这两个结点带回去,继续循环。用数组作为存储结构。假定给定的外部结点权值数组中有m个元素,即有m个外部结点,那么内部结点就应该有m - 1个,创建一个容量为2 * m - 1的数组存放所有的结点,先用外部结点的权值初始化数组的前m个元素,然后循环填充后面的m - 1个元素,每次都是从第i个位置的前面查找没有加入树的最小和次小结点,形成一个新的结点,作为它们的父结点作为第m + i个结点元素。最后,设置根结点便可以得到这棵Huffman树。

直接上代码:

import java.util.LinkedList;
import java.util.Queue;


class HuffmanNode { //哈弗曼树中结点的数据结构
int w; //保存每个结点的权值

HuffmanNode left;
HuffmanNode right;
HuffmanNode parent;

public HuffmanNode(int w) {
this.w = w;
this.left = null;
this.right = null;
this.parent = null;
}
}


class HuffmanTree {
HuffmanNode root;
int n;

public HuffmanTree(int wA[]) {
int m = wA.length;
this.n = 2 * m - 1;
HuffmanNode hnA[] = new HuffmanNode[n];

for(int i = 0; i < m; i++) {
hnA[i] = new HuffmanNode(wA[i]); //初始化前m个结点
}

int min, scMin, i_min, i_scMin; //用来保存权值最小和次小的结点的权值和下标
for(int i = 0; i < m - 1; i++) {
min = scMin = Integer.MAX_VALUE; i_min = i_scMin = 0;
for(int j = 0; j < m + i; j++) { //每次从数组中第一个元素开始当前位置的前一个元素中进行查找
if(hnA[j].parent == null) {//这里的hnA[j].parent == null代表在未加入到树中的结点中查找

/*

*这里用到了一个时间复杂度为o(n)的查找最小元素和次小元素的技巧:如果当前元素比当前最小值小,那么更新次小值为当前最小值,最小值为当前值,否 *则,再与当前次小值进行比较,如果比次小值小,则更新次小值为当前元素。

*/
if(hnA[j].w < min) {
scMin = min;
i_scMin = i_min;
min = hnA[j].w;
i_min = j;
}
else {
if(hnA[j].w < scMin) {
scMin = hnA[j].w;
i_scMin = j;
}
}
}
}
hnA[m + i] = new HuffmanNode(min + scMin);
hnA[m + i].left = hnA[i_min];
hnA[m + i].right = hnA[i_scMin];
hnA[i_min].parent = hnA[i_scMin].parent = hnA[m + i];
}

root = hnA[n - 1];
}

public void print() {//这里实现了二叉树的层次换行打印,基本思想就是设置两个代表当前层和下一层结点数目的变量。
if(root == null)
return;
Queue<HuffmanNode> queue = new LinkedList<HuffmanNode>();

queue.offer(root);
HuffmanNode p;
int currNodes = 1, nextNodes = 0;
while(!queue.isEmpty()) {
p = queue.poll();
System.out.print(p.w + "\t");
currNodes--;

if(p.left != null) {
queue.offer(p.left);
nextNodes++;
}

if(p.right != null) {
queue.offer(p.right);
nextNodes++;
}

if(currNodes == 0) {//先统计下一层,再判断
System.out.println();
currNodes = nextNodes;
nextNodes = 0;
}
}
}
}


public class TestHuffmanTree {


public static void main(String[] args) {
int wA[] = {2,3,5,7,11,13,17,19,23,29,31,37,41};
HuffmanTree ht = new HuffmanTree(wA);
ht.print();
}


}

版权声明:本文为博主原创文章,未经博主允许不得转载。

【C++】Huffman树的实现

介绍huffman树之前我们先来看下如下几个基本概念 1、路径和路径长度 路径:我们定义从A节点到B节点所经过的分支序列称为从A节点到B节点的路径。 路径长度:路径中分支的数目称为路径长度。若规...
  • ArchyLi
  • ArchyLi
  • 2017年05月21日 23:48
  • 632

Huffman树及JAVA实现

一、概念 哈夫曼(Huffman)树又被称为最优二叉树,是一类带权路径长度最短的数 例子:有4个权值(1,3,5,7),利用这4个权值作为叶子结点构造二叉树 在图示的三个二叉树中: w...
  • beautiful_face
  • beautiful_face
  • 2017年04月08日 15:00
  • 578

【数据结构与算法】Huffman树&&Huffman编码(附完整源码)

赫夫曼树(Huffman Tree),又称最优二叉树,是一类带权路径长度最短的树。假设有n个权值{w1,w2,...,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,...
  • mmc_maodun
  • mmc_maodun
  • 2014年02月15日 00:27
  • 23613

最小堆应用---用最小堆实现huffman树

#include"MinHeap.h"template class HuffmanTree;template class TreeNode{ friend class HuffmanTree; pri...
  • fuliangliang
  • fuliangliang
  • 2006年05月29日 23:29
  • 1625

Huffman树及编码C++实现

Huffman树及编码C++实现                                         By qianghaohao(Johar)                    H...
  • qianghaohao
  • qianghaohao
  • 2016年05月19日 22:54
  • 2119

数据结构和算法——Huffman树和Huffman编码

Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领域有着广泛的应用。在word2vec模型中,在构建层次Softmax的过程中,也使用到了...
  • google19890102
  • google19890102
  • 2017年02月04日 15:43
  • 1827

huffman编码实现(详细实现)

1、概述      huffman编码是一种可变长编码(  VLC:variable length coding))方式,于1952年由huffman提出。依据字符在需要编码文件中出现的概率提供...
  • Qyee16
  • Qyee16
  • 2011年08月05日 22:48
  • 32500

[C++]数据结构:使用最小堆创建霍夫曼编码树HuffmanTree的过程

二话不多说,首先我们先来看个霍夫曼编码树的栗子。 假设我们想要压缩的是这个字符串: “beep boop beer!” 首先统计它们的出现次数,得到下面这张表: 然后根据出现的频率依次排序,放在一...
  • wxg694175346
  • wxg694175346
  • 2012年12月16日 13:01
  • 4972

自己动手写word2vec (三):构建Huffman树

这一部分将解释Huffman树的构造方法,并说明了如何根据Huffman树来产生对应的二进制编码。这部分的代码放在HuffmanTree.py中Huffman树的构造Huffman树的构造方法与Huf...
  • u014595019
  • u014595019
  • 2016年07月16日 17:38
  • 8928

哈夫曼树及python实现

最近在看《tensorflow实战》中关于RNN一节,里面关于word2vec中涉及到了哈夫曼树,因此在查看了很多博客(文末)介绍后,按自己的理解对概念进行了整理(拼凑了下TXT..),最后自己用py...
  • lzq20115395
  • lzq20115395
  • 2017年12月26日 21:45
  • 57
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现Huffman树
举报原因:
原因补充:

(最多只允许输入30个字)