【手打】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\n",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;
}
【手打】LZW编码的C/C++实现的更多相关文章
- GDI+中GIF图片的显示
某位网友曾经问过我GDI+中Gif图像显示的问题,一直没时间给你写,在此致歉.我把这篇文章送给他. 一.GIF格式介绍 1.概述 GIF(Graphics Interchange Format,图形交 ...
- NOIP2010-普及组初赛C语言解析
第十六届全国青少年信息学奥林匹克联赛初赛试题 一.单项选择题 (共20题,每题1.5分,共计30分.每题有且仅有一个正确选项.) 1.2E+03表示( D ). A.2.03 B ...
- PNG,JPEG,BMP,JIF图片格式详解及其对比
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
- 【转】gif文件格式详解
1.概述 ~~~~~~~~ GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司开发的图形文件格式,版权所有,任何商业目的使用均须 Comp ...
- 音视频入门-18-手动生成一张GIF图片
* 音视频入门文章目录 * GIF 编码知识 GIF 包含的数据块: 文件头(Header) 逻辑屏幕标识符(Logical Screen Descriptor) 全局颜色表(Global Color ...
- 可能是最通俗的Lempel-Ziv-Welch (LZW)无损压缩算法详述
最近工作正好接触到这一块,试着自己总结了一下,给需要的人提供一点帮助. 一.概述 首先看看百度百科里的一句话介绍:“LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩.” 简单来 ...
- LZW压缩算法——简明原理与实现
LZW和哈夫曼编码一样,是无损压缩中的一种.该算法通过建立字典,实现字符重用与编码,适用于source中重复率很高的文本压缩.本文首先讲下LZW的编解码原理,然后给出LZW的实现code. ***** ...
- Objective-C 编码建议
Objective-C 是 C 语言的扩展,增加了动态类型和面对对象的特性.它被设计成具有易读易用的,支持复杂的面向对象设计的编程语言.它是 Mac OS X 以及 iPhone 的主要开发语言. C ...
- LZW压缩算法
转载自http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html 记录此处仅自己供学习之用 lzw解压缩算法: 用单个字符初始化字符 ...
随机推荐
- Java 操作mongodb
package cn.test.db; import java.io.File; import java.io.IOException; import java.net.UnknownHostExce ...
- CSS3 总结-1
新的边框属性 属性 描述 CSS border-image 设置所有 border-image-* 属性的简写属性. 3 border-radius 设置所有四个 border-*-radius 属性 ...
- 转:.Net程序员学习Linux最简单的方法
有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...
- 基于visual Studio2013解决C语言竞赛题之0204实数求值
题目
- C与C++ 无参函数的区别
在<C++ 编程思想>:“关于无参函数声明,C与C++有很大的差别.在C语言中,声明int fun1(),意味着一个可以有任意数目和类型的函数:而在C++中,指的却是一个没有参数的函数”. ...
- 【Hibernate】无外键多表查询
无外键多表查询时编写hql,直接使用逗号分隔表,where作为联合查询条件进行查询.查询出来的结果可为两种,List<List<Object>>或者List<Map< ...
- uboot: 理解uboot要看哪些书
概览:
- BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...
- CentOS6.5实现rsync+inotify实时同步
参考博文: 参考1:CentOS6.5实现rsync+inotify实时同步 参考2:inotify-tools+rsync实时同步文件安装和配置 CentOS 6.3下rsync服务器的安装与配置 ...
- 开大Stack的一个小技巧
在程序头部添加一行 #pragma comment(linker, "/STACK:16777216") 可有效开大堆栈 实验效果如下: 11330179 2014-08-05 1 ...