哈夫曼编码实现 C++

这篇博客记录了使用C++实现哈夫曼编码的过程,主要思路包括统计小写字母频率,构造节点,通过选取最小权重节点合并生成哈夫曼树,并输出编码。虽然目前仅支持26个小写字母,但代码中指针操作和内存控制仍有优化空间。已通过10组数据验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很早之前写的代码,今天翻出了整理了半天才找着个行的通的版本,发帖当作笔记了。


备注:只能完成26个小写字母的编码,并分别输出;在选取weight值最小的两个结点方法中还可引入算法优化;内存控制有待加强。


本代码中大量采用指针操作,

基本思路:1,统计字符串中各个小写字母出现的频数,并构造相关节点,每一个节点相当于MHTree的一颗子树;

    2,选取各个子树中最小weight值得两棵子树,假设指针数组下标分别为max_index,min_index。并以他们的weigh之和(即频数之 和)构造MHTree中新的内结点,具体data以及capacity的设定是为了便于后续输出相应字符的哈夫曼编码;

    3,使max_index对应的指针指向新生成的内结点,min_index.....指向NULL;

    4,循环1.2.3。最终得到MHTree的根节点;

    5,按照一定规则遍历,则可输出各个字符对应的哈夫曼编码。


验证过10组数据,通过。


源码如下:

#include<iostream>
#include<cassert>
#include<string>

using namespace std;
#define MAXSIZE 26


typedef struct Node
{
	ch
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值