哈夫曼编码的实现

2023-11-15

2. 哈夫曼编码的实现。对教材P167中习题5.18,编码实现哈夫曼编码树,并对“Chapter Graphs surveys the most important graph processing problems  including depth-first search breadth first search minimum spanning trees and shortest paths ”语句使用构造的哈夫曼编码进行压缩(不区分大小写),对压缩后的数据进行解压缩。

(由于运行结果图片无法上传,故请见谅,请读者自行复制代码调试)

package main;

public class note {
	private note left;
	private note right;
	private int weight;
	private String letter;
	private String code;
	public note(){
		this.left=null;
		this.right=null;
		this.weight=0;
		this.letter="";
		this.code="";
		
	}
	/*
	 * 用于获取相应的属性
	 */
	public note getleft(){
		return this.left;
	}
	public note getright(){
		return this.right;
	}
	public int getweight(){
		return this.weight;
	}
	public String getletter(){
		return this.letter;
	}
	public String getcode(){
		return this.code;
	}
	/*
	 * 用于设置相应的属性
	 */
	public void setleft(note left){
		this.left=left;
	}
	public void setright(note right){
		this.right=right;
	}
	public void setweight(int weight){
		this.weight=weight;
	}
	public void setletter(String letter){
		this.letter=letter;
	}
	public void setcode(String code){
		this.code=code;
	}
}

package main;

import java.util.*;

public class huffman {
 public static void main(String[] args){
	 note[] Notes=new note[27];
	 ArrayList list=new ArrayList();
	 list=newlist(Notes);
	 note n=new note();
	 n=gettree(list);
	 list=getcode(n);
	 //输出每个字符对应的编码。
	 for(int j=0;j<list.size();j++){
		 n=(note)list.get(j);
		 System.out.print(n.getletter()+": ");
		 System.out.println(n.getcode());
	 }
	 String str="Chapter Graphs surveys the most important graph processing problems  including depth first search breadth first search minimum spanning trees and shortest paths ";
	 str=str.toLowerCase();
	 System.out.println(str);//输出原始字符串。
	 str=compress(str,list);
	 System.out.println(str);//输出压缩后的字符编码。
	 str=unzip(str,list);
	 System.out.println(str);//输出解压缩后的字符串。
 }
 
 //初始化list和所有的节点
 public static ArrayList newlist(note[] Notes){

	 for(int i=0;i<Notes.length;i++){
		 Notes[i]=new note();
	 }
	 Notes[0].setletter(" ");
	 Notes[0].setweight(173);
	 Notes[1].setletter("a");
	 Notes[1].setweight(68);
	 Notes[2].setletter("b");
	 Notes[2].setweight(13);
	 Notes[3].setletter("c");
	 Notes[3].setweight(26);
	 Notes[4].setletter("d");
	 Notes[4].setweight(35);
	 Notes[5].setletter("e");
	 Notes[5].setweight(102);
	 Notes[6].setletter("f");
	 Notes[6].setweight(18);
	 Notes[7].setletter("g");
	 Notes[7].setweight(17);
	 Notes[8].setletter("h");
	 Notes[8].setweight(49);
	 Notes[9].setletter("i");
	 Notes[9].setweight(58);
	 Notes[10].setletter("j");
	 Notes[10].setweight(2);
	 Notes[11].setletter("k");
	 Notes[11].setweight(6);
	 Notes[12].setletter("l");
	 Notes[12].setweight(34);
	 Notes[13].setletter("m");
	 Notes[13].setweight(21);
	 Notes[14].setletter("n");
	 Notes[14].setweight(55);
	 Notes[15].setletter("o");
	 Notes[15].setweight(59);
	 Notes[16].setletter("p");
	 Notes[16].setweight(16);
	 Notes[17].setletter("q");
	 Notes[17].setweight(1);
	 Notes[18].setletter("r");
	 Notes[18].setweight(48);
	 Notes[19].setletter("s");
	 Notes[19].setweight(51);
	 Notes[20].setletter("t");
	 Notes[20].setweight(77);
	 Notes[21].setletter("u");
	 Notes[21].setweight(24);
	 Notes[22].setletter("v");
	 Notes[22].setweight(9);
	 Notes[23].setletter("x");
	 Notes[23].setweight(2);
	 Notes[24].setletter("w");
	 Notes[24].setweight(19);
	 Notes[25].setletter("y");
	 Notes[25].setweight(16);
	 Notes[26].setletter("z");
	 Notes[26].setweight(1);
	 ArrayList list=new ArrayList(27);
	 for(int i=0;i<27;i++){
		 list.add(Notes[i]);
	 }
	 return list;
 }
 
