如何使用c++找出编码88表示的字符_面试官:给我手写一个哈夫曼编码(使用java语言实现)...

哈弗曼树往往都会根据哈夫曼编码结合着来说,因此这篇文章,主要结合着面试问题来说明。

一、基本概念

哈夫曼树的目的是找出存放一串字符所需的最少的二进制编码, 原理是通过统计出每种字符出现的频率!不断地对其合并。

举个例子:有一串字符,现在把这些字符进行统计,频率表 A:60, B:45, C:13 D:69 E:14 F:5 G:3。现在要对这些字符进行编码,但是前提是使用最少的二进制编码。这时候怎么办呢?这就用到了我们的哈弗曼树。

我们需要构造一个哈弗曼树,构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点。

现在我们就来构造一颗哈弗曼树。

二、构造哈弗曼树

刚刚我们已经说了,构造哈夫曼树是每次选取当前频率最低的两个节点来进行合并就好了。

1、原始序列

2400856d8f47461b8810ba97770aa9ab.png

2、选取最小的F和G节点合并

2fc66ed1d7fdb3389f6e26985cb9241a.png

3、选取目前最小的C节点与8合并

572055fe85f0ea36cf033928289de5bc.png

4、继续重复以上步骤进行合并

ffac96e99a9a0a8669872846d10b1c84.png

到此为止,我们的哈弗曼树就已经构造出来了。接下来我们添加01规则,进行哈夫曼编码。

三、哈夫曼编码

哈夫曼编码的规则是,左边添加0,右边添加1。看下图就明白了。

69ef0de26a0128873c10a7115eb6c0e0.png

OK,也就是在每一条边上添加了01。此时我们来看每一个字符的编码。

A:10 B:01 C:0011 D:11 E:000 F:00101 G:00100

四、java实现哈夫曼编码

我们直接给出一个整体的哈夫曼编码的java实现。

第一步:定义一个节点

0295760a928c727e30f4aee47d01a9d8.png

第二步:实现哈夫曼编码

c50c7a82fbe55835c8e6ee70d5a191c9.png

690756f965323b9e2874de495883ca22.png

5c7e7badf60fcf2551b4c47100b3e40f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值