用优先队列的huffman编码实现
2017-08-23 19:39
399 查看
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
struct huffman{
int num;
int weight;
string s="";
int parent;
int lchild;
int rchild;
huffman(){
}
huffman(int nu,int w,string ss,int p,int l,int r){
num=nu;
weight=w;
s=ss;
parent=p;
lchild=l;
rchild=r;
}
bool friend operator<(huffman a,huffman b){
return a.weight>b.weight;
}
};
huffman tree[100];
priority_queue<huffman>q;
void huffcode(huffman &t){
if(t.lchild!=-1){
tree[t.lchild].s=t.s+'0';
tree[t.rchild].s=t.s+'1';
huffcode(tree[t.lchild]);
huffcode(tree[t.rchild]);
}else
return;
}
main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>tree[i].weight;
tree[i].num=i;
tree[i].parent=tree[i].lchild=tree[i].rchild=-1;
q.push(tree[i]);
}
for(int i=n;i<=2*n-2;i++){
huffman s1=q.top();
q.pop();
huffman s2=q.top();
q.pop();
huffman s3(i,s1.weight+s2.weight,"",-1,s1.num,s2.num);
q.push(s3);
tree[i]=s3;
tree[s1.num].parent=tree[s2.num].parent=i;
}
huffcode(tree[2*n-2]);
for(int i=0;i<n;i++)
cout<<tree[i].s<<" ";
return 0;
}
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
struct huffman{
int num;
int weight;
string s="";
int parent;
int lchild;
int rchild;
huffman(){
}
huffman(int nu,int w,string ss,int p,int l,int r){
num=nu;
weight=w;
s=ss;
parent=p;
lchild=l;
rchild=r;
}
bool friend operator<(huffman a,huffman b){
return a.weight>b.weight;
}
};
huffman tree[100];
priority_queue<huffman>q;
void huffcode(huffman &t){
if(t.lchild!=-1){
tree[t.lchild].s=t.s+'0';
tree[t.rchild].s=t.s+'1';
huffcode(tree[t.lchild]);
huffcode(tree[t.rchild]);
}else
return;
}
main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>tree[i].weight;
tree[i].num=i;
tree[i].parent=tree[i].lchild=tree[i].rchild=-1;
q.push(tree[i]);
}
for(int i=n;i<=2*n-2;i++){
huffman s1=q.top();
q.pop();
huffman s2=q.top();
q.pop();
huffman s3(i,s1.weight+s2.weight,"",-1,s1.num,s2.num);
q.push(s3);
tree[i]=s3;
tree[s1.num].parent=tree[s2.num].parent=i;
}
huffcode(tree[2*n-2]);
for(int i=0;i<n;i++)
cout<<tree[i].s<<" ";
return 0;
}
相关文章推荐
- Huffman编码的贪心实现,使用优先队列
- 优先队列实现 大小根堆 解决top k 问题
- 优先队列之左式堆(JAVA实现)
- 数据结构实现之最大索引优先队列
- 优先队列--C语言实现与Java例子
- 基于算法导论6.5用最大堆实现的优先队列(C++)
- 用二叉堆实现优先队列
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
- 二叉堆实现优先队列中的上滤和下滤
- 基于堆的优先队列实现
- 优先队列实现原理分析
- 用 C# 实现优先队列
- 优先队列(C++实现)
- Dijkstra算法-(迪杰斯特拉)算法的迭代实现与优先队列实现 图解算法过程
- PriorityBlockingQueue优先队列的二叉堆实现
- C++非递归队列实现二叉树的广度优先遍历
- poj3125(优先队列数组实现)
- 堆和优先队列的实现
- 优先队列PriorityQueue实现 大小根堆 解决top k 问题
- 最大堆及优先队列的实现