 //获取list集中的一个权重最小节点
 public static note getmin(ArrayList list){
	 note min=new note();
	 note compare=new note();
	 min=(note) list.get(0);
	 
	 for(int i=1;i<list.size();i++){
		 compare=(note)list.get(i);
		 if(min.getweight()>compare.getweight()){
			 min=compare;
		 }
	 }
	 return min;
 }
 
 //将list集中的两个权重最小节点合并成一个新节点并返回一个新的list。
 public static ArrayList getnewlist(ArrayList list){
	 note l=new note();
	 note r=new note();
	 note n=new note();
	 //获取字母表的最小两个节点并合并成一个新节点
	 l=getmin(list);
	 n.setleft(l);
	 list.remove(l);
	 r=getmin(list);
	 n.setright(r);
	 list.remove(r);
	 //设置新节点的权重和包含的字母
	 n.setweight(l.getweight()+r.getweight());
	 n.setletter(l.getletter()+r.getletter());
     list.add(n);
	 return list;
 }
 
 //获得最终的哈弗曼树
 public static note gettree(ArrayList list){
	 note tree=new note();
	 while(list.size()!=1){
		 list=getnewlist(list);
	 }
	 tree=(note)list.get(0);
	 return tree;
 }
 //根据哈弗曼树形成相应的哈弗曼编码
 public static ArrayList getcode(note tree){
	 ArrayList list=new ArrayList();
	 String code="";
	 String ch="";
	 note middle=new note();//中间辅助用的
	 note letters=new note();//字符
	 note[] Notes=new note[27];
	 list=newlist(Notes);
	 for(int i=0;i<list.size();i++){
		 letters=(note)list.get(i);
		 ch=letters.getletter();
		 if(tree.getletter().contains(ch)){
			 code="";
			 middle=tree;
			 while(middle.getleft()!=null||middle.getleft()!=null){
				 if(middle.getleft()!=null&&middle.getleft().getletter().contains(ch)){
					 code=code+"1";
					 middle=middle.getleft();
					 }
				 if(middle.getright()!=null&&middle.getright().getletter().contains(ch)){
					 code=code+"0";
					 middle=middle.getright();
					 }
				 }
			 letters.setcode(code);
			 list.remove(i);
			 list.add(i,letters);
		 }
	 }
	 return list;
 }
 //对字符串进行压缩。
 public static String compress(String str,ArrayList list){
	 String codes="";
	 codes=str;
	 for(int j=0;j<list.size();j++){
		 codes=codes.replace(((note) list.get(j)).getletter(),((note) list.get(j)).getcode());
	 }
	 return codes;
 }
 //对已经压缩了的字符串进行解压缩。
 public static String unzip(String code,ArrayList list){
	 String dates="";
	 //dates=code;
	 for(int i=0;i<code.length();){
		 for(int j=0;j<list.size();j++){
			 int index=code.indexOf(((note)list.get(j)).getcode(),i);
			 if(i==index){
				 i=i+((note)list.get(j)).getcode().length();
				 dates=dates+((note)list.get(j)).getletter();
				 break;
			 }
			 }
	 }
	 return dates;
 }

}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈夫曼编码的实现 的相关文章

  • Ajax在返回集合后,数据到复杂表格的应用

    通常 我们无论是用普通Ajax机制还是利用框架 在处理返回的问题上 都会遇到这样的问题 如 我们要将一个List
  • Cobbler 登录web界面提示报错“Internal Server Error”

    第一部分直接转载摘录JasonMingHao的博客 Cobbler 登录web界面提示报错 Internal Server Error 来说明问题哈 在访问cobbler web界面到时候出现以下提示 ssl的报错日志如下 root Cob
  • buck-boost电路计算

    以下内容来自唐老师讲电赛 各大公司的计算器 链接 https pan baidu com s 1dhKB G3no0AHLTt QwjtUg 提取码 5kah
  • 凸优化学习(七)——SVM“1-范数”的软边界

    注意 本文内容来自于吴恩达老师cs229课堂笔记的中文翻译项目 https github com Kivy CN Stanford CS 229 CN 中的凸优化部分的内容进行翻译学习 3 SVM L 1 L 1 L1 范数的软边界 为了看
  • AlertDialog,当点击按钮时,能够根据界面上输入的数据,弹出对话框,显示界面中输入的相关信息

    我的代码采用分离监听器的模式 即不在 setOnclickListener 中 new OnClickListener public class MainActivity extends Activity implements View O
  • 【Android】APT与JavaPoet学习与实战

    PS 本文讲解的APT全称为Annotation Processing Tool 而非是Android Performance Tuner 这两种工具简称皆为APT 前者是 注释处理工具 后者是 Android性能调试器 本文分别使用Jav
  • 使用--link实现容器互联,很简单

    大家好 今天分享docker 使用 link实现容器互联 运行镜像 root localhost docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root lo
  • 基于STM32MP157调试MIPI-DSI屏幕

    平台 STM32MP157 屏幕 mipi dsi接口 1024x600 内核版本 linux5 4 本人是第一次调试mipi屏 在157这个平台上遇到的问题有一点多 接下来简单的描述下我的调试经验 一 先配置一下设备树DTB ltdc p
  • 学习java随堂练习-20220617

    目录 第1题 今天是学习Java的第十四天 1道练习题 第1题 题目 运行结果 代码如下 1 Student 描述学生类 属性 学号 姓名 性别 电话 方法 显示详细信息 public class Student private Strin
  • java代码 阿里云短信 手机接受验证码

    package com antifreeze server controller import com aliyuncs DefaultAcsClient import com aliyuncs IAcsClient import com
  • AppDomain 和动态加载

    应用程序体系结构 在我专攻代码之前 我想谈谈我尝试做的事 您可能记得 SuperGraph 让您从函数列表中进行选择 我希望能够在具体的目录中放置外接程序程序集 让 SuperGraph 检测它们 加载它们 并找到它们中包含的所有函数 如果
  • DCDC电源设计中需要考虑的问题

    一 电子开关设计 1 为什么用MOS管做开关管 2 MOS驱动电路用图腾柱还是用推挽电路 3 MOS悬浮电压设计思想以及工作原理 二 PWM驱动波形 1 频率如何设置 2 占空比如何调整 3 三角波生成电路如何设计 4 比较器参考电压如何选
  • linux下的主要目录

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Linux系统目录结构 登录系统后 在当前命令窗口下输入 ls 你会看到 以下是对这些目录的解释 bin bin是Binary的缩写 这个目录存放着最经常使用的命令 boo
  • 将lgbm模型进行5折交叉验证,并用GridSearchCV进行超参搜索,并打印输出每一折的精度...

    你可以使用 sklearn 的 GridSearchCV 函数来实现 lgbm 模型的 5 折交叉验证和超参数搜索 首先 需要定义模型和要调整的超参数的范围 import lightgbm as lgb from sklearn model
  • 1001 害死人不偿命的(3n+1)猜想 (15分)_Quentin

    题目链接 1001 害死人不偿命的 3n 1 猜想 15分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉
  • 【翻译】知识的诅咒

    巧合的是 本周我和五组不同的人进行了同样的对话 我想我应该把我的想法写下来 并把它们写在博客上 因为这一连串的想法似乎引起了很多人的共鸣 这场对话从一个偏见开始 和我一起工作的许多人是工程师 他们后来可能已经成为高级领导或高管 但他们曾经是

