Lample-Ziv文本压缩(java实现)--学习笔记
目的:通过设计计算机程序,实现基于Lempel-Ziv 算法的英文文本文件压缩。
编码算法思想:
1)建立一个只包含“空前缀串”的字典;将文本文件读入缓冲区,然后将当前编码指针指向第一个字符。
2)从当前编码指针所指的字符开始,用它及后面所有字符作为一个字符串,在字典中查找能与该字符串的前缀匹配的最长前缀串;若没有匹配,则将“空前缀串”的编号0 作为当前码字中的编号部分,再将当前编码指针所指的输入字符“A”作为当前码字中的符号部分。输出当前码字,然后编码指针指向下一个字符;若有匹配的前缀串,则寻找最长匹配的前缀串,然后将该最长匹配前缀串在字典中的编号作为当前码字中的编号部分,再将当前输入序列中,与该前缀串匹配结束后的第一个字符“A”作为当前码字的符号部分。输出当前码字,再将编码指针指向字符“A”之后的第一个字符。
3)将上一步中,最长匹配前缀串加上字符“A”作为一个新的前缀串添加到字典中;若上一步中没有找到匹配的前缀串,则将“空前缀串”加上字符“A”作为新前缀串,实际就是将字符“A”本身添加到字典中。该前缀串编号为现有前缀串的最大编号加一。
4)若输入字符串没有处理完,则回到步骤2),否则结束编码。
说明:1、文本为英文文档。2、文档大小为53kb。
import java.io.*;
import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;/*** info* author:Civil*/
public class Encode {static byte[] data;static int[][] dictionary = new int[65536][2];static byte[] result = new byte[65536];static int out_adr = 0;//缓冲区地址起始位置public static void main(String[] args) {Instant start = Instant.now();Coding();Writing();Instant end = Instant.now();long timeElapsed = Duration.between(start, end).toMillis(); // 单位为毫秒System.out.println("编码完成!");System.out.println("耗时:" + timeElapsed + "ms");}static void Read() {try {File infile_path = new File("D:\\学习\\信息论\\题目\\c.txt");InputStream input = new FileInputStream(infile_path);data = input.readAllBytes();input.close();} catch (Exception e) {e.printStackTrace();}}static void Coding() {Read();dictionary[0][0] = 0;//起始坐标dictionary[0][1] = 0;//字典长度byte high_adr = -128;//字典地址0--n个255--高位byte low_adr = -128;//字典地址1--n个1--低位byte follow_ele = -128;//后一个int dic_len = 1;//字典长度int Max_length = 0;//最长匹配字符串长度int dic_adr = 0;//字典地址int length = 1;//匹配字符串实际长度for (int i = 0; i < data.length; i=i+Max_length+1) {Max_length = 0;//则匹配长度还原for (int j = 0; j < dic_len; j++) {if ((data[i] == data[dictionary[j][0]]) && (dictionary[j][1] > 0)) {//有匹配//末尾处理if (i + dictionary[j][1] > data.length) {continue;} else {for (int q = 1; q < dictionary[j][1]; q++) {//判断字典元素与数据流是否相等。如:111是否等于110if (data[i + q] == data[dictionary[j][0] + q]) {length++;//实际匹配长度}}if ((dictionary[j][1] > Max_length) && (length == dictionary[j][1])) {//找最长匹配Max_length = dictionary[j][1];//最长匹配长度dic_adr = j;//最长匹配的字典地址}length = 1;//还原}}}if ((Max_length == 0) | i == 0) {//空匹配{high_adr = -128;//byte类型取值范围是[-128,127],所以用-128代表0,用127代表255low_adr = -128;follow_ele = data[i];dictionary[dic_len][1] = 1;} else {//最长匹配if (i + Max_length < data.length) {int ad0;int ad1;follow_ele = data[i + Max_length];ad0 = dic_adr / 256 - 128;//[0,255]转[-128,127]--高位ad1 = dic_adr % 256 - 128;//低位high_adr = (byte) (ad0 >> 32);//int转bytelow_adr = (byte) (ad1 >> 32);//更新字典dictionary[dic_len][1] = Max_length + 1;}}//输出编码result[out_adr] = high_adr;result[out_adr + 1] = low_adr;result[out_adr + 2] = follow_ele;//更新字典dictionary[dic_len][0] = i;out_adr += 3;dic_len++;}}static void Writing() {try {File outfile_path = new File("D:\\学习\\信息论\\题目\\Coding.txt");OutputStream output = new FileOutputStream(outfile_path);byte[] out = Arrays.copyOfRange(result, 0, out_adr);output.write(out);output.close();} catch (Exception e) {e.printStackTrace();}}
}
Lample-Ziv文本压缩(java实现)--学习笔记相关推荐
- 可能是最全面的 Java G1学习笔记
转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...
- 深入浅出 Java CMS 学习笔记
转载自 深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...
- 尚学堂JAVA基础学习笔记_2/2
尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...
- java mail 学习笔记
JAVA MAIL 学习 笔记 电子邮件协议的简介 SMTP 简单邮件传输 SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议.该协议定义了邮件客户端软件和 ...
- 计算机、程序和 Java 概述 学习笔记
计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. 计算机包括硬件( hardware ) 和软件( software) ...
- java web学习笔记(持续更新)
java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习笔记之图解ByteBuffer
转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...
- 转载:mongoDB java驱动学习笔记
http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...
- 2019年Java Web学习笔记目录
Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...
最新文章
- Mysql 数据 导入 导出
- grass gis怎么使用_使用GRASS GIS返回学校
- 7种用户界面UI原则
- Linux常用的挂载远程目录方案使用有感
- OC中的字符串转换为C中的字符串
- 【专栏必读】数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解
- Grails Quartz插件,定时调度任务
- 计算机文字处理员,计算机文字录入处理员
- Java 机器学习库Smile实战(一)SVM
- MSOCache文件,带你一文看懂。
- java printout_word中printout函数的相关参数介绍 | 学步园
- yudian温控表a1温度怎么补偿_yudian温控表a1说明书
- 有效地报告自动测试结果
- gitlab安装教程、gitlab官网、英文文档
- 几何分布的期望和方差公式推导_平方差公式证明推导过程及运用详解(数学简便计算方法之一)...
- dijkstra算法为什么不能计算负权重?
- 《张艺谋这个人》较真
- 如何把手机证件照压缩到10K?手机怎么压缩照片到10K?
- SaaS的商业模式是如何影响软件公司估值
- 苹果wifi网速慢怎么办_WiFi用着用着就断了?这样设置WiFi永不断网,大部分人不知道...
热门文章
- 选择system bus还是session bus?
- 全线路IC闭环控制自动温控电热毯维修记
- ibmr系列服务器怎么装架子,R440/R540/R640/R740 R820 R930 DELL服务器导轨 滑轨 支架 理线架...
- CSDN每日打卡已经2周,进展如何?,【2021Python最新学习路线】
- linkboy+ESP32创意DIY时钟
- ajax返回map的值,同时在sucess返回时的显示
- Unity浏览器插件Embedded browser
- 高效的串行数据驱动框架
- 怎样解决问题 《how to slove it》 《在代码大全里》
- 小学信息技术 Linux,小学信息技术教育教学计划