面试官:给我手写一个哈夫曼编码(使用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


相关文章
|
3月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
100 4
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
86 2
|
3月前
|
Java
Java实现随机生成某个省某个市的身份证号?如何编码?
【10月更文挑战第18天】Java实现随机生成某个省某个市的身份证号?如何编码?
191 5
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
74 60
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
83 14
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
2月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
37 6