信息论实验:lz78编码和解码算法

实验目的:理解LZ78编码算法。
实验内容:写出程序,利用LZ78编码实现对某字符序列的二元压缩(二元压缩,即编成二进制序列),并能解压。
实验步骤:
1、压缩
(1) 为字符序列中可能出现的字符进行二进制编码
(2) 根据LZ78编码算法为字符序列分段;
(3) 为各段分配二进制段号,并建立字典;
(4) 为字符序列的各段进行二进制编码。
2、解压
(1) 一边建立字典表,一边译码

仅仅是对序列的压缩

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define SIZE 100typedef struct chcode{char ch[128];
}chcode;typedef struct { //记录每个段的短语 int p; //长度 char bits[1000];//每个段的二进制序列  char code[1000]; //编码
}word;typedef struct {// 数据字典 int dnum;     //段总数word list[1000];//数据字典 ,数组的下标的n位二进制就是段号
}dictionary;dictionary ifodic;
chcode evech;
int d1,d2;
//为什么二进制的数据不能很好地读取出来
int compresslz(char* ifo, char* compressifo){//分段,将每一段存入bits中 将原来ifo数组的每一个元素的ascall编码的二进制作为单子符的编码int index = 0,flag;int i,j,k, msglen;int len = 0;char c[8];char buf[512];word words;words.p = 0;ifodic.dnum = 0;len = strlen(ifo);msglen = len; //记录长度 printf("消息序列的长度是:%d\n", len);// 遍历消息序列将可能出现的字符编码,下标的n位二进制就是字符编码 len = 0;index = 0;while(ifo[index] != '\0'){c[0] = ifo[index++];
//      printf("c = %c\n",c[0]); //这里还是正常的 j = len;if(len>0) {for(i=0;i<j;i++) {if(c[0] == evech.ch[i]){break;} if(i == j-1){evech.ch[len++] = c[0];}}} else {evech.ch[len++] = c[0];}}d1 = ceil(log(len)/log(2));printf("字符编码的位数的d1 = %d\n",d1);len = 0;index = 0;c[0] = 0;words.bits[0] = '\0'; while(ifo[index]!='\0'){c[0] = ifo[index++];words.p += 1;strcat(words.bits, c); j = len;if(len > 0){for(i=1; i<=j; i++){if(ifodic.list[i].p == words.p){if(strcmp(ifodic.list[i].bits, words.bits) == 0){break;   }   }if(i==ifodic.dnum) {len++;ifodic.list[len].bits[0] = '\0'; //清空ifodic.list[len].p = words.p;strcat(ifodic.list[len].bits, words.bits);ifodic.dnum++;words.p = 0;words.bits[0] = 0; flag=index;}   }} else {len++;ifodic.list[len].bits[0] = 0; //清空ifodic.list[len].p = words.p ;strcat(ifodic.list[len].bits, words.bits);ifodic.dnum++;words.p = 0;words.bits[0] = 0;flag = index;}if(ifo[index] == '\0' && flag<msglen) {printf("\n无法再分段的:%s\n",ifo+flag);len++;ifodic.list[len].bits[0] = 0; //清空ifodic.list[len].p = words.p ;strcat(ifodic.list[len].bits, words.bits);ifodic.dnum++;words.p = 0;words.bits[0] = 0;flag = index;} }printf("段数 = %d\n", ifodic.dnum);//计算段的位数 d2 = ceil(log(ifodic.dnum)/log(2));printf("段的位数d2 = %d\n",d2);j=0;//为段编码for(i = 1;i <= ifodic.dnum; i++){buf[0] = 0;k = 0;if(ifodic.list[i].p == 1){ //对于单字符短语 for(int n=0;n < d2;n++) { //段号是0*n strcat(buf,"0");}strcat(ifodic.list[i].code, buf);//找到该字符的下标for(j = 0;j < strlen(evech.ch);j++) {if(ifodic.list[i].bits[0] == evech.ch[j]) break;  }itoa(j,buf,2);//将代表字符编码的下标转成二进制 len=strlen(buf);for (int n = d1;n>len; n--) {strcat(ifodic.list[i].code,"0"); //不够d1位补0 }strcat(ifodic.list[i].code, buf);printf("%s:%s\n",ifodic.list[i].bits,ifodic.list[i].code);} else { //对于两个字符及以上的短语的编码for(index = 1;j<i;index++) {if(ifodic.list[i].p - 1 == ifodic.list[index].p ) {if(memcmp(ifodic.list[i].bits,ifodic.list[index].bits,ifodic.list[index].p) == 0) break;}}itoa(index,buf,2);len=strlen(buf);for (int n = d2;n>len; n--) {strcat(ifodic.list[i].code,"0"); //不够d2位补0 }strcat(ifodic.list[i].code, buf);// 找到短语中最后一个字符的编码c[0] = 0;buf[0] = 0;strcat(c,ifodic.list[i].bits + ifodic.list[index].p);for(j = 0;j < strlen(evech.ch);j++) {if(c[0] == evech.ch[j]) break;}itoa(j,buf,2);//将代表字符编码的下标转成二进制 len=strlen(buf);for (int n = d1;n>len; n--) {strcat(ifodic.list[i].code,"0"); //不够d1位补0 }strcat(ifodic.list[i].code, buf);printf("%s:%s\n",ifodic.list[i].bits,ifodic.list[i].code);} } //将段的编码保存compressifo[0] = '\0';for(i=1; i<=ifodic.dnum; i++) {strcat(compressifo,ifodic.list[i].code);}return 1;
}int bintodec(char *pbin) //将二进制字符串转化为10进制
{int ii=0;int result=0;while (pbin[ii]!=0){result=result*2+(pbin[ii]-'0');ii++;}return result;
}int uncompresslz(char* compressifo) {//构建字符字典 int i,j,index,len,k1,k2;char buf[512];char c[512];int num;num = d1 + d2;dictionary lzdic;lzdic.dnum = 0;index = 1;buf[0]=0;len = strlen(compressifo);printf("len=%d\n",len);for(i=0;i<len;){memset(buf, '\0', sizeof(buf));strncpy(buf,compressifo + i,d2); //取段号 printf("取得%s ", buf);//buf转化为10进制 k1 = bintodec(buf); printf("k1 = %d ",k1);memset(buf, '\0', sizeof(buf)); if(k1 == 0){ //单字符 strncpy(buf,compressifo+i+d2,d1);//对照字符编码表k2 = bintodec(buf);printf("ch2 = %c\n",evech.ch[k2]);lzdic.list[index++].bits[0] = evech.ch[k2];lzdic.list[index-1].bits[1] = '\0';lzdic.dnum++;} else { //多字符 strcat(lzdic.list[index].bits, lzdic.list[k1].bits );// 再找到最后一个字符 strncpy(buf,compressifo+i+d2,d1);k2 = bintodec(buf);printf("取得%s ", buf);printf("k2 = %d ",k2);//对照字符编码表c[0] = '\0';c[0] = evech.ch[k2];c[1] = '\0';printf(" ch2 = %c ",evech.ch[k2]);strcat(lzdic.list[index++].bits, c);printf("bits = %s\n",lzdic.list[index-1].bits); lzdic.dnum++;}i+=num;}printf("解码后的序列为:");for(i=1;i<=lzdic.dnum ;i++){printf("%s",lzdic.list[i].bits); }return 1;
}int main() {char ifomatoin[SIZE],compressifo[SIZE*10];printf("请输入消息序列:"); scanf("%s", ifomatoin);printf("ifo = %s\n\n", ifomatoin); compresslz(ifomatoin,compressifo); printf("\n编码后的序列%s\n",compressifo);uncompresslz(compressifo);}



