数据结构与算法基础(王卓)(23):哈夫曼编码(1):过程

文章详细讨论了如何构建哈夫曼编码的过程,包括创建二维数组HC和cd,以及生成编码的逻辑。作者分析了个人版本与标准答案的差异,指出在处理编码存储和回溯过程中的问题,并提出了修改后的解决方案,特别关注了数组空间分配和哈夫曼树节点的关系。

目录

逻辑雏形

第一步:

第二步:

第三步:

我写的:(第一版)

标准答案:(这里把后面几步也写进去了)

两种做法思路不同:

问题:

根据标准答案修改以后的个人最终版本:

第四步:(这里我们就把最后收尾工作合并一起写了)

问题:


逻辑雏形

根据老师讲解的思路,梳理出程序运行的逻辑雏形如下:

  1. 搞一个多维数组HC,用来存储我们这里 n(每) 个节点的哈夫曼编码
  2. 搞一个数组cd,用来存储我们这里每个节点是前面一位的左子树(0)还是右子树(1),给cd最后一位放结束存储字符
  3. 反复向上回溯:每次都通过找(parent)来判断自己是左子树还是右子树,并且在cd表里记录每次的查询结果,然后再继续向上回溯看上一层(parent),在进行同样(相同)的循环操作
  4. 给HC开辟相应的,每个节点对应需要的存储空间大小的空间
  5. 每算完一个节点的哈夫曼编码就把它放(复制)到HC里面
  6. 释放空间,结束

需要注意的是,由于我们的函数抬头是:

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n)

也就是说我们在一开始的时候,就已经传进来了一颗哈夫曼树,所以我们这里在函数里面不用再重新重复算一遍哈夫曼树


第一步:

创建二维数组HC,同时也要确定(定义)下来【HuffmanCode】的类型是什么

typedef char **HuffmanCode;
//typedef char** HuffmanCode;

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n)
{
    HC = new char *[n + 1];  
}

(1):这里,关于这个定义我们可以这样来理解:

HuffmanCode是一个内部内容为char类型的一个多维数组(这里应该是二维数组)

*(*HuffmanCode):表示二维数组的子集:

表示若干个一维数组,每个数组都是一个char类型的一个一维数组

**HuffmanCode:一个二维数组

由若干个char类型一维数组组成的一个二维数组

其中每一个一维数组又可以分为若干个char类型的元素/结点

另外,这里关于开辟空间new的格式使用规则,感觉还是有点不稳的可以直接看:

数据结构与算法基础(王卓)(8)附:关于new的使用方法详解_数据结构中的new_宇 -Yu的博客-优快云博客


(2):为什么我们给他分配(n+1)个元素(格子)???

猜测:

可能是因为(第)一个用来放表头(头结点),然后后面还有(n)个节点


第二步:

给数组cd开辟空间,标准答案:

    char* cd = new char[n];  //分配存放临时存放编码的动态数组空间
    cd[n - 1] = '\0';

可是我觉得不对吧,为什么在数组倒数第二个位置上放空字符啊?

根据前面实际(操作)的案例,空字符不应该是放在最后一位吗??

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值