最近老师布置了一个上机作业,实现LZW 。刚好最近对STL掌握的还不错,写起来就比较容易,又一次体会到了C++模版库的强大,要不然代码量就*2了。
不知道老师的要求是对ASCCI码所有的字符进行压缩编码还是只对输入字符串的进行编码,不过算法都一样,我是对根据输入的串进行构造字典表,如果直接对256个字符进行构造,那更简单了。
结下来就先说一说LZW的算法,它属于无损压缩的一种,尤其对输入重复的串压缩的越彻底。
基础思想:
利用字符的重用性,每当输出一个编码,就讲一个新的string 存放到字典表中
算法流程:
1.初始化,将所有的单字符放入字典表中(这里的字符是指输入字符串中不重复的字符)
2.读入一个输入给前缀串,赋值给W
3.读入一个输入字符,赋值给K
判断:
if 没有这样的K(指输入的字符串结束了),就输出最后一个W代表的码字,break;
if WK(指将WK两个字符串合并成一个)存在于字典表
{W=WK;repeat3;}