15.哈夫曼编/编译器
1、问题描述:(需求分析和背景意义)
利用哈夫曼编码进行通信可以大大提高信道利用率, 缩短信息传输时间, 降低传输成木。但是, 这是要求在发送端通过一个编码系统对待传数据预先编码, 在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。 试为这样的信息收发站写一个哈夫曼的编/译码系统。
2、基本要求:(设计阶段, 概要设计和详细设计)
一个完整的系统应该具有以下功能:
(1)l:初始化(Initialization)。从终端读入字符集大小n以及n个字符和n个权值, 建立哈夫曼树, 并将它存于文件hfmTree中。
(2) E 编码(Encoding).
利用建好的哈夫曼树(如不在内存, 则从文件 hfmTree中读入), 对文件ToBeTran中正文进行编码, 然后将结果存入文件CodeFile 中。
(3) D:译码(Decoding).
7
利用已建好的哈夫曼树将文件CodeFile 中的代码进行译码, 结果存入文件 TextFile 中.
(4)P 印代码文件(Print)。将文件CodeFile 以紧凑格式显示在终端上, 每行50个代码, 同时将此文字符形式的编码文件写入文件CodePrin中。
(5)T 印哈大曼树(Tree printing)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此文字符形式的哈夫曼树写入文件TreePrint中。
3、测试数据:
(1)利用教科书例6-2中的数据调试程序。
(2)用下表给出的字符集和额度的实际统计数据建立哈夫曼树, 并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORUTE”。
字符 A B C D E F G H 1 J K L M
频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字符 N O P Q R s T U V W X Y z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1
4、实现提示:
(1)编码结果以文本方式存储在文件CodeFile 中.
(2)用户界面可以设计为“菜单”方式:显示上述功能符号, 再加上“Q”, 表示行 Quit.请用户键入一个选择功能符。此功能执行完毕后再显示此菜单, 真至某次用户选择了“Q”为止.
(3)在程序的次执行过程中, 第次执行I,D或C命令之后, 哈夫曼树已经在内存了, 不必再读入。每次执行中不一定执行1命令, 因为文件hfmTree可能早已建好。
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
请大家看一下这个代码用c++咋写,一点思路都没有,最好能做一下,不要伪代码,有偿
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
24条回答 默认 最新
- 阿里嘎多学长 2024-12-10 17:26关注
阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
问题概述
本题要求使用哈夫曼编码提高通信性能,并在发送端对待传数据进行预编码。
解决方案
我们可以使用哈夫曼树进行编码。首先,需要将待传数据转换为Frequency Table,然后对树进行构建。下面是一个简单的C++实现:
#include <iostream> #include <map> #include <queue> #include <string> using namespace std; struct Node { char value; int frequency; Node* left; Node* right; }; int main() { // example data string data = "this is an example for huffman coding"; map<char, int> frequency; // calculate frequency for (char c : data) { if (frequency.find(c) == frequency.end()) { frequency[c] = 1; } else { frequency[c]++; } } // build huffman tree priority_queue<Node*, vector<Node*>, function<bool(Node*, Node*)>> pq; for (auto it = frequency.begin(); it != frequency.end(); ++it) { Node* node = new Node; node->value = it->first; node->frequency = it->second; node->left = nullptr; node->right = nullptr; pq.push(node); } while (pq.size() > 1) { Node* left = pq.top(); pq.pop(); Node* right = pq.top(); pq.pop(); Node* node = new Node; node->value = '-'; node->frequency = left->frequency + right->frequency; node->left = left; node->right = right; pq.push(node); } // build huffman code map<char, string> code; function<void(Node*, string)> dfs = [&](Node* node, string str) { if (node->left == nullptr && node->right == nullptr) { code[node->value] = str; } if (node->left != nullptr) { dfs(node->left, str + "0"); } if (node->right != nullptr) { dfs(node->right, str + "1"); } }; dfs(pq.top(), ""); // encode data string encodedData; for (char c : data) { encodedData += code[c]; } cout << "Encoded data: " << encodedData << endl; return 0; }
代码解释
- 首先,计算待传数据的频率Frequency Table。
- 然后,构建哈夫曼 tree,使用 priority queue 将 node 排序。
- 对 tree 进行遍历,构建哈夫曼编码。
- 最后,对待传数据进行编码,输出编码结果。
请注意,这只是一个简单的实现,实际应用中可能需要考虑更多的因素,例如 Tree 構建的算法 chooseness、 encoding 速度、decode 操作等。此外,您也可以使用现有的 哈夫曼编码库来解决这个问题。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
- ¥50 STM32单片机传感器读取错误
- ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
- ¥15 机器人轨迹规划相关问题
- ¥15 word样式右侧翻页键消失