- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须实现LZ78的编码器和解码器来压缩.txt,然后解压缩.txt
为此,我已经制作了编码器,文本输出的编码如下:
Text: "I have to improve my english"
Coded: "0I0 0h0a0v0e2t0o2i0m0p0r..."
LZ78 使用字典,字符串中的数字表示长字典条目的索引,如果该字母不在字典中,则为 0。
问题是:如果文本字符串是数字链,如何区分索引的数字和文本字符串的数字?
Text: "56786263...1234" <- the last entry can be ((index 12 concat'3')concat index 4) instead of (index 123 concat '4')
Coded: "050607082223...'randomnumber'4"
Dictionary: (List<String>)
...
123: 'randomnumber' <- this is saved as a string
...
如果字典的条目不超过 9 个,就没有问题。我不能使用分隔符,因为这会在编码文本中添加大量数据。我必须使用 bufferedReader 从编码文本中获取数据。如果有不清楚的地方,我会提供一些额外的信息。
BufferedReader bufR = new BufferedReader(new FileReader(codedText));
BufferedWriter bufW = new BufferedWriter(new FileWriter(decodedText));
List<Character> list = new ArrayList<Character>();
int i=0;
int aux=bufR.read();
while(aux!=-1) {
list.add((char)aux);
i++;
aux=bufR.read();
}
System.out.println(list);
这样,我就在“列表”中列出了用其他方法压缩的字符序列。但问题是,如果字母是数字,没有任何类型的可写分隔符,如何对“数字/字母”对进行分组。
添加完整代码
public class LZ78 {
List<String> diccionario;
public LZ78() {
diccionario = new ArrayList<String>();
diccionario.add(null);
}
public List<Character> codificar(List<Integer> listaNumeros){
String codif="";
List<Character> listaC =new ArrayList<Character>();
String letra="";
boolean brea=false;
int posicion=0;
for(int i=0;i<=listaNumeros.size()+1;i++){
int num=listaNumeros.get(i);
letra+=(char)num;
if(!diccionario.contains(letra)){
diccionario.add(letra);
codif+=0;
listaC.add('0');
codif+=letra;
char paso=letra.charAt(0);
listaC.add(paso);
letra="";
}else{
while(diccionario.contains(letra)){
i++;
if(i>=listaNumeros.size()){
brea=true;
if(!diccionario.contains(letra)){
listaC.add('0');
char paso2=letra.charAt(0);
listaC.add(paso2);
}else{
int index=diccionario.indexOf(letra);
String paso3=""+index;
for (int j = 0; j < paso3.length(); j++) {
listaC.add(paso3.charAt(j));
}
}
System.out.println("BREAK!");
break;
}
posicion=diccionario.indexOf(letra);
num=listaNumeros.get(i);
letra+=(char)num;
}
if(brea){
break;
}
i++;
diccionario.add(letra);
letra=""+letra.charAt(letra.length()-1);
codif+=posicion;
String numero=""+posicion;
for (int j = 0; j < numero.length(); j++) {
listaC.add(numero.charAt(j));
}
codif+=letra;
char paso=letra.charAt(0);
listaC.add(paso);
letra="";
i--;
}
}
System.out.println(codif);
return listaC;
}
//public void decodificar(List<Integer>)
public void codificacion(File textoPlano, File textoPlanoCodificado)
throws IOException {
BufferedReader bufLectura = new BufferedReader(new FileReader(
textoPlano));
BufferedWriter bufEscritura = new BufferedWriter(new FileWriter(
textoPlanoCodificado));
List<Integer> list = new ArrayList<Integer>();
int i=0;
int cosa=bufLectura.read();
while(cosa!=-1) {
list.add(cosa);
i++;
cosa=bufLectura.read();
}
List<Character> code=codificar(list);
char[] codigo=new char[code.size()];
for (int j = 0; j < code.size(); j++) {
//System.out.print(j+":'"+code.get(j)+"' ");
codigo[j]=code.get(j);
bufEscritura.write(codigo[j]);
}
System.out.println("FIN codificacion");
bufEscritura.close();
}
public void decodificacion(File textoC, File textoD) throws IOException{
BufferedReader bufLectura = new BufferedReader(new FileReader(textoC));
BufferedWriter bufEscritura = new BufferedWriter(new FileWriter(textoD));
List<Character> list = new ArrayList<Character>();
int i=0;
int cosa=bufLectura.read();
while(cosa!=-1) {
list.add((char)cosa);
i++;
cosa=bufLectura.read();
}
System.out.println(list);
//List<Integer> list2 =decodificar(list);
/*
List<Character> code=codificar(list);
char[] codigo=new char[code.size()];
for (int j = 0; j < code.size()-1; j++) {
codigo[j]=code.get(j);
bufEscritura.write(codigo[j]);
}
System.out.println("FIN codificacion");
bufEscritura.close();
*/
}
public static void main(String[] args) throws IOException {
LZ78 lz78 = new LZ78();
File textoPlano, textoPlanoCodificado, textoPlanoDecodificado;
textoPlano = new File("C:/pruebas/T.txt");
textoPlanoCodificado = new File("C:/pruebas/TOut.txt");
textoPlanoDecodificado = new File("C:/pruebas/TDecOut.txt");
lz78.codificacion(textoPlano, textoPlanoCodificado);
lz78.decodificacion(textoPlanoCodificado, textoPlanoDecodificado);
/*
* textoPlano = new File("C:/pruebas/MobyDick.txt");
* textoPlanoCodificado = new File("C:/pruebas/MobyDickOut.txt");
* textoPlanoDecodificado = new File("C:/pruebas/MobyDickDecOut.txt");
* lz78.codificacion(textoPlano, textoPlanoCodificado);
* lz78.decodificacion(textoPlanoCodificado, textoPlanoDecodificado);
*
* textoPlano = new File("C:/pruebas/Quixote.txt"); textoPlanoCodificado
* = new File("C:/pruebas/QuixoteOut.txt"); textoPlanoDecodificado = new
* File("C:/pruebas/QuixoteDecOut.txt"); lz78.codificacion(textoPlano,
* textoPlanoCodificado); lz78.decodificacion(textoPlanoCodificado,
* textoPlanoDecodificado);
*/
}
}
最佳答案
注意:我假设这是家庭作业。如果不是,那么您应该对位(而不是字符)进行操作并实现 LZW而不是LZ78
字典索引的长度取决于字典的总大小。虽然只有 9 个条目,但您只能使用 1 个字符。一旦字典中有 10 个条目,您就需要使用 2 个字符作为所有条目的索引。
请注意,解码器在处理流时会知道它看到了多少个字典条目,因此您不需要单独存储字典的大小,只需逐渐增加用于存储索引的字符数即可。 即一旦您存储了第 10 个字典条目,您就开始为所有 future 索引使用 2 个字符。在输入第 100 个字典条目后,您将使用 3 个字符,依此类推。
编辑:This link有一个逐步示例,显示在解码阶段重建字典。尽管该链接描述了 LZW (不是 LZ78),但其想法是相同的:您需要在解码时重建整个字典,并且不能重用编码步骤中的字典(例如,考虑解码器和编码器可能位于不同计算机上的情况-> 字典不通过网络发送。)
关于java - 用Java实现LZ78算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443035/
我正在使用 crc32(initial_crc_value,data,data_length); 生成一个 crc32 值。如果我没有在链接器选项中使用 -lz,我将收到链接器错误 "undefine
我正在尝试弄清楚如何证明用于压缩的 Lempel ZIV 77 算法确实提供了最佳压缩。 我找到了以下信息: So how well does the Lempel-Ziv algorithm wor
LZ-string 的哪种类型的 mysql 数据压缩结果?在我的数据库中,此变量为 MEDIUMTEXT 类型和排序规则 UTF8bin。使用post方法(asp.net core web serv
对于 xcode 中的其他链接器标志,-lz 意味着什么。我经常看到它与 -Objc 一起使用,或者它也可以独立使用吗?它的用途是什么?我正在使用 xcode 7.0.0 最佳答案 @Mozilla
我有兴趣实现用于压缩 ECG 信号的 LZ 算法,并希望优化与微 Controller 相关的代码。 这样压缩和解压缩 ECG 信号的熵效率更高,花费的时间更少。我完全不知道我是如何实现这一目标的。我
我正在尝试使用 quickfix 库编译代码: g++ -o main tradeclient.cpp Application.cpp -std=c++11 -fexceptions -finline
error: Ld /Users/mymac/Library/Developer/Xcode/DerivedData/Fitness-drawjjdksjmgttbwvhjuzicescoz/Buil
这让我发疯,当我尝试在模拟器上编译时,一切正常,但在设备上我遇到了这个错误: ld: library not found for -lz Command /Developer/Platforms/iP
我正在尝试在 Ubuntu 10.04 下编译 Android 源代码。我收到一条错误消息, /usr/bin/ld: cannot find -lz 你能告诉我如何解决它吗? cannot find
您好,我想在我的项目中使用 Google Maps API,我已经添加了 libz.dylib。当我在其他链接器标志中编写 -ObjC 以链接 Google Maps API 时,它工作正常但是当我删
我需要计算二进制字符串的 LZ 复杂度。 LZ 复杂度是从头到尾查看流时遇到的差异子串的数量。例如: s = 1001111011000010 在不同子串中标记序列复杂度c(s) = 6:s = 1/
在 ubuntu-13.04 上,使用 linux 发行版提供的 GCC-4.7.3 从共享库构建可执行文件时出现错误。 我猜问题出在libpng和zlib之间(前者使用后者),但我不知道为什么。 首
我知道这些是一些常见/基本的库,但它们到底是什么意思? 例如,我知道 -lm是一些数学库,但这是标准数学库还是什么? -lz压缩?什么压缩? 我不知道 -lrt 是什么是。 这些是什么东西? 数学库。
我想安装 uwsgi 但我无法安装。它是 Fedora 18 64 位系统。 python 是 2.7 版,yum install zlib 说:Package zlib-1.2.7-9.fc18.x
如果我解压缩 initrd.lz 然后重新打包而不做任何更改,然后将它替换为 Casper 目录中的新 initrd.lz for live CD。它是结构化的。在打包 initrd 时,我收到如下警
我按此顺序链接 CodeBlocks 中的库, -lz -L/usr/local/lib -L/usr/local/include -pthread -lswscale -lavutil -lavco
我不明白我的错误: LdLibrary/Developer/Xcode/DerivedData/Test-aywxyvnakaqhmwfbwellynwqmoik/Build/Products/Deb
我正在使用 lz-string.js 的 LZString.compressToBase64 函数并且需要在服务器端对数据进行解压/压缩。 明显的解决方案似乎是 lz_string_csharp但我很
尝试为 iOS 5 编译软件时,XCode 4.2 抛出错误: ld: library not found for -lz.1.2.3 我发现这篇文章告诉我要替换 1.2.3。与 1.2.5 http
我正在尝试从源代码“openssl-1.0.1j”进行编译,但失败并显示消息: “/usr/bin/ld: 找不到 -lz” 树莓派上的环境是 debian wheezy。 我的文件树: ├── zl
我是一名优秀的程序员,十分优秀!