LZW编码的C/C++实现
作者:网络转载 发布时间:[ 2016/2/3 10:46:27 ] 推荐标签:.NET 测试开发技术
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; }
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南