最后无法分段的部分不该成为一段的,不想改了。
C语言没学好,可能代码很乱。。。。。

信息论与编码:C语言实现lz78算法相关推荐

  1. lz78算法c语言,LZW数据压缩算法研究

    内容介绍 LZW数据压缩算法研究 46页 3.2万字 摘 要 随着信息化技术的蓬勃发展,日常需要处理或者传输的数据越来越多,数据的压缩也就变得越来越重要了.我们迫切的需要有好的压缩算法来支持我们的数据 ...

  2. 计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...

    信息论与编码课程设计报告 设计题目: 统计信源熵与香农编码 专业班级 电 信 12-06 学 号 学生姓名 指导教师 教师评分 2015 年 3 月 30 日 目 录 - 0 - 一.设计任务与要求 ...

  3. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)

    <信息论课程设计(香农.费诺编码)>由会员分享,可在线阅读,更多相关<信息论课程设计(香农.费诺编码)(34页珍藏版)>请在人人文库网上搜索. 1.华北科技学院信息论基础课程设 ...

  4. 信息论 输入概率的哈夫曼编码 C语言

    信息论 哈夫曼编码 C语言 哈夫曼编码是一种效率比较高的变长无失真信源编码方法.哈夫曼编码的编码方法,步骤如下: 将信源符号按概率从大到小的顺序排列,为方便起见,令p(a1)>=p(a2)> ...

  5. 信息论霍夫曼编码c语言,霍夫曼编码

    <信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实 ...

  6. 信息论与编码课件,希望传播给更多的人

    可能有些图片打不开,链接:https://pan.baidu.com/s/1azDGIkaZRVKbMMGHacNucw  提取码:1111                 附上链接,传播知识,知识无 ...

  7. 一文带你看懂算术编码(C语言)

    算术编码C语言 简介 算术编码是图像压缩的主要算法之一. 是一种无损数据压缩方法,也是一种熵编码的方法.和其它熵编码方法不同的地方在于,其他的熵编码方法通常是把输入的消息分割为符号,然后对每个符号进行 ...

  8. 信息论与编码冯桂周林著答案_信息论与编码.冯桂 周林 冯桂、周林 9787302424277 清华大学出版社 信息论与编码.冯桂 周林 正版图书...

    商品描述: 基本信息 书名:信息论与编码.冯桂 周林 定价:39.05元.注 定价是图书封底的标价,售价是顾客支付的价格. 作者:冯桂.周林 出版社:清华大学出版社 出版日期:2016-07 注 出版 ...

  9. c语言凸包算法,基于C语言的凸包算法实现

    基于C语言的凸包算法实现 非计算机专业,代码有些的不好的地方,大佬轻喷^ _ ^ 根据要求,需要使用C语言实现凸包算法--Graham扫描法,本文将从算法理解.实现思路.遇到的问题及其解决方案三个方面 ...

