| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 心得体会day28-30(日撸 Java 三百行) -> 正文阅读 |
|
[数据结构与算法]心得体会day28-30(日撸 Java 三百行) |
文章链接:日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 day28-30 哈夫曼树编码1.建树过程(以图为例)step1: 权重1,2,3,4 ;选取权重最小的两个节点1,2 作为左右节点,已建一棵树(也可以看作一个大节点), step2: 权重1,2,3,4,3,选取权重最小的两个节点3,3 建树(红色标记已选过) step3:权重 1,2,3,4,3,6 选取权重最小的两个节点4,6 建树 当节点已经完了,建树完毕。 2. 哈夫曼树特点(1)n个叶子结点的哈夫曼树共有2n-1个结点 (2)每一个字符都对应的是叶子节点。 (3)左右子树交换后仍是哈夫曼树 3.分析代码过程3.1 抽象成员变量结合上面手动建树过程,抽象哈夫曼树节点的成员变量:节点字符,权重,左右孩子节点,双亲节点。 3.2结合文章梳理的思路以前仅局限于在课本上手动构造哈夫曼树,现在要把他转换为代码,刚开始看还是有难度,但是仔细去读代码,分析,对自己的思维有很大的提升,希望下次自己能不看代码,自己分析写出来。 (1)读文本 给一串文本(文本内容仅只含ASCII码上的),读文本内容返回字符串内容。需要用到I/O输入输出流 (2)解析文本内容: 获取字符串内容,解析字符串并利用数组来存储,即包括字符存储,字符对应的权重(字符出现的个数),而要存储这两类值,需要借助了一个辅助数组(长度是ASCII码总个数,因为ASCII码十进制是从0开始的,所以就可以一一对应字符即强转)遍历字符串,将对应的字符出现的个数存储到这个辅助数组下,这样即可以知道有那些字符(索引值),又可以知道字符的权重(数组本身值)。结合这个数组即可对字符存储和字符对应权重的数组赋值了。(通过代码,在字符存储和字符权重存储两个数组,要一一对应,即字符a存储的数组索引是1,则a对应权重存储的数组索引也需要是1,否则这个顺序乱了,则产生的编码这些会出错。在思考是否可以用Map键值对来实现。)我认为最关键的就是这一步,解析文本内容。如下代码tempCharCounts就是这个辅助数组,如果他的值没有弄好就会导致后面一系列的操作会出现问题。
(3)建树:在解析文本内容后我们得到的以下两个数组是就建树的关键。其中通过循环来找最数组中权重最小的两个结点,自底向上建哈夫曼树。这里借助了boolean类型的tempProcessed数组来标记结点是否已经被选过。循环的开始和结束位置需要留意以下。
(4)生成哈夫曼编码:建树成功后,要对叶子节点上的每一个字符进行编码(左0右1)来产生编码,并存在一个字符数组中。在生成哈夫曼编码,利用了一个双重循环,外层循环是循环需要编码的字符个数,内层循环是对每一个字符从底向上编码(通过双亲结点向上),则打印的时候就是以我们正常的从上向下读的编码.
(5)编码:输入字符串,结合生成的哈夫曼编码的字符串数组 拼接成字符串即可 (6)解码:输入编码字符串,在解码的时候 我们就要从根开始去循环字符串编码,遇到0就往左子树走,遇到1就往右子树走,直到遇到的结点左子树为null(根据哈夫曼树的特点,只要左子树为null,不用判断右子树),说明第一个字符的编码走完,又重新回到根节点走下一个字符的编码。 4.其他4.1 java 类型强转 char类型转int:在char类型字符运行时实际上底层还是会转换为ASCII表中对应的整数,所以char类型可以转为int型。 4.2 java异常处理 (1)?try-catch-finally 来捕获具体的异常 (2)throws直接抛出异常,不捕获 总结今天主要是学习了哈夫曼树的构建,编码解码。在这个过程中对思维逻辑一定要很清晰,在根据基本的理论知识和文中代码梳理思路,再自己动手敲代码。在这个过程中,也在学习如何将理论知识转变为程序代码有了一定的启示。再接再励。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:31:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |