贪心算法求哈夫曼编码C++
时间: 2023-11-10 08:04:20 浏览: 117
哈夫曼编码是一种可变长度编码,用于无损数据压缩。贪心算法可以用来求解哈夫曼编码。具体步骤如下:
1. 统计每个字符出现的频率,并将它们存储在一个数组中。
2. 创建一个最小堆,并将所有的字符节点插入其中。每个节点包含一个字符和它的频率。
3. 从最小堆中取出两个频率最小的节点,合并它们,并将新节点插入回最小堆中。新节点的频率为两个旧节点的频率之和。
4. 重复步骤3,直到最小堆中只剩下一个节点为止。这个节点就是哈夫曼树的根节点。
5. 遍历哈夫曼树,给左子树编码为0,给右子树编码为1。从根节点开始,每当向左走一步就在编码末尾添加一个0,每当向右走一步就在编码末尾添加一个1。最终得到每个字符的哈夫曼编码。
以下是C++代码实现:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Node {
char ch;
int freq;
Node* left;
Node* right;
Node(char c, int f) : ch(c), freq(f), left(nullptr), right(nullptr) {}
};
struct Compare {
bool operator()(Node* a, Node* b) {
return a->freq > b->freq;
}
};
void encode(Node* root, string code, vector<string>& codes) {
if (!root) return;
if (root->ch != '#') codes[root->ch] = code;
encode(root->left, code + "0", codes);
encode(root->right, code + "1", codes);
}
vector<string> huffman(vector<int>& freqs) {
priority_queue<Node*, vector<Node*>, Compare> pq;
for (int i = 0; i < freqs.size(); i++) {
if (freqs[i] > 0) {
pq.push(new Node(i, freqs[i]));
}
}
while (pq.size() > 1) {
Node* left = pq.top(); pq.pop();
Node* right = pq.top(); pq.pop();
Node* parent = new Node('#', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
vector<string> codes(256);
encode(pq.top(), "", codes);
return codes;
}
int main() {
string s = "hello world";
vector<int> freqs(256, 0);
for (char c : s) freqs[c]++;
vector<string> codes = huffman(freqs);
for (int i = 0; i < 256; i++) {
if (freqs[i] > 0) {
cout << (char)i << ": " << codes[i] << endl;
}
}
return 0;
}
```
阅读全文