文章
6
粉丝
0
获赞
29
访问
655
注意点:
思路:定义 priority_queue ,修改为小顶堆,遍历字符,map记录不同字的出现次数(权重),权重输入到 queue中,其中非叶节点的和,就是哈夫曼编码的长度。
推导: AAAAABCD = 5 1 1 1 = 1 1 1 5, (1 + 1) * 3 + 1 * 2 + 5 = 13 = 2 + 3 + 8 。 即非叶节点累加和 = WPL = 叶节点 * 对应路径长度的累加和。
注意当只有一种字符时,例如 AAAAAAA,则硬编码为 0 或者 1 都可以,即只占用了 1个bit,相比 ASCII 的 8bit ,压缩率是 8.0
prioirty_queue 默认是大顶堆,需要重新定义。
注意 queue 的容量,不要在为空时候 pop,这时可能在本地运行没问题,但是 OJ 会溢出。
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
while(cin >> s){
if(s == "END") continue;
int rawSize = s.size() * 8;
int encSize = 0;
map<char,int> leaf;
priority_queue<int, vector<int>, greater<int>> que; // 小顶堆
for(char a: s){
leaf[a]++;
}
for(auto a: leaf){
que.push(a.second);
}
while(que.size() > 1){
int num1 = que.top();
que.pop();
int num...
登录后发布评论
暂无评论,来抢沙发