面试官:给我手写一个哈夫曼编码(使用java语言实现)

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

一、基本概念


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


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


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


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


二、构造哈弗曼树


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


1、原始序列

v2-cb308c32d062f39f69e5d56fce318f46_1440w.jpg

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

v2-094225681a1c51f40b6287b120047561_1440w.jpg

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

v2-c0d26a992b18e0ad3af4d3f5062cb296_1440w.jpg

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

v2-e02604e4ee551929190f49ad474513b1_1440w.jpg

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


三、哈夫曼编码


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

v2-5a137377bfc4d41c7f1d5c0d43cde4f7_1440w.jpg

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

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


四、java实现哈夫曼编码


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


第一步:定义一个节点

v2-5f64fd9ba692bc5757a1a4f0fbf58153_1440w.jpg

第二步:实现哈夫曼编码

v2-26b0882fa4de94b0037fc30dd786965d_1440w.jpg

v2-7e69faf8177e5d1cd719b2c98ab20a1c_1440w.jpg


相关文章
|
5月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
224 4
|
5月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
392 18
|
6月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
6月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
6月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
278 15
|
7月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
573 0
|
7月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
7月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
7月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。