m0_73595668 2024-12-10 17:12 采纳率: 0%
浏览 54
已结题

请大家看一下这个代码用c++咋写,一点思路都没有,最好能做一下,不要伪代码,有偿

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可能早已建好。

  • 写回答

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;
    }
    

    代码解释

    1. 首先,计算待传数据的频率Frequency Table。
    2. 然后,构建哈夫曼 tree,使用 priority queue 将 node 排序。
    3. 对 tree 进行遍历,构建哈夫曼编码。
    4. 最后,对待传数据进行编码,输出编码结果。

    请注意,这只是一个简单的实现,实际应用中可能需要考虑更多的因素,例如 Tree 構建的算法 chooseness、 encoding 速度、decode 操作等。此外,您也可以使用现有的 哈夫曼编码库来解决这个问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月11日
  • 修改了问题 12月11日
  • 修改了问题 12月10日
  • 赞助了问题酬金15元 12月10日
  • 展开全部

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失