哈夫曼编码 输入一行字符串,由长度不超过255个字符的小写英文字母组成要求输出有若干行,每行由两部分组成,一个字母和该字母出现的频率,频率按高到低排序,频率相同则按asc码的先后顺序排列
时间: 2024-02-22 07:59:02 浏览: 182
用哈夫曼编码统计一段英文中字母的频率
5星 · 资源好评率100%
好的,这是一个典型的哈夫曼编码问题。下面是一个C++的实现示例:
```c++
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct node{
int freq;
char ch;
node *left, *right;
node(){
freq = 0;
ch = '\0';
left = right = NULL;
}
node(int _freq, char _ch){
freq = _freq;
ch = _ch;
left = right = NULL;
}
};
struct cmp{
bool operator() (node* a, node* b){
if (a->freq != b->freq) return a->freq > b->freq;
return a->ch > b->ch;
}
};
void print_code(node* root, string s){
if (root->ch != '\0') {
cout << root->ch << " " << s << endl;
return;
}
if (root->left != NULL) print_code(root->left, s + "0");
if (root->right != NULL) print_code(root->right, s + "1");
}
int main(){
string s;
getline(cin, s);
int cnt[26] = {0};
for (int i = 0; i < s.length(); i++){
cnt[s[i] - 'a']++;
}
priority_queue<node*, vector<node*>, cmp> pq;
for (int i = 0; i < 26; i++){
if (cnt[i]){
node* tmp = new node(cnt[i], 'a' + i);
pq.push(tmp);
}
}
while (pq.size() > 1){
node* a = pq.top();
pq.pop();
node* b = pq.top();
pq.pop();
node* tmp = new node(a->freq + b->freq, '\0');
tmp->left = a;
tmp->right = b;
pq.push(tmp);
}
node* root = pq.top();
print_code(root, "");
return 0;
}
```
上述代码中,我们首先统计了输入字符串中每个小写字母出现的频率,然后使用优先队列(最小堆)来构建哈夫曼树。最后,我们使用递归的方式输出每个叶子节点对应的哈夫曼编码。请注意,本题中要求按照频率的高低和字母的先后顺序排序,因此我们在优先队列的比较函数中进行了处理。
阅读全文