算法设计-哈夫曼树(C++)

ops/2025/2/5 15:30:34/

一、详细代码

算法原理:

Huffman编码是一种用于数据压缩的算法,它通过为出现频率较高的字符分配较短的编码,而为出现频率较低的字符分配较长的编码,从而实现数据的压缩。


#include <iostream>
#include <queue>
#include <map>
#include <vector>
#include <cassert>using namespace std;// Huffman Node structure
class HuffmanNode {
public:char character;int frequency;HuffmanNode* left;HuffmanNode* right;HuffmanNode(char c, int f) : character(c), frequency(f), left(NULL), right(NULL) {}
};// Comparator for priority queue to ensure minimum frequency node comes first
struct Compare {bool operator()(const HuffmanNode* l, const HuffmanNode* r) {return l->frequency > r->frequency;}
};// Function to create Huffman Tree
HuffmanNode* CreateHuffmanTree(map<char, int> frequencies) {priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> pq;// Insert all characters into priority queuefor (auto it = frequencies.begin(); it != frequencies.end(); ++it) {pq.push(new HuffmanNode(it->first, it->second));}// Iterate until there is more than one node in the queuewhile (pq.size() != 1) {HuffmanNode* left = pq.top(); pq.pop();HuffmanNode* right = pq.top(); pq.pop();HuffmanNode* newNode = new HuffmanNode('\0', left->frequency + right->frequency);newNode->left = left;newNode->right = right;pq.push(newNode);}return pq.top(); // Return the root node of the Huffman Tree
}// Function to print codes from Huffman Tree
void PrintCodes(HuffmanNode* root, string code, map<char, string>& codes) {if (root == NULL) return;if (root->character != '\0') {codes[root->character] = code;return;}PrintCodes(root->left, code + "0", codes);PrintCodes(root->right, code + "1", codes);
}// Main function
int main() {map<char, int> frequencies = {{'0', 5}, {'1', 5}, {'2', 10}, {'3', 10}, {'4', 10}, {'5', 15},{'6',20},{'7',25}};HuffmanNode* root = CreateHuffmanTree(frequencies);map<char, string> codes;PrintCodes(root, "", codes);cout << "Character Codes:\n";for (auto it = codes.begin(); it != codes.end(); ++it) {cout << it->first << ": " << it->second << endl;}return 0;
}

二、结构体

1. HuffmanNode 结构体

  • HuffmanNode 是一个表示Huffman树节点的类。

  • character:存储字符。

  • frequency:存储字符的频率(即字符在输入中出现的次数)。

  • left 和 right:分别指向左子树和右子树的指针。

  • 构造函数:用于初始化节点的字符、频率以及左右子树指针。

2. Compare 结构体

  • Compare 是一个用于优先队列的比较器。

  • 它定义了如何比较两个 HuffmanNode 指针,确保频率较小的节点在优先队列中排在前面。这是为了在构建Huffman树时,能够优先合并频率最小的节点。

三、函数

  • CreateHuffmanTree 函数用于构建Huffman树。

  • 步骤

    1. 首先,将所有字符及其频率插入到优先队列 pq 中。

    2. 然后,循环地从队列中取出两个频率最小的节点,合并它们,生成一个新的节点,新节点的频率为这两个节点的频率之和。

    3. 将新节点重新插入队列中。

    4. 重复上述步骤,直到队列中只剩下一个节点,这个节点就是Huffman树的根节点。

  • 返回值:返回Huffman树的根节点。

  • PrintCodes 函数用于从Huffman树中生成每个字符的编码。

  • 参数

    • root:当前节点。

    • code:当前路径的编码(从根节点到当前节点的路径)。

    • codes:存储字符及其对应编码的映射。

  • 递归过程

    1. 如果当前节点是叶子节点(即 root->character != '\0'),则将当前路径 code 存储到 codes 中。

    2. 否则,递归地遍历左子树和右子树,并在路径上添加 0 或 1

  • main 函数是程序的入口。

  • 步骤

    1. 定义一个字符频率的映射 frequencies,表示每个字符及其出现的频率。

    2. 调用 CreateHuffmanTree 函数构建Huffman树,并返回根节点。

    3. 调用 PrintCodes 函数生成每个字符的编码,并存储在 codes 映射中。

    4. 最后,遍历 codes 映射,输出每个字符及其对应的Huffman编码。


http://www.ppmy.cn/ops/155906.html

相关文章

Spring Boot - 数据库集成06 - 集成ElasticSearch

Spring boot 集成 ElasticSearch 文章目录 Spring boot 集成 ElasticSearch一&#xff1a;前置工作1&#xff1a;项目搭建和依赖导入2&#xff1a;客户端连接相关构建3&#xff1a;实体类相关注解配置说明 二&#xff1a;客户端client相关操作说明1&#xff1a;检索流程1.1&…

课题推荐——基于自适应滤波技术的多传感器融合在无人机组合导航中的应用研究

无人机在现代航空、农业和监测等领域的应用日益广泛。为了提高导航精度&#xff0c;通常采用多传感器融合技术&#xff0c;将来自GPS、惯性测量单元&#xff08;IMU&#xff09;、磁力计等不同传感器的数据整合。然而&#xff0c;传感器的量测偏差、环境干扰以及非线性特性使得…

司库建设:财务资金管理制度及风险管控要点

财务资金管理制度及风险管控要点 一、 财务资金管理制度 1. 资金集中管理 目标: 实现资金集中管控&#xff0c;提高资金使用效率&#xff0c;降低资金成本。 措施: 建立集团资金池&#xff0c;实行收支两条线管理。 推行资金集中收付&#xff0c;统一调度资金。 加强银行账…

第二十三章 MySQL锁之表锁

目录 一、概述 二、语法 三、特点 一、概述 表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁&#xff0c;主要分为以下三类&#xff1a; 1. 表锁 2. 元数…

搜索与图论复习1

1深度优先遍历DFS 2宽度优先遍历BFS 3树与图的存储 4树与图的深度优先遍历 5树与图的宽度优先遍历 6拓扑排序 1DFS&#xff1a; #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int u){if(nu){for(int i0;…

基于CY8CKIT-149 BLE HID设备实现及PC控制功能开发(BLE HID+CapSense)

目录 项目介绍硬件介绍项目设计开发环境总体流程图BLE HID触摸按键与滑条 功能展示项目总结 &#x1f449; 【Funpack4-1】基于CY8CKIT-149 BLE HID设备实现及PC控制功能开发 &#x1f449; Github: EmbeddedCamerata/CY8CKIT-149_ble_hid_keyboard 项目介绍 基于英飞凌 CY8CK…

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器&#xff0c;网卡绑定有2个ip地址&#xff0c;分别为&#xff1a; A&#xff1a;192.168.111.201 B&#xff1a;192.168.111.202 在这台服务器请求目标地址 C&#xff1a;192.168.111.203 时必须使用B作为源地址才能访问目标地址C&#xff0c;在这台服务器默认…

【含文档+PPT+源码】基于小程序的智能停车管理系统设计与开发

项目介绍 本课程演示的是一款基于小程序的智能停车管理系统设计与开发&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…