数据结构 赫夫曼编码c++

时间: 2023-07-05 13:10:16 浏览: 48
赫夫曼编码是一种可变字长编码,它可以将出现频率较高的字符用较短的编码表示,而出现频率较低的字符用较长的编码表示,从而达到压缩数据的目的。下面是用 C++ 实现赫夫曼编码的一种方法: 1. 定义结构体节点,用于表示每个字符和它出现的频率: ```c++ struct Node { char ch; // 字符 int freq; // 频率 Node* left; // 左子节点 Node* right; // 右子节点 Node(char c, int f): ch(c), freq(f), left(nullptr), right(nullptr) {} }; ``` 2. 定义比较器,用于构建最小堆: ```c++ struct cmp { bool operator() (Node* a, Node* b) { return a->freq > b->freq; } }; ``` 3. 构建最小堆,并将每个字符作为节点插入堆中: ```c++ priority_queue<Node*, vector<Node*>, cmp> min_heap; unordered_map<char, int> freq_map; // 统计每个字符的频率 for (char c : input_str) { freq_map[c]++; } for (auto& kv : freq_map) { Node* node = new Node(kv.first, kv.second); min_heap.push(node); } ``` 4. 用最小堆构建赫夫曼树: ```c++ while (min_heap.size() > 1) { Node* left = min_heap.top(); min_heap.pop(); Node* right = min_heap.top(); min_heap.pop(); Node* parent = new Node('#', left->freq + right->freq); parent->left = left; parent->right = right; min_heap.push(parent); } Node* root = min_heap.top(); ``` 5. 根据赫夫曼树构建编码表,并对输入字符串进行编码: ```c++ unordered_map<char, string> code_map; // 存储每个字符的编码 function<void(Node*, string)> dfs = [&](Node* node, string s) { if (!node) return; if (!node->left && !node->right) { code_map[node->ch] = s; } dfs(node->left, s + "0"); dfs(node->right, s + "1"); }; dfs(root, ""); string encoded_str; for (char c : input_str) { encoded_str += code_map[c]; } ``` 完整代码如下: ```c++ #include <iostream> #include <queue> #include <unordered_map> using namespace std; struct Node { char ch; // 字符 int freq; // 频率 Node* left; // 左子节点 Node* right; // 右子节点 Node(char c, int f): ch(c), freq(f), left(nullptr), right(nullptr) {} }; struct cmp { bool operator() (Node* a, Node* b) { return a->freq > b->freq; } }; int main() { string input_str = "hello world"; priority_queue<Node*, vector<Node*>, cmp> min_heap; unordered_map<char, int> freq_map; // 统计每个字符的频率 for (char c : input_str) { freq_map[c]++; } for (auto& kv : freq_map) { Node* node = new Node(kv.first, kv.second); min_heap.push(node); } while (min_heap.size() > 1) { // 构建赫夫曼树 Node* left = min_heap.top(); min_heap.pop(); Node* right = min_heap.top(); min_heap.pop(); Node* parent = new Node('#', left->freq + right->freq); parent->left = left; parent->right = right; min_heap.push(parent); } Node* root = min_heap.top(); unordered_map<char, string> code_map; // 存储每个字符的编码 function<void(Node*, string)> dfs = [&](Node* node, string s) { if (!node) return; if (!node->left && !node->right) { code_map[node->ch] = s; } dfs(node->left, s + "0"); dfs(node->right, s + "1"); }; dfs(root, ""); string encoded_str; for (char c : input_str) { // 对输入字符串进行编码 encoded_str += code_map[c]; } cout << "Encoded string: " << encoded_str << endl; return 0; } ```

相关推荐

最新推荐

recommend-type

数据结构实验报告哈夫曼编码译码

程序设计任务: 设计一个程序,实现哈夫曼编码和译码的生成算法。基本要求:输入字符集大小n,以及n个字符和n个权值;构造哈夫曼树,产生每个字符的Huffman编码, 打印之;输入电文,将其翻译成比特流, 打印之;输入...
recommend-type

java数据结构与算法.pdf

包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...
recommend-type

数据结构—赫夫曼二叉树的应用

文件来源于百度文库 我觉得很有用 因为我刚看完了数据结构的这一章 这个资源还是很不错的
recommend-type

数据结构课程设计哈夫曼树编译码器报告.doc

开发环境:VC++ 6.0 (1) I:初始化...(2) E:编码(Encoding)。 (3) D:译码(Decoding)。 (4) P:打印代码文件(Print)。 (5)T:打印哈夫曼树(HuffmanTreePrint)。 (6)Q:退出程序(Quit)。
recommend-type

赫哈曼编码的应用对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串

本设计要求是对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。赫夫曼编码是一种将信息转换成二进制编码有效的方法之一,赫夫曼编码是利用赫夫曼树求得的用于通信的二进制编码...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.
recommend-type

训练集和测试集的准确率都99%,但是预测效果不好

即使训练集和测试集的准确率都很高,但是在实际的预测中表现不佳,可能会有以下几个原因: 1. 数据质量问题:模型训练和测试的数据可能存在问题,比如数据标签错误、数据集采样不均衡、数据集中存在异常值等问题,这些问题可能会导致模型在实际预测中表现不佳。 2. 特征工程问题:模型的特征工程可能存在问题,导致模型无法很好地捕捉数据的特征,从而影响预测效果。 3. 模型选择问题:模型的选择可能不合适,比如选择的模型太简单,无法很好地拟合数据,或者选择的模型太复杂,导致过拟合等问题。 4. 超参数调整问题:模型的超参数可能没有调整到最佳状态,需要进行调整。 针对以上可能的原因,可以采取相应的措施进
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。