实验3 LZW编解码算法实现与分析

本文详细介绍了LZW编码和解码的过程,包括算法的每一步操作,以及词典的初始化和更新。通过建立词典树,对字符进行编码和解码,实现了数据的压缩与还原。在实验中,使用C++编程语言实现了这一算法,并得到了预期的实验结果。
摘要由CSDN通过智能技术生成

1.LZW介绍:

标题第二类词典编码算法的想法是企图从输入的数据中创建一个“短语词典”,这种短语可以是任意字符的组合,编码数据过程中当遇到已经在词典中出现的短语时,编码器就输出这个词典中的短语的“索引号”,而不是短语本身。

LZW的解码过程与编码过程都需要先初始化词典,在解码的过程中一边从词典中找到码字对应的字符串一边根据解码得到的字符串更新词典。

2.LZW编码过程

步骤1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。

步骤2:当前字符C=字符流中的下一个字符。

步骤3:判断P+C是否在词典中

(1)如果“是”,则用C扩展P,即让P=P+C,返回到步骤2;

(2)如果“否”,则输出与当前前缀P相对应的码字W;将P+C添加到词典中;令P=C,并返回到步骤2。

void LZWEncode(FILE* fp, BITFILE* bf) {
    int character;//新
    int string_code;//旧
    int index;        //词典中的索引值
    unsigned long file_length;//文件长度

    fseek(fp, 0, SEEK_END); //fp指针定位到文末
    file_length = ftell(fp);//获取输入文件长度
    fseek(fp, 0, SEEK_SET); //fp指针从新定位到开头
    BitsOutput(bf, file_length, 4 * 8);//输出的二进制文件
    
    InitDictionary();        //初始化词典
    string_code = -1;
    while (EOF != (character = fgetc(fp)))
    {
        //判断是否在字典当中,若在词典中返回索引值,若不在返回-1
        index = InDictionary(character, string_code);
        // 如果从词典中找到
        if (0 <= index) {
            string_code = index;    //p+c->p
        }
        // 如果词典中没找到
        else {
            output(bf, string_code);//输出当前前缀p对应的码字到码字流中
            if (MAX_CODE > next_code) {
                AddToDictionary(character, string_code);
            }
            string_code = character;//c->p
        }
    }
    output(bf, string_code);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值