目录

  • 一、LZW原理
    • 1.LZW简介
    • 2.LZW编码算法步骤
    • 3.LZW解码算法步骤
  • 二、代码注释
  • 三、实例应用

一、LZW原理

1.LZW简介

LZW的编码思想是不断地从字符流中提取新的字符串,通俗地理解为新“词条”,然后用“代号”也就是码字表示这个“词条”。这样一来,对字符流的编码就变成了用码字去替换字符流,生成码字流,从而达到压缩数据的目的。LZW编码是围绕称为词典的转换表来完成的。LZW编码器通过管理这个词典完成输入与输出之间的转换。LZW编码器的输入是字符流,字符流可以是用8位ASCII字符组成的字符串,而输出是用n位(例如12位)表示的码字流。

2.LZW编码算法步骤

步骤1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。
步骤2:当前字符C=字符流中的下一个字符。
步骤3:判断P+C是否在词典中
(1)如果“是”,则用C扩展P,即让P=P+C,返回到步骤2。
(2)如果“否”,则
输出与当前前缀P相对应的码字W;
将P+C添加到词典中;
令P=C,并返回到步骤2

流程图

3.LZW解码算法步骤

步骤1:在开始译码时词典包含所有可能的前缀根。
步骤2:令CW:=码字流中的第一个码字。
步骤3:输出当前缀-符串string.CW到码字流。
步骤4:先前码字PW:=当前码字CW。
步骤5:当前码字CW:=码字流的下一个码字。
步骤6:判断当前缀-符串string.CW 是否在词典中。
(1)如果”是”,则把当前缀-符串string.CW输出到字符流。
当前前缀P:=先前缀-符串string.PW。
当前字符C:=当前前缀-符串string.CW的第一个字符。
把缀-符串P+C添加到词典。
(2)如果”否”,则当前前缀P:=先前缀-符串string.PW。
当前字符C:=当前缀-符串string.CW的第一个字符。
输出缀-符串P+C到字符流,然后把它添加到词典中。
步骤7:判断码字流中是否还有码字要译。
(1)如果”是”,就返回步骤4。
(2)如果”否”,结束。

流程图

二、代码注释

