lzw压缩机制简单讲解

今天又是没什么事情干,还是测试用例,无聊看了看论坛,有人争论压缩。我主要是看看了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” 从而减少了信息量。但要有一一对应关系,使得压缩后可以被解压缩。在大学学数据结构时,霍夫曼编码,哈希编码有点了解。解压缩我不了解,只是记录下,有错误的见谅

 

 

你可能感兴趣的:(LZW)