zoukankan      html  css  js  c++  java
  • 【手打】LZW编码的C/C++实现

    LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期。

    本代码只完毕了LZW的编码与解码算法功能,相对网上找到的非常多代码而言较为简(cai)单(bi)。了解struct && 会递归就可以,算是长处吧。

    #include <stdio.h>
    #include <algorithm>
    #include <math.h>
    #include <iostream>
    #include <stdlib.h>
    #include <string.h>
    
    using namespace std;
    
    struct Node{
    	int pre;					//前缀单词相应码字
    	char c;						//当前字符
    }KDA[65535];
    
    int cnt,P,Q;
    char W,V;
    
    void Init(){					//前256个字典由相应ASCII码生成
    	for(int i = 0;i < 256; i ++){
    		KDA[i].pre = -1;
    		KDA[i].c = i;
    	}
    	cnt = 256;
    	P = -1;
    }
    
    void Out(int x){                            //递归输出码字相应单词,首位另存用于建立字典
        if(KDA[x].pre != -1){
            Out(KDA[x].pre);
        }
        else {
            V = KDA[x].c;
        }
        printf("%c",KDA[x].c);
    }
    
    void Search(){
        int flag = 0;
    	for(int i = 0;i < cnt;i ++){
    		if(KDA[i].pre == P && KDA[i].c == W){//字典已存在则更新前缀相应码字
    			P = i;
    			flag = 1;
            }
    	}
    	if(!flag){                  //不存在则扩充字典,输出前缀相应码字并更新前缀单词
            KDA[cnt].pre = P;
            KDA[cnt].c = W;
            printf("%03X ",P);
            P = (int)W;
            cnt ++;
        }
    }
    
    void Research(){
        Out(Q);
        if(P != -1){                //假设前一位码字不为空,则将前一位相应单词作为前缀与本单词第一位合并作为新单词增加字典
            KDA[cnt].pre = P;
            KDA[cnt].c = V;
            cnt ++;
        }
    }
    
    void Compress(){<span style="white-space:pre">		</span>//编码过程
    	Init();
    	freopen("LZWin.txt","r",stdin);
    	freopen("LZWch.txt","w",stdout);
    	while((W = getchar()) && W != EOF){
    		Search();
    	}
    	printf("%03X
    ",P);
    }
    
    void Decompress(){<span style="white-space:pre">		</span>//解码过程
        Init();
        freopen("LZWch.txt","r",stdin);
    	freopen("LZWout.txt","w",stdout);
    	while(scanf("%03X",&Q)!= EOF){
    		Research();
    	}
    }
    
    int main(){
        Compress();
        Decompress();
    	return 0;
    }
    


  • 相关阅读:
    【Intellij】Intellij Idea 2017创建web项目及tomcat部署实战
    【IntelliJ 】IntelliJ IDEA 15 创建maven项目
    【IntelliJ】IntelliJ IDEA的安装破解及使用
    maven坐标查询
    【PowerDesigner】PowerDesigner之CDM、PDM、SQL之间转换
    【c3p0】 C3P0的三种配置方式以及基本配置项详解
    LinkedHashMap和HashMap的比较使用
    【全局变量】mysql查看全局变量以及设置全局变量的值
    Redis总结
    Java高概率面试题目—finally
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5164528.html
Copyright © 2011-2022 走看看