赫夫曼编码信息论,c或者c++实现
时间: 2023-12-13 10:10:17 浏览: 94
基于c++实现哈夫曼编码
赫夫曼编码是一种基于编码概率的算法,可以用于数据压缩和信息传输等方面。下面是一个简单的 C++ 实现示例:
```cpp
#include <iostream>
#include <queue>
#include <vector>
#include <unordered_map>
using namespace std;
struct Node {
char ch;
int freq;
Node *left, *right;
Node(char ch, int freq) : ch(ch), freq(freq), left(nullptr), right(nullptr) {}
~Node() {
delete left;
delete right;
}
};
struct Compare {
bool operator()(const Node* a, const Node* b) const {
return a->freq > b->freq;
}
};
Node* buildHuffmanTree(const unordered_map<char, int>& freqMap) {
priority_queue<Node*, vector<Node*>, Compare> pq;
for (auto& p : freqMap) {
pq.push(new Node(p.first, p.second));
}
while (pq.size() > 1) {
Node *left = pq.top(); pq.pop();
Node *right = pq.top(); pq.pop();
Node *parent = new Node('\0', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
void encodeHuffmanTree(Node* root, string code, unordered_map<char, string>& codeMap) {
if (!root) return;
if (root->left == nullptr && root->right == nullptr) {
codeMap[root->ch] = code;
}
encodeHuffmanTree(root->left, code + '0', codeMap);
encodeHuffmanTree(root->right, code + '1', codeMap);
}
void encode(const string& str, const unordered_map<char, string>& codeMap) {
cout << "Encoded message: ";
for (char ch : str) {
cout << codeMap.at(ch);
}
cout << endl;
}
int main() {
string message = "hello world";
unordered_map<char, int> freqMap;
for (char ch : message) {
freqMap[ch]++;
}
Node* root = buildHuffmanTree(freqMap);
unordered_map<char, string> codeMap;
encodeHuffmanTree(root, "", codeMap);
encode(message, codeMap);
delete root;
return 0;
}
```
在这个示例中,首先使用 `unordered_map` 统计了输入字符串中每个字符出现的频率。然后使用一个最小堆来构建赫夫曼树,每次从堆中取出两个频率最小的节点合并成一个新的节点,直到堆中只剩下一个节点为止。接着遍历赫夫曼树,对于每个叶子节点记录下该字符的编码,最终得到一个字符到编码的映射。最后使用该映射对输入字符串进行编码输出。
阅读全文