已知一组包含至少8个字符的数组及各字符的出现概率(随机产生)。运用C+编写程序+求该字符串数组的哈夫曼编码及平均码长。
时间: 2024-09-26 18:11:54 浏览: 67
要在C++中计算给定字符串数组的哈夫曼编码以及平均码长,首先需要创建一个优先队列(堆),用于存储节点及其频率。接下来,按照频率对字符进行排序,然后进行构造哈夫曼树的过程。最后,遍历哈夫曼树生成编码,并计算平均码长。这里是一个简单的步骤概述:
```cpp
#include <iostream>
#include <queue>
#include <vector>
#include <string>
// 定义节点结构
struct Node {
char symbol;
int freq;
Node* left, *right;
};
// 插入操作
Node* insert(Node* root, const char& symbol, int freq) {
if (!root)
return new Node{symbol, freq, nullptr, nullptr};
if (freq < root->freq)
root->left = insert(root->left, symbol, freq);
else
root->right = insert(root->right, symbol, freq);
return root;
}
// 构建并返回哈夫曼树
Node* buildHuffmanTree(const std::vector<std::pair<char, int>>& freqs) {
// 初始化堆
priority_queue<std::pair<int, Node*>, std::vector<std::pair<int, Node*>>, std::greater<std::pair<int, Node*>>> pq(freqs.begin(), freqs.end());
while (pq.size() > 1) {
int freq1 = pq.top().first; pq.pop();
int freq2 = pq.top().first; pq.pop();
pq.push({freq1 + freq2, new Node{'', freq1 + freq2, pq.top().second, nullptr}});
pq.pop(); // 移除已合并节点
pq.push({freq1 + freq2, pq.top().second});
}
return pq.top().second;
}
// 计算哈夫曼编码
std::string getHuffmanCode(Node* root, const std::string& code = "") {
if (!root->left && !root->right) // 叶子节点,直接添加编码
return code + root->symbol;
if (root->left)
return getHuffmanCode(root->left, code + "0");
else
return getHuffmanCode(root->right, code + "1");
}
// 主函数,输入字符串数组和频率,生成哈夫曼编码并计算平均码长
void huffmanCoding(std::vector<std::pair<char, int>>& freqs, std::string& input) {
Node* root = buildHuffmanTree(freqs);
std::string code = getHuffmanCode(root);
// 统计编码并计算平均码长
int total_freq = 0;
for (const auto& pair : freqs) {
total_freq += pair.second;
std::cout << pair.first << ": " << code.substr(code.find(pair.first), 1) << ", Frequency: " << pair.second << std::endl;
}
double avg_code_length = (double)total_freq / freqs.size();
std::cout << "Average Code Length: " << avg_code_length << std::endl;
}
int main() {
// 输入示例
std::vector<std::pair<char, int>> freqs{{'a', 20}, {'b', 15}, {'c', 10}, {'d', 15}, {'e', 25}};
std::string input = "abacbede";
huffmanCoding(freqs, input);
return 0;
}
```
这个程序会在控制台打印出每个字符及其对应的哈夫曼编码和频率,同时计算并输出平均码长。注意这只是一个基本的实现,实际项目中可能还需要处理输入验证和错误处理。运行 `main` 函数即可看到结果。如果你有具体的字符数组和频率列表,可以直接替换 `freqs` 和 `input` 变量。
阅读全文