void PrintDictionary( void){int n;int count;for( n=256; n<next_code; n++){count = DecodeString( 0, n);printf( "%4d->", n);while( 0<count--) printf("%c", (char)(d_stack[count]));printf( "\n");}
}int DecodeString( int start, int code){int count;count = start;while( 0<=code){d_stack[ count] = dictionary[code].suffix;code = dictionary[code].parent;count ++;}return count;
}
void InitDictionary( void){int i;for( i=0; i<256; i++){dictionary[i].suffix = i;dictionary[i].parent = -1;dictionary[i].firstchild = -1;dictionary[i].nextsibling = i+1;}dictionary[255].nextsibling = -1;next_code = 256;
}
/** Input: string represented by string_code in dictionary,* Output: the index of character+string in the dictionary*      index = -1 if not found*       */
int InDictionary( int character, int string_code){int sibling;if( 0>string_code) return character;  //编码为-1sibling = dictionary[string_code].firstchild;while( -1<sibling){if( character == dictionary[sibling].suffix) return sibling;sibling = dictionary[sibling].nextsibling;}return -1;
}void AddToDictionary( int character, int string_code){int firstsibling, nextsibling;if( 0>string_code) return;dictionary[next_code].suffix = character;dictionary[next_code].parent = string_code;dictionary[next_code].nextsibling = -1;dictionary[next_code].firstchild = -1;firstsibling = dictionary[string_code].firstchild;if( -1<firstsibling){  // the parent has childnextsibling = firstsibling;while( -1<dictionary[nextsibling].nextsibling ) nextsibling = dictionary[nextsibling].nextsibling;dictionary[nextsibling].nextsibling = next_code;}else{// no child before, modify it to be the firstdictionary[string_code].firstchild = next_code;}next_code ++;
}void LZWEncode( FILE *fp, BITFILE *bf){int character;int string_code;int index;unsigned long file_length;fseek( fp, 0, SEEK_END);file_length = ftell( fp);  //得到文件长度fseek( fp, 0, SEEK_SET);BitsOutput( bf, file_length, 4*8);InitDictionary();  //字典初始化string_code = -1;while( EOF!=(character=fgetc( fp))){   // 获取下一个字符,并且指针移动  ,直到文件结束index = InDictionary( character, string_code);if( 0<=index){    // string+character in dictionarystring_code = index;}else{   // string+character not in dictionaryoutput( bf, string_code);if( MAX_CODE > next_code){    // free space in dictionary// add string+character to dictionaryAddToDictionary( character, string_code);}string_code = character;}}output( bf, string_code);
}void LZWDecode(BITFILE* bf, FILE* fp) {int character;int new_code, last_code;int phrase_length;unsigned long file_length;file_length = BitsInput(bf, 4 * 8);if (-1 == file_length) file_length = 0;InitDictionary();last_code = -1;while (0 < file_length) {new_code = input(bf);if (new_code >= next_code) { // this is the case CSCSC( not in dict)d_stack[0] = character;phrase_length = DecodeString(1, last_code);}else {phrase_length = DecodeString(0, new_code);}character = d_stack[phrase_length - 1];while (0 < phrase_length) {phrase_length--;fputc(d_stack[phrase_length], fp);file_length--;}if (MAX_CODE > next_code) {// add the new phrase to dictionaryAddToDictionary(character, last_code);}last_code = new_code;}
}

三、实例应用

文件预览 文件格式 压缩前大小 压缩后大小
txt 1KB 1KB
txt 110KB 41KB
jpg 10,984KB 15,378KB
cr2 26,553KB 36,276KB
mov 5,169KB 6,351KB
pdf 242KB 312KB
png 9KB 16KB
bmp 3KB 2KB
yuv 4,320KB 785KB
m4a 50KB 66KB

分析:
在以上十个文件中,只有长txt,bmp和yuv文件压缩后变小了。经分析,**当原文件有大量重复信息时,LZW编码方式才会显著的压缩文件。**否则反而会适得其反。

LZW编码算法原理及实例应用相关推荐

  1. 机器学习之K近邻算法原理+应用实例

    1. 基本原理 K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与"近朱者赤,近墨者黑"的原理类似,当对未分类样本进行分类时, ...

  2. MySQL索引背后的数据结构及算法原理(employees实例)

    摘要 http://blog.codinglabs.org/articles/theory-of-mysql-index.html 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特 ...

  3. 详解鲸鱼优化算法原理、数学模型和实例代码

    鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提出的一种新的群体智能优化算法,其优点在于操作简单,调整 ...

  4. LZW编码与解码的那点事

    1. 前言 在前面一片文章TIFF文件结构详解里,我们在解析TIF文件中,提到使用了LZW算法.那么LZW算法是什么呢?就让我们揭开它的神秘面纱. 2. 什么是LZW LZW算法又叫"串表压 ...

  5. C语言实现LZW编码

    LZW编码 算法思想 首先我们有一个0到255的ASCII码表,然后得到若干字符串对其进行编码,再对编码后的码流进行解码以验证. 编码: 初始化:前缀P为空,第一个字符进入后缀C 判断:P+C(P为a ...

  6. Adaboost算法原理分析和实例+代码(简明易懂)

    Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333   ...

  7. Adaboost算法原理分析和实例+代码(转载)

    [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时 ...

  8. Base64 算法原理,以及编码、解码【加密、解密】 介绍

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  9. 【算法思想】Reed-Solomon 纠错编码基础概念,编码、解码算法原理、数学公式 Python代码实现

    [算法思想]Reed-Solomon 纠错编码基础概念,编码.解码算法原理.数学公式 & Python代码实现 文章目录 [算法思想]Reed-Solomon 纠错编码基础概念,编码.解码算法 ...

  10. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

最新文章

  1. linux提取第一列且删除第一行(awk函数)
  2. 《Apache Flink官方文档》 Apache Flink介绍
  3. HTML, CSS, Javascript, jQuery之间的关系
  4. 三元一次方程组步骤_[七年级网上课堂]8.4 三元一次方程组
  5. esxi6.7虚拟机网卡连接第二个虚拟交换机_Linux云计算底层技术之网络虚拟化
  6. JavaScript HTML DOM - 改变 HTML
  7. 上海j计算机一级分值,计算机一级考试内容及分值
  8. FTP协议及工作原理
  9. qt中关于按钮的click()函数卓见
  10. php 模型 关联,PHP模型关联一对多如何给关联表加条件?
  11. Maven搭建多模块企业级项目+SSM框架搭建
  12. Web前端开发规范文档(转)
  13. RadASM with Masm32
  14. 机器学习之随机森林算法
  15. 值得分享的炒白银技巧有哪些?
  16. 上传图片显示服务器返回错误什么意思,上传图片出错时的解决步骤
  17. html5 自动弹出键盘,HTML5 input焦点键盘弹出问题
  18. ffmpeg遇到Non-monotonous DTS in output stream的问题
  19. python画板——画樱花
  20. Redis运行环境搭建

热门文章

  1. 海图水深点的标注方法
  2. 立创eda入门-原理图,PCB制作
  3. 《FireShot》一键滚动截屏整个网页
  4. 使用TTP224触摸芯片时出现的一些问题
  5. GWAS 总体流程理解版
  6. 固态硬盘SSD的接口如何选择
  7. 日本战国武将绰号与称号一览表
  8. 支付宝APP支付接口-PHP
  9. PPO:Proximal Policy Optimization Algorithms
  10. linux a卡怎么切换n卡,手把手教您win10系统a卡切换独显的具体办法