Huffman编码的贪心实现,使用优先队列

#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct  node
{
    int lchild;
    int rchild;
    int freq;
    string str;
    friend bool operator<(node n1,node n2){
        return n1.freq>n2.freq;  //从小到大排序
    }
}a[10];
int main(){
    priority_queue<node> q;
    int n;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>a[i].freq;
            a[i].lchild=NULL;
            a[i].rchild=NULL;
            q.push(a[i]);
        }
        for(int i=1;i<n;i++){
        node z;
        z.lchild=q.top().freq;
        q.pop();
        z.rchild=q.top().freq;
        q.pop();
        z.freq=z.lchild+z.rchild;
        q.push(z);
        }

        while(!q.empty()){
            cout<<q.top().freq<<endl;
            q.pop();
        }

    }

    return 0;
}
时间: 2024-10-12 16:22:20

Huffman编码的贪心实现,使用优先队列的相关文章

UVa10954 Add All (Huffman编码,优先队列)

链接:http://vjudge.net/problem/UVA-10954 分析:Huffman编码建立过程,每次贪心选取两个当前最小数,从集合中删去,然后把它们的和放回集合,用优先队列去模拟集合而且可以优化取最小数过程. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 const int maxm = 500 + 5; 7 8 int

【uva 10954】Add All(算法效率+Huffman编码+优先队列)

题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两棵合并前树的根权值和(也与Huffman编码的建立过程类似,选权值最小的两棵树). 这样总开销就是除了叶子结点的权值和  => 每个叶子结点的权值*层数(根节点层数为0)之和  => WPL(树的所有叶子节点的带权路径长度之和,即该节点到根节点路径长度与节点上权的乘积之和). 而Huffman树就

Huffman编码学习笔记

主要是在学算导,觉得算导译到中国真是中国人民的福音. 一.编码 编码就是选择有意义的01串,令其首尾相接组成文本.我们并非可以随便挑选01串,原因在于它们是首尾相接的,这为我们识别造成了一些困难.比如说我们不能在文本000000中分清字符00与000. 一般我们使用的方式是定长字符:但更好的方式是前缀码,算导中写道"虽然我们这里不会证明,但与任何字符编码相比,前缀码确实可以保证达到最优数据压缩率.",这显然是一个flag,将来一定会有比前缀码更好的编码方式的. 二.Huffman编码便

基于Huffman编码的压缩软件的Python实现

哈夫曼编码是利用贪心算法进行文本压缩的算法,其算法思想是首先统计文件中各字符出现的次数,保存到数组中,然后将各字符按照次数升序排序,挑选次数最小的两个元素进行连结形成子树,子树的次数等于两节点的次数之和,接着把两个元素从数组删除,将子树放入数组,重新排序,重复以上步骤.为了解压,在压缩时首先往文件中填入huffman编码的映射表的长度,该表的序列化字符串,编码字符串分组后最后一组的长度(编码后字符串长度模上分组长度),最后再填充编码后的字符串.本算法中以一个字节,8位作为分组长度,将编码后二进制

Huffman编码

Huffman编码用来解决最小二叉树问题... 用堆来维护,所用用优先队列(稍微修改一下放入方式)每次将两个权值最小的取出来,然后把他们的和再放进去,重复这个操作就可以解决了 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 typedef long long ll; 5 6 int main(){ 7 priority_queue<int>que; 8 int n, x; 9 cin>

Huffman编码之文件的解/压缩

问题描述:           生活中文件压缩技术可谓随处可见,在数据的密集型传输中文件压缩是一项重要的实用性技术.例如:较大文件的下载,传输等.常见的文件压缩工具有winRAR,2345好压,快压(KuaiZip)等,这些工具已经开发的相当牛逼,但是作为入门级的程序员来说,不能只停留在观摩的立场上,扮演使用者的角色.有必要深入了解其底层的基础实现方式,掌握基础的文件压缩原理,所以在此将其视为一个小型项目列出,以供大家交流探讨,相互学习.... ★在此之前,先来说说什么是文件压缩,用以抛出一个基

Huffman编码——Java实现

Huffman编码 是一种编码方式,常用于无损压缩.本文只介绍用Java语言来实现该编码方式的算法和数据结构. Huffman编码的核心在于构建一颗最优化的二叉树,首先要得到一个原数据编码中的[编码:频率]的列表,然后根据列表构建二叉树,最后对二叉树编码. 第一步: 计算出每个词(编码)出现的频次,并输出到一个列表 例如字符串:"this is an example of a huffman tree", 它的二进制编码是11101001101000110100111100111000

算法导论之--------------Huffman编码

学习Huffman编码最大的收获是学会了STL中优先队列的使用以及在使用的时候要注意的问题:在使用自定义数据类型的时候,优先队列要重载自己的比较操作符. 关于Huffman树怎么讲解请看算法导论讲解,原理真的很简单,不过要写出完整的代码难点就在于优先队列的使用.不废话了啊,再次强调,想把原理弄清楚,请看算法导论,树上的讲解比网上什么垃圾讲解不知道清晰多少,一看就懂.-----------------终于可以上代码了. //在优先级队列中存入指针类型的节点 #include<iostream>

【POJ1521】【HDU1053】Entropy 哈夫曼(Huffman)编码

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43020921"); } 题意: 输出字符串的长度*8.huffman编码长度.两者比值. 题解: huffman编码: 我们发现对于一个字符串,如果我们把它变成01串,比如ABCDE 那么我们需要 A : 000 B : 001 C : 010 D