使用优先队列实现Huffman树

 1 package com.mmall.common.Test;
 2
 3 import java.util.Comparator;
 4 import java.util.PriorityQueue;
 5 import java.util.Queue;
 6
 7 /**
 8  * Created by Workstation on 2017/8/9.
 9  */
10 public class HuffmanCode {
11
12    private class HuffNode implements Comparable<HuffNode>
13     {
14         HuffNode Left;
15         HuffNode Right;
16         int val;
17
18         public HuffNode (HuffNode left, HuffNode right, int val) {
19             Left = left;
20             Right = right;
21             this.val = val;
22         }
23
24         @Override
25         public int compareTo (HuffNode o) {
26             return this.val-o.val;
27         }
28     }
29
30
31
32
33     public void CreateHuffmanTree(int [] weight)
34     {
35         //创建一个优先的队列;其中的值按照最小堆方式创建
36         PriorityQueue<HuffNode> priorityQueue=new PriorityQueue<HuffNode> ();
37
38
39         for(int i=0;i<weight.length;i++)
40         {
41             HuffNode node=new HuffNode (null,null,weight[i]);
42             priorityQueue.add(node);
43         }
44
45         HuffNode node1=null;// 最小权值点
46         HuffNode node2=null;// 次最小权值点
47         HuffNode node3=null;//合并的值
48
49         for(int j=0;j<weight.length-1;j++)
50         {
51             node1=priorityQueue.poll ();
52             node2=priorityQueue.poll ();
53             node3=new HuffNode (node1,node2,node1.val+node2.val);
54             priorityQueue.offer(node3);
55         }
56
57         System.out.println(priorityQueue.peek ().val);
58     }
59 }
时间: 2024-10-05 16:49:25

使用优先队列实现Huffman树的相关文章

[ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)

Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25274   Accepted: 8131 Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000)

poj 3253 Fence Repair(模拟huffman树 + 优先队列)

题意:如果要切断一个长度为a的木条需要花费代价a, 问要切出要求的n个木条所需的最小代价. 思路:模拟huffman树,每次选取最小的两个数加入结果,再将这两个数的和加入队列. 注意priority_queue的用法,原型: 1 priority_queue<Type> q; 2 priority_queue<Type,deque<Type>,Comp> q; 其中Type是类型,Comp是比较结构体,比较函数是它的括号重载,比如对int型从小到大排序的Comp结构体如

NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树

抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了…… 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 922  Solved: 473[Submit][Status][Discuss] Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是

【NOI2015】荷马史诗[Huffman树+贪心]

#130. [NOI2015]荷马史诗 统计 描述 提交 自定义测试 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和<伊利亚特>组成的鸿篇巨制<荷马史诗>实在是太长了,Allison 想通过一种编码方式使得它变得短一些. 一部<荷马史诗>中有 nn 种不同的单词,从 11 到 nn 进行编号.其中第 ii 种单词出现的总

哈夫曼(Huffman)树与哈夫曼编码

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289610.html 哈夫曼树又称最优二叉树,是一种带权路径长最短的树.树的路径长度是从树根到每一个叶子之间的路径长度之和.节点的带树路径长度为从该节点到树根之间的路径长度与该节点权(比如字符在某串中的使用频率)的乘积. 比如有一串字符串如

堆(优先队列)求huffman WPL

huffman编码中WPL等于没个结点到根结点的距离乘结点权值的总和,但我们也可以用另一种方法求WPL:如果huffman树只有一个结点,则WPL为根结点权值,否则WPL等于除了根结点以外的所有结点的权值之和. 我们可以用优先队列/堆实现这个过程: 1 //用优先队列求huffman编码中的WPL 2 #include <iostream> 3 using std::cin; 4 using std::cout; 5 using std::endl; 6 using std::swap; 7

Huffman树与编码

带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = malloc(n*sizeof(BTreeNode)); for (i = 0; i < n; i++) { b[i] = malloc(sizeof(BTreeNode)); b[i]->data = a[i]; b[i]->left = NULL; b[i]->right = NU

数据结构之huffman树

#include <stdio.h> #include<stdlib.h> #define MAXBIT      99 #define MAXVALUE  9999 #define MAXLEAF     30 #define MAXNODE    MAXLEAF*2 -1 typedef struct  {     int bit[MAXBIT];     int start; } HCodeType;        /* 编码结构体 */ typedef struct {  

Huffman树的编码译码

上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffman树进行译码操作,程序最后输出译码后的结果 Huffman.h定义了树的结点信息,各种操作.GCC编译通过. 1 #ifndef HUFFMAN_H_INCLUDED 2 #define HUFFMAN_H_INCLUDED 3 #include <iostream> 4 #include <