最新文章

  1. ActivityMQ消息持久化到HANA数据库
  2. Softer-NMS:CMU旷视最新论文提出定位更加精确的目标检测算法
  3. vs如何实现tcp连续发送多条消息_消息队列之 RabbitMQ
  4. 2013年全国首届CISA认证培训强化班成功举办
  5. python批量读取csv并写入_Python如何批量读取CSV文件中指定信息并写入doc文件命名中?...
  6. Struts2 学习系列 (2) 访问web资源
  7. note deletion case
  8. 【跃迁之路】【651天】程序员高效学习方法论探索系列(实验阶段408-2018.11.24)...
  9. 宝塔设置thinkphp的伪静态_宝塔面板与WDCP狭路相逢,谁才是国产之光?
  10. 11月 北京 | 高性能之GPU CUDA 3天密集式进阶课程
  11. Solr缓存清空、重新加载与修改
  12. 一些散落各处的移动开发好资源
  13. 老挑毛 win7 linux,图解老挑毛u盘启动工具怎么重装系统
  14. 统计学基本概念(及辨异)
  15. Cacti监控Varnish
  16. angular框架的SmartAdmin模板 如何请求后台数据
  17. matlab宝典pdf,《MATLAB 宝典(第4版)》---- 优化.pdf
  18. 计算机win764位相机驱动,Win7万能驱动64位
  19. 指付通盗刷信用卡维权连载--9月2日维权纪实
  20. 刻录linux安装光盘,如何将红旗Linux5的两个ISO安装光盘镜像刻录到一张DVD光盘上,做成安装光盘[原创]...

热门文章

  1. ElasticSearch如何不分词完全匹配搜索
  2. Core Audio I/O File Recording
  3. oracle被谷歌收购,Oracle收购SUN,IBM遇上了真正对手
  4. 培训班出来的人后来都怎么样了?(八)
  5. 【分享】中毒后360安全卫士打不开的终极解决办法
  6. 安全管家安卓_手机丢失后可能背负巨额债务,腾讯手机管家提醒注意手机安全防护 -...
  7. 文件存档、加密和解密
  8. 李国庆:建议被降级降薪员工主动辞职,网友炸了!
  9. 白皮书:OpenStack与容器的相遇相知(下)
  10. Apache Hive入门1