- 1、本文档共142页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.5.3 LZW解压缩算法 将单一字母编码加入字典 顺序检查压缩文件,对每个编码p,对两种不同情况进行处理 情况1:p在字典中 q——p之前的编码 压缩时,输出q之后,必为sx分配了一个新编码? 将(新编码,sx)插入字典 对应压缩过程中添加新编码的操作,在s?q之后进行 而解压缩时,q?s之后,尚不知xt,只能推后进行 文本:…text(q) text(p)… s x t 编码:… q p… 情况2:p不在字典中 在压缩时,必然文本s压缩为q,并与随后的字符x产生新编码p,对应文本t=sx 关键:紧随s之后的文本即为t(与p对应)!否则,如果p是之前的某个u压缩后生成的,则解压完u后,必然已经将p加入字典了 t在s之后?t = sx = xs’x?x=fc(s)?p解压缩的结果应为:text(q)fc(q),将(新编码,text(q)fc(q))加入字典 文本: u … text(q) text(p)… xs’ xs’x xs’=s 编码: r … q p… 解压缩例 输入:0214537 初始,为每个字母编码:a—0,b—1 0:输出a 2:不在字典中,输出text(0)fc(0)=aa,(2, aa)?字典 1:输出b,(3, text(2)fc(1))=(3, aab)?字典 解压缩例 4:不在字典中,输出text(1)fc(1)=bb,(4, bb)?字典 5:不在字典,输出text(4)fc(4)=bbb,(5, bbb)?字典 3:输出aab,(6, text(5)fc(3))=(6, bbba)?字典 7:不在字典,输出text(3)fc(3)=aaba 结果:aaabbbbbbaabaaba 7.5.4 解压缩的实现 创建文件流 void SetFiles(int argc, char* argv[]) {// Determine file name. char OutputFile[50], InputFile[50]; // see if file name provided if (argc == 2) strcpy(OutputFile,argv[1]); else {// name not provided, ask for it cout Enter name of file to decompress endl; cout Omit the extension .zzz endl; cin OutputFile;} // name should not have an extension if (strchr(OutputFile,.)) {cerr File name has extension endl; exit(1);} 创建文件流(续) strcpy(InputFile, OutputFile); strcat(InputFile, .zzz); // open files in binary mode in.open(InputFile,ios::binary); // in.open(InputFile); for g++ if (in.fail()) {cerr Cannot open InputFile endl; exit(1);} out.open(OutputFile,ios::binary); // out.open(OutputFile); for g++ } 输出函数 void Output(int code) {// Output string corresponding to code. size = -1; while (code = alpha) {// suffix in dictionary s[++size] = ht[code].suffix; code = ht[code].prefix; } s[++size] = code; // code alpha // decompressed string is s[size] ... s[0] for (int i =
文档评论(0)