题目
-
题目要求
- n n n 种字符的字符串
- 每种字符出现次数为 a i a_i ai
- 求哈夫曼编码后的最短长度
-
哈夫曼编码原理
- 出现频率高的字符用短编码
- 出现频率低的字符用长编码
- 构建二叉树来得到编码
解题思路
-
核心算法
1. 每次选择两个最小的频率合并 2. 合并后的频率为两者之和 3. 重复此过程直到只剩一个节点 4. 每次合并会使编码长度增加两个数的和 -
使用优先队列
- 维护一个最小堆
- 每次取出两个最小值
- 将和放回堆中
代码
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n;
cin >> n;
// 使用优先队列(最小堆)
priority_queue<long long, vector<long long>, greater<long long>> pq;
// 读入频率
for(int i = 0; i < n; i++) {
long long x;
cin >> x;
pq.push(x);
}
long long result =

最低0.47元/天 解锁文章
4933

被折叠的 条评论
为什么被折叠?



