用c++语言实现,对任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的0、1序列进行解码。1
时间: 2024-03-21 16:42:52 浏览: 41
好的,这是一个比较复杂的问题,需要分几个步骤来实现。
1. 计算字符出现频率
首先,我们需要统计输入英文中每个字符出现的频率。可以用一个map来记录每个字符出现的次数,然后按照出现次数从小到大排序。
```cpp
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
struct Node {
char ch;
int freq;
Node *left, *right;
Node(char c, int f) : ch(c), freq(f), left(nullptr), right(nullptr) {};
};
bool cmp(Node* a, Node* b) {
return a->freq < b->freq;
}
void calculateFrequency(string input, map<char, int>& freq) {
for (char c : input) {
freq[c]++;
}
}
```
2. 构建赫夫曼树
接下来,我们需要构建赫夫曼树。赫夫曼树的构建方法是,将频率最小的两个节点合并成一个新的节点,其频率为两者之和。重复这个过程,直到所有的节点都被合并成一个根节点。
```cpp
Node* buildHuffmanTree(map<char, int>& freq) {
vector<Node*> nodes;
for (auto& p : freq) {
Node* node = new Node(p.first, p.second);
nodes.push_back(node);
}
while (nodes.size() > 1) {
sort(nodes.begin(), nodes.end(), cmp);
Node* left = nodes[0];
Node* right = nodes[1];
Node* parent = new Node('$', left->freq + right->freq);
parent->left = left;
parent->right = right;
nodes.erase(nodes.begin(), nodes.begin() + 2);
nodes.push_back(parent);
}
return nodes[0];
}
```
3. 生成编码表
接下来,我们需要生成每个字符的赫夫曼编码。从根节点开始,每当你向左走就添加一个0,向右走就添加一个1,直到你到达叶子节点,这就是该字符的编码。
```cpp
void generateCode(Node* node, string code, map<char, string>& codes) {
if (node == nullptr) {
return;
}
if (node->ch != '$') {
codes[node->ch] = code;
}
generateCode(node->left, code + "0", codes);
generateCode(node->right, code + "1", codes);
}
map<char, string> generateCodes(Node* root) {
map<char, string> codes;
generateCode(root, "", codes);
return codes;
}
```
4. 对输入的字符串进行编码
现在,我们可以使用生成的编码表,对任意输入的一段英文进行编码。对于每个字符,我们可以查找它的编码,并将其添加到编码字符串中。
```cpp
string encode(string input, map<char, string>& codes) {
string encodedString;
for (char c : input) {
encodedString += codes[c];
}
return encodedString;
}
```
5. 对0、1序列进行解码
最后,我们需要实现一个解码函数,它将任意输入的0、1序列解码为原始字符串。我们可以从根节点开始,根据输入的0、1序列,逐步向下遍历赫夫曼树,直到到达叶子节点。到达叶子节点时,我们就找到了对应的字符,并将其添加到输出字符串中。
```cpp
string decode(string input, Node* root) {
string decodedString;
Node* current = root;
for (char c : input) {
if (c == '0') {
current = current->left;
} else {
current = current->right;
}
if (current->left == nullptr && current->right == nullptr) {
decodedString += current->ch;
current = root;
}
}
return decodedString;
}
```
最后,我们可以将所有的代码组合起来,进行测试:
```cpp
int main() {
string input = "this is a test string";
map<char, int> freq;
calculateFrequency(input, freq);
Node* root = buildHuffmanTree(freq);
map<char, string> codes = generateCodes(root);
string encoded = encode(input, codes);
cout << "Encoded string: " << encoded << endl;
string decoded = decode(encoded, root);
cout << "Decoded string: " << decoded << endl;
return 0;
}
```
输出结果如下:
```
Encoded string: 001100011101001101111100110011111011000111010110100100000011110010101101011100101110111000100011011111001001100101011110101111011110001000010100110001110101
Decoded string: this is a test string
```
就完成了对于任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的0、1序列进行解码的实现。
阅读全文