生成赫夫曼编码表

package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic;
import com.sun.org.glassfish.external.statistics.StringStatistic;import java.util.*;/*** @创建人 wdl* @创建时间 2021/3/27* @描述*/
public class HuffmanCode {public static void main(String[] args) {String content="i like like like java do you like a java";byte[] contentBytes = content.getBytes();System.out.println(contentBytes.length);//40List<Node> nodes = getNodes(contentBytes);System.out.println(nodes);//测试一把,创建的二叉树System.out.println("赫夫曼树");Node huffmanTreeRoot = createHuffmanTree(nodes);System.out.println("前序遍历");huffmanTreeRoot.preOrder();//测试一把是否生成了对应的赫夫曼编码getCodes(huffmanTreeRoot,"",stringBuilder);System.out.println("生成的赫夫曼编码表"+huffmanCodes);}//生成赫夫曼树对应的赫夫曼编码//思路://1.将赫夫曼编码表存放在Map<Byte,String>形式static Map<Byte,String> huffmanCodes= new HashMap<Byte,String>();// 32->01 97->100...//2.在生成赫夫曼编码表示,需要去拼接璐姐,定义一个StringBuilder存储某个叶子结点的路径static  StringBuilder stringBuilder=new StringBuilder();/*** 功能:将传入的node节点的所有叶子节点的赫夫曼编码的到,并放入到huffmanCodes集合* @param node  传入节点* @param code 路径:左子节点是0,右子节点是1* @param stringBuilder 是用于拼接路径*/private static void getCodes(Node node,String code,StringBuilder stringBuilder){StringBuilder stringBuilder2 = new StringBuilder(stringBuilder);//将code加入到stringBuild2stringBuilder2.append(code);if(node!=null){//如果node==null不处理//判断当前node是叶子结点还是非叶子节点if(node.data==null){//非叶子节点//递归处理//向左getCodes(node.left,"0",stringBuilder2);//向右getCodes(node.right,"1",stringBuilder2);}else {//说明是一个叶子结点//表示找到了某个叶子节点的最后huffmanCodes.put(node.data,stringBuilder2.toString());}}}//前序遍历的方法private static void preOrder(Node root){if(root!=null){root.preOrder();}else {System.out.println("赫夫曼树为空");}}/**** @param bytes 接收字节数组* @return 返回的就是List形式*/private static List<Node> getNodes(byte[] bytes){//1.创建一个ArrayListArrayList<Node> nodes = new ArrayList<>();//遍历bytes 统计每一个byte出现的次数->map[key,value]HashMap<Byte, Integer> counts = new HashMap<>();for(byte b:bytes){Integer count=counts.get(b);if (count==null){//map中还没有这个字符数据,第一次counts.put(b,1);}else {counts.put(b,count+1);}}//把每一个键值对转成Node对象,并加入到nodes集合//遍历mapfor(Map.Entry<Byte,Integer> entry:counts.entrySet()){nodes.add(new Node(entry.getKey(),entry.getValue()));}return nodes;}//可以通过List创建对应的赫夫曼树private static Node createHuffmanTree(List<Node> nodes){while (nodes.size()>1){//排序,从小到大Collections.sort(nodes);//取出第一颗最小的二叉树Node leftNode = nodes.get(0);//取出第二颗最小的二叉树Node rightNode = nodes.get(1);//创建一颗新的二叉树,它的根节点没有data,只有权值Node parent=new Node(null,leftNode.weight+rightNode.weight);parent.left=leftNode;parent.right=rightNode;//将已经处理的两颗二叉树从nodes删除nodes.remove(leftNode);nodes.remove(rightNode);//将新的二叉树,加入到nodesnodes.add(parent);}//nodes最后的节点,就是哈夫曼树的根节点return nodes.get(0);}}//创建Node,待数据和权值
class Node implements Comparable<Node>{Byte data;//存放数据(字符)本身,比如'a'=>97 ' '=>32int weight;//权值,表示字符出现的次数Node left;Node right;public Node(Byte data, int weight) {this.data = data;this.weight = weight;}@Overridepublic int compareTo(Node o) {//从小到大排序return this.weight-o.weight;}@Overridepublic String toString() {return "Node{" +"data=" + data +", weight=" + weight +'}';}//前序遍历public void preOrder(){System.out.println(this);if(this.left!=null){this.left.preOrder();}if (this.right!=null){this.right.preOrder();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql截取字段中 用逗号分割 省市县镇街道社区小区

Mysql截取字段中 用逗号分割 省市县镇街道社区小区 select id , name, substring_index(name,,,0) as province0, substring_index(name,,,1) as province1, substring_index(name,,,2) as province2, substring_index(name,,,3) as province3, substring_index(name,,,4) as…

如何导出Navicat的数据库连接配置

如何导出Navicat的数据库连接配置 如何导出Navicat的数据库连接配置_石头wang的博客-CSDN博客_navicat 导出配置 如何导出Navicat的数据库连接配置 背景 我们可能会在不同的电脑安装Navicat&#xff0c;这些连接的配置如何从一台电脑迁移到另外一条&#xff1f;自行备份是比较…

Spring BeanFactory 容器

转载自 Spring BeanFactory 容器 Sping 的 BeanFactory 容器 这是一个最简单的容器&#xff0c;它主要的功能是为依赖注入 &#xff08;DI&#xff09; 提供支持&#xff0c;这个容器接口在 org.springframework.beans.factory.BeanFactory 中被定义。 BeanFactory 和相关的…

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情&#xff0c;希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后&#xff0c;解决掉一些问题。 编码标准 遵照编码标准可以编写出更多可维护的代码&#xff0c;特别是在由多个开发…

充电提示音_iPhone如何自定义充电提示音,图文教程

昨天给小伙伴们分享了几个iOS14的充电提示音和设置方法&#xff0c;不过有的小伙伴可能需要设置自己喜欢的声音为充电提示音&#xff0c;所以今天就来教大家自定义喜欢的iOS14充电提示音。教程由于比较仔细&#xff0c;看起来比较长&#xff0c;其实很简单&#xff0c;主要分为…

Scanner获取用户输入

next()和hasNext() public class Demo02_Scanner {public static void main(String[] args) {//创建一个扫描器对象&#xff0c;用于接收键盘数据Scanner scanner new Scanner(System.in);System.out.println("使用next方式接收: ");//判断用户有没有输入字符串if …

idea Lombok插件

此文提供对于Lombok的简单使用 1、Lombok简介 Lombok能通过注解的方式&#xff0c;在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 2、Lombok插件安装 想要使用 Lombok&#xff0c;必须要安装一个 Lombok 插件&#xff0c;不然编辑器无法识…

复变函数画图cosz图像_用matlab绘制x=(1+cosu)cosv,y=(1+cosu)sinv,z=sinu图像?

用matlab绘制x(1cosu)cosv,y(1cosu)sinv,zsinu图像&#xff1f;234游戏网友 提出于 2019-07-19 07:04:26u-2*pi:0.01:2*pi;v-2*pi:0.01:2*pi;x(1cosu).*cosv;y(1cosu).*sinv;zsinu;polt3(x,y,z)xlabel(x);ylabel(y);zlabel(z);grid但是出现了&#xff1a;Errorusingplot3Vector…

赫夫曼编码字节数组

思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import java.util.*;/*** 创建人 wdl* 创建时间 2021/3/27* 描述*/ public class…

Spring ApplicationContext 容器

转载自 Spring ApplicationContext 容器 Spring ApplicationContext 容器 Application Context 是 spring 中较高级的容器。和 BeanFactory 类似&#xff0c;它可以加载配置文件中定义的 bean&#xff0c;将所有的 bean 集中在一起&#xff0c;当有请求的时候分配 bean。 另…

.NET Core 工具中的新内容

Visual Studio 2017 RC最近一个版本更新包括一套更新的.NET Core工具箱。这个版本带来了几项改进&#xff0c;包括改变了模版化、dotnet网络命令&#xff0c;以及许多缺陷修复。微软的Rich Lander发表了一份更新说明&#xff0c;陈述了.NET Core开发人员可以预期在.NET Core RC…

python binascii array('c')_详解Python中的array数组模块相关使用

初始化array实例化可以提供一个参数来描述允许那种数据类型&#xff0c;还可以有一个初始的数据序列存储在数组中。import arrayimport binasciis This is the array.a array.array(c, s)print As string:, sprint As array :, aprint As hex :, binascii.hexlify(a)数组配置…

你还可以续命几次?回顾DockPanel Suite项目的发展史

微软在设计Visual Studio.NET的时候汲取了之前IDE版本的各种教训&#xff0c;开始考虑怎样让开发人员能够快速调整多窗口的布局&#xff0c;灵活构建自己喜欢的日常界面。这种基于菜单条和悬浮面板的新界面也让Windows平台其他软件开发者豁然开朗&#xff0c;开始各种借鉴。微软…

利用赫夫曼编码进行数据解压

基本概念 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import java.security.AlgorithmConstraints; import java.util.*;/*** 创建人 w…

Spring Bean 定义

转载自 Spring Bean 定义 Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化&#xff0c;组装&#xff0c;并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的&#xff0c;例如&#xff…

mysql5.7安装

MySQL 5.7 安装教程&#xff08;全步骤、保姆级教程&#xff09;_普通网友的博客-CSDN博客_mysql5.7的安装教程 Index of /mysql/downloads/MySQL-5.7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror This application requires Visual Studio 2013 x64 Redistribut…

检测窥屏_开挂、狙击、窥屏?乱象丛生的炉石狂野天梯,到底怎么了?

今日正文1 中午吃饭时&#xff0c;我第二十三次诱惑牌酱跟我一起去狂野玩&#xff0c;在他第二十三次拒绝后&#xff0c;我问他为什么&#xff0c;他放下了筷子看着我&#xff0c;只说了一个字&#xff1a;“乱”乱&#xff1f;嗯&#xff0c;想想最近的狂野&#xff0c;不论是…

.NET Core log4net 使用

log4net .NET Core 版使用&#xff0c;log4net 2.0.7版发布也有一段时间了&#xff0c;从2.0.6 版开始就已经支持.NET Core。 之前有介绍NLog .NET Core版的使用&#xff0c;ASP.NET Core 开发-Logging 使用NLog 写日志文件。 ASP.NET Core已经内置了日志支持,可以轻松输出到控…

Spring Bean 作用域

转载自 Spring Bean 作用域 Bean 的作用域 当在 Spring 中定义一个 bean 时&#xff0c;你必须声明该 bean 的作用域的选项。例如&#xff0c;为了强制 Spring 在每次需要时都产生一个新的 bean 实例&#xff0c;你应该声明 bean 的作用域的属性为 prototype。同理&#xff…