文章

6

粉丝

0

获赞

29

访问

655

头像
哈夫曼编码 题解:非叶节点累加和 = WPL
P1562
发布于2026年2月13日 11:07
阅读数 36

注意点:

  1. 思路:定义 priority_queue ,修改为小顶堆,遍历字符,map记录不同字的出现次数(权重),权重输入到 queue中,其中非叶节点的和,就是哈夫曼编码的长度。

    1. 推导: AAAAABCD = 5 1 1 1 = 1 1 1 5, (1 + 1) * 3 + 1 * 2 + 5 = 13 = 2 + 3 + 8 。 即非叶节点累加和 = WPL = 叶节点 * 对应路径长度的累加和。

  2. 注意当只有一种字符时,例如 AAAAAAA,则硬编码为 0 或者 1 都可以,即只占用了 1个bit,相比 ASCII 的 8bit ,压缩率是 8.0

  3. prioirty_queue 默认是大顶堆,需要重新定义。

  4. 注意 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...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发