今天又是没什么事情干,还是测试用例,无聊看了看论坛,有人争论压缩。我主要是看看了lzw数据压缩,当让还自己瞎写的一个 利用ascll的压缩。
先说说 lzw 主要的应用就是GIF,简单讲讲他的原理把。说不清楚别怪小弟啊。
这个压缩在重复字符比较多的时候压缩效果是比较好的。
例如:这个例子是从别人那摘的
ababbacb
前缀:ab那a就是前缀。
后缀:ab那b是后缀。
我们这里以2元为一组。
前缀 后缀 词 存在对应码 输出 编码
1. a (,a)
2. a b (a,b) n a 256
3. b a (b,a) n b 257
4. a b (a,b) y
5. 256 b (256,b) n 256 258
6. b a (b,a) y
7. 257 c (257,c) n 257 259
8. c b (c,b) n c 260
上面的压缩
1.在一个保存 的仓库中 去查找每一步的词是否在这个仓库中。
2.如果不存在,则把这个前缀输出,因为不存在这个词,那么前缀肯定是不会在被编码了。而后缀可以和下一个字符形成的词存在仓库中。所以说 这个2元组,并不是代表2个字符,而是大于等于2 个字符。
3.如果存在,那我不用急着输出,因为可能和下一字符形成的词还在仓库中,直到不存在时,这就是我把这几个字符压缩后所替代的编码。
大概说说了这个原理。代码从我的描述看 ,递归是个比较重要的步骤,大家可以自己想想。
今天在论坛上看见他们说了 20位数字压缩成10之内字符。
用ascll码来看的话,0-127都可以被压缩成一个字符。根据这个原理的话, 是没问题的。
代码是我随意写的,有些什么规范,效率什么的都没考虑就是实现了个功能。呵呵
private static String a="1237593842947829353985793847589234";
private static String b="";
public static void main(String args[]){
ys(0);
System.out.println(b);
jy();
}
//ascll码压缩
public static void ys(int count){
int length=a.length();
char k;
while(count+3<length){
String s=a.substring(count, count+3);
int c=Integer.parseInt(s);
if(c>127){
String e=s.substring(0, 2);
count=count+2;
k=(char)Integer.parseInt(e);
b+=k;
}
else{
count=count+3;
k=(char)c;
b+=k;
}
}
if(length-count==3){
String f=a.substring(count, length);
int g=Integer.parseInt(f);
if(g>127){
String e=f.substring(0, 2);
k=(char)Integer.parseInt(e);
b+=k;
k=(char)Integer.parseInt((f.substring(2, 3)));
b+=k;
}
else
{
b+=(char)Integer.parseInt(f);
}
}
else {
String f=a.substring(count, length);
b+=(char)Integer.parseInt(f);
}
}
//ascll解压
public static void jy(){
int length=b.length();
int count=0;
while(count<length){
String s=b.substring(count,count+1);
int m=s.charAt(0);
count++;
System.out.print(m);
}
}
压缩 应该就是一个编码问题,使“xxxxxxxx”数据编码成“yyyy” 从而减少了信息量。但要有一一对应关系,使得压缩后可以被解压缩。在大学学数据结构时,霍夫曼编码,哈希编码有点了解。解压缩我不了解,只是记录下,有错误的见谅