哈夫曼编码贪心算法c++实现

时间: 2023-07-11 09:20:42 浏览: 76
以下是C++中哈夫曼编码的贪心算法实现: ```c++ #include <iostream> #include <queue> #include <vector> 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 compare { bool operator()(Node* l, Node* r) { return l->freq > r->freq; } }; // 生成哈夫曼树 Node* huffmanTree(const string& str) { // 统计字符频率 vector<int> freq(256, 0); for (auto& c : str) { freq[c]++; } // 构建小根堆 priority_queue<Node*, vector<Node*>, compare> pq; for (int i = 0; i < 256; i++) { if (freq[i] > 0) { pq.push(new Node(i, freq[i])); } } // 不断合并小根堆中的节点,直到只剩一个节点 while (pq.size() > 1) { Node* left = pq.top(); pq.pop(); Node* right = pq.top(); pq.pop(); Node* parent = new Node('#', left->freq + right->freq); parent->left = left; parent->right = right; pq.push(parent); } return pq.top(); } // 生成哈夫曼编码 void huffmanCode(Node* root, string code, vector<string>& result) { if (!root) { return; } if (root->ch != '#') { result[root->ch] = code; } huffmanCode(root->left, code + "0", result); huffmanCode(root->right, code + "1", result); } int main() { string str = "hello world"; Node* root = huffmanTree(str); vector<string> result(256); huffmanCode(root, "", result); // 输出生成的哈夫曼编码 for (int i = 0; i < 256; i++) { if (!result[i].empty()) { cout << (char)i << ": " << result[i] << endl; } } return 0; } ``` 在这个实现中,我们首先统计字符串中每个字符出现的频率,并将它们存储在一个大小为256的数组中。然后,我们构建一个小根堆,其中每个节点都代表一个字符及其对应的频率,我们将小根堆中频率最小的两个节点合并为一个新节点,并将它们的和作为新节点的频率。这个过程一直持续到小根堆中只剩下一个节点为止,这个节点就是哈夫曼树的根节点。 接下来,我们沿着哈夫曼树,为每个字符生成一个哈夫曼编码。当我们遍历到一个叶子节点时,我们就将其对应的字符和编码存储在一个vector中。 最后,我们可以输出每个字符的哈夫曼编码。

相关推荐

最新推荐

recommend-type

哈夫曼编码 回溯法 0-1背包问题 装载问题 VC

1 [斩尾行动]贪心算法实现哈夫曼编码; 2 用回溯法解决0-1背包问题;比较穷举法、动态规划法、贪心法实现的0-1背包问题; 3 用回溯法编程实现装载问题,比较此装载问题与贪心法装载问题区别,思考不同算法的适用问题...
recommend-type

基于Python的蓝桥杯竞赛平台的设计与实现

【作品名称】:基于Python的蓝桥杯竞赛平台的设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于Python的蓝桥杯竞赛平台的设计与实现
recommend-type

python实现基于深度学习TensorFlow框架的花朵识别项目源码.zip

python实现基于深度学习TensorFlow框架的花朵识别项目源码.zip
recommend-type

3-9.py

3-9
recommend-type

郊狼优化算法COA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用

郊狼优化算法COA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用
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

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

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