随机推荐

  • ios 固定定位 input获取焦点,ios 滚动条滚动 fixed固定定位失效,位置偏移

    http efe baidu com blog mobile fixed layout 还发现一个问题就是ios input设置readonly 还是能看到光标 然后解决方法是在行内写了 nf cus this blur
  • Zabbix 4.0升级5.0 &&ES 6.1升级7.0

    Zabbix 4 0升级5 0 一 升级方案 1影响范围 升级期间 不会影响到现有的系统 系统将保持正常的运行 升级完成后 将进行一段时间的可用性测试 待系统稳定后将替换生产上的监控 2升级方法 本次升级采用蓝绿部署的方式 先在测试环境重新
  • com中abc.h不能修改,只能修改abc.idl,生成abc.h

    如题 犯了这个错误
  • 小笔记1:在Unity中导入模型后,材质被锁定后无法更改

    每天进步一点点小笔记 解决方案 方法1 在资源里查找到该模型 右侧inspector栏 Materials location选择Use External Material 点击Apply导入便可以编辑 方法2 在资源里查找到该模型 右侧in
  • opkg软件源设置

    opkg软件源定义在 etc opkg distfeeds conf 更新 etc opkg conf并没有什么卵用 文件中 包含软件源索引的目录路径 分为base luci management packages routeing tel
  • live555 流媒体开源库

    live555对每一个从事过流媒体开发的从业者而言 都不曾陌生 就像每一个从事音视频行业的从业者而言 ffmpeg也不曾陌生 随着行业需求的发展 live555也是越见强大 因前几天帮朋友项目查找问题 重拾live555 没想到时隔10年
  • 树莓派修改国内软件源

    编辑sources list文件 sudo nano etc apt sources list 注释掉现有的代码 新增以下代码 deb http mirrors tuna tsinghua edu cn raspbian raspbian
  • 精准营销获客如何成为企业未来的发展趋势 ,运营商大数据

    精准营销最大的优势在于 精准 即在细分市场的基础上 对不同的消费者进行详细分析 确定目标受众 精准营销的主要特点如下 1 数据范围广 可以说是全球数据 目前 中国三大运营商覆盖了数十亿互联网用户 可以说是非常全面的 可以满足各个行业的需求
  • 并发编程系列之原子操作实现原理

    前言 上节我们讲了并发编程中最基本的两个元素的底层实现 同样并发编程中还有一个很重要的元素 就是原子操作 原子本意是不可以再被分割的最小粒子 原子操作就是指不可中断的一个或者一系列操作 那么今天我们就来看看在多处理器环境下Java是如何保证
  • Kali Linux版本手动更新

    Kali Linux版本手动更新 前言 一 查看版本信息 二 更换apt源 三 apt get的使用 四 查看版本信息 总结 前言 学校这几天在上实训课 用到kali 老师推荐下载最新的版本 大家纷纷把原有的kali删了再到官网下最新版本的
  • Sentinel 原理讲解

    Blog Posts Sentinel 为 Dubbo 服务保驾护航 by Eric Zhao 在生产环境中使用 Sentinel 控制台 by Eric Zhao Sentinel 与 Hystrix 的对比 by Eric Zhao G
  • 基于51单片机的停车场车位管理系统

    具体实现功能 由AT89S52单片机 AT24C02数据存储模块 按键模块 LCD1602显示 报警模块等构成 具体功能 1 显示停车场现有车辆数和已停放过车辆数 总共16个车位 指示灯指示具体的车位占用情况 2 可以手动设置总车位数以及剩
  • 回归算法-概述

    回归算法 概述 Regression Algorithms Overview 回归概论 Introduction to Regression Regression is another important and broadly used
  • Upload-labs文件上传漏洞(空格绕过)——Pass06

    0 00 题目描述 似乎可以使用Pass04文件改写 但是感觉应该不会那么简单 0 01 源码分析 is upload false msg null if isset POST submit if file exists UPLOAD PA
  • jsPDF(高清),html导出多页pdf(分享)

    前言 遇到在html导出PDF的需求 在csdn找了很多关于PDF导出功能的文章 介绍了jsPDF iText和wkhtmltopdf三种方式 其中iText的使用对于中文还需要导入特定字体包 wkhtmltopdf需要配置服务器环境 综合
  • 程序员绩效总结_华为的研发人员薪酬体系你学不会,不如这4种绩效模式

    最近 不少研发型企业的学员咨询我们 研发人员的薪酬绩效体系怎么做 今天我简单为大家介绍一下具体的操作方式 提到研发人员薪酬绩效体系 绕不开中国一个响当当的高科技企业 华为 华为的工资体系是怎样的 华为的研发团队组织结构发生过两次重大调整 从
  • 【详解】指针与函数传参——多图、多例子(c语言)

    前言 在用c语言实现链表时 会有很多朋友无法理解明明传了指针到函数中 函数中对指针改变却无法影响原函数中指针的位置 事实上 这是因为你对形参和实参的关系理解还不够透彻 通过这篇文章 我将告诉你指针传参时 函数的形参到底该选择怎样的类型接收
  • jquery——zTree, 完美好用的树插件

  • 记一次udp服务性能优化经历

    目录 概述 磁盘io 网络io 减少重复计算 减少内存复制 减少互斥锁 概述 手上有个go项目 接收udp信息 主要是syslog和snmp trap 并查询设备信息 将信息结构化 设备ip名称 匹配了什么规则之类的 后发送到kafka和e
  • 哈夫曼编码的实现

    2 哈夫曼编码的实现 对教材P167中习题5 18 编码实现哈夫曼编码树 并对 Chapter Graphs surveys the most important graph processing problems including de