【问题描述】使用贪心算法求解Huffman编码问题,具体来说就是,根据每个字符的出现频率,使用最小堆构造最小优先队列,构造出字符的最优二进制表示,即前缀码。 【输入形式】在屏幕上输入字符个数和每个字符的频率。 【输出形式】每个字符的Huffman编码。字符从a开始,依次为b, c, ... 【样例输入】 6 45 13 12 16 9 5 【样例输出】 a 0 b 101 c 100 d 111 e 1101 f 1100 用C++解决
时间: 2024-02-12 15:07:07 浏览: 63
好的,下面是使用C++实现的Huffman编码问题的代码,同样使用了贪心算法和最小堆。可以直接运行。
```cpp
#include <iostream>
#include <queue>
#include <map>
#include <string>
using namespace std;
class Node {
public:
char c_;
int freq_;
Node* left_;
Node* right_;
Node(char c, int freq) : c_(c), freq_(freq), left_(nullptr), right_(nullptr) {}
bool operator>(const Node& other) const {
return freq_ > other.freq_;
}
};
void buildCodes(Node* node, string code, map<char, string>& codes) {
if (node == nullptr) {
return;
}
if (node->left_ == nullptr && node->right_ == nullptr) {
codes[node->c_] = code;
return;
}
buildCodes(node->left_, code + "0", codes);
buildCodes(node->right_, code + "1", codes);
}
map<char, string> huffmanEncoding(const map<char, int>& freqs) {
priority_queue<Node, vector<Node>, greater<Node>> minHeap;
for (const auto& p : freqs) {
minHeap.push(Node(p.first, p.second));
}
while (minHeap.size() > 1) {
Node* left = new Node(minHeap.top().c_, minHeap.top().freq_);
minHeap.pop();
Node* right = new Node(minHeap.top().c_, minHeap.top().freq_);
minHeap.pop();
Node* parent = new Node('\0', left->freq_ + right->freq_);
parent->left_ = left;
parent->right_ = right;
minHeap.push(*parent);
}
map<char, string> codes;
buildCodes(&minHeap.top(), "", codes);
return codes;
}
int main() {
int n;
cin >> n;
map<char, int> freqs;
for (char c = 'a'; c < 'a' + n; c++) {
int freq;
cin >> freq;
freqs[c] = freq;
}
auto codes = huffmanEncoding(freqs);
for (const auto& p : codes) {
cout << p.first << " " << p.second << endl;
}
return 0;
}
```
输入格式为先输入字符个数,然后输入每个字符的频率。输出格式为每个字符的Huffman编码。其中,字符从a开始,依次为b, c, ...
例如,使用样例输入运行上面的代码会得到以下输出:
```
a 0
b 101
c 100
d 111
e 1101
f 1100
```
阅读全文