C语言行程编码压缩算法

行程编码压缩算法

Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 2009, Total Submissions: 3785

Description

RLE(Run Length Encoding行程编码)算法是一个简单高效的无损数据压缩算法,其基本思路是把数据看成一个线性序列,而这些数据序列组织方式分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。对于连续的重复数据快采用的压缩策略是用一个字节(我们称之为数据重数属性)表示数据块重复的次数,然后在这个数据重数属性字节后面存储对应的数据字节本身,例如某一个文件中有如下的数据序列AAAAA,在未压缩之前占用5个字节,而如果使用了压缩之后就变成了5A,只占用两个字节,对于连续不重复的数据序列,表示方法和连续的重复数据块序列的表示方法一样,只不过前面的数据重数属性字节的内容为1。一般的这里的数据块取一个字节,这篇文章中数据块都默认为一个字节。
具体来讲,字符串的编码规则如下:
在字符串中,2~9个相同的字符组成的子字符串用2个字符来编码表示。第1个字符是这一字符串的长度,为2~9。第2个字符是相同字符的值。如果一个字符串存在相同字符且多于9个的子串,就先对前9个字符进行编码,然后对其余相同字符组成的子串采用相同方法进行编码。例如AAAAAABCCCC编码为6A1B14C。
在字符串中,如果存在某个子串,其中没有一个字符连续重复出现,就表示为以字符1开始,后面跟着这一子串,再以字符结束。如果在字符串中存在只有1个字符1出现的子串,则以两个字符1作为输出,例如12344编码为11123124。

Input

输入一个字符串。

Output

输出RLE编码后的字符串。

  • Sample Input 
    AAAAAABCCCC12344
  • Sample Output

    6A1B14C11123124

#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,k,a[100],q;
char s[1000],*p,b[100];
p=s; 
gets(s);
k=1,j=0;
for(i=0;i<strlen(s)-1;p++,i++)//分别计算出字符串中每个字符出现的次数并存放在数组中与之一一对应
{
if(*p==*(p+1)&&i!=strlen(s)-2)k++,b[j]=*p;
else if(*p==*(p+1)&&i==strlen(s)-2)a[j]=k+1,b[j]=*p;
else if(*p!=*(p+1)&&i!=strlen(s)-2)a[j]=k,b[j]=*p,k=1,j++;
else if(*p!=*(p+1)&&i==strlen(s)-2)b[j]=*p,a[j]=k,j++,b[j]=*(p+1),a[j]=1;
}
for(i=0;i<=j;i++)
{
while(a[i]>=10)//当该字符出现次数大于9时,先将前九个输出,再继续判断
{
printf("9%c",b[i]);
a[i]=a[i]-9;
      }
if(a[i]!=1)printf("%d%c",a[i],b[i]);//字符出现次数不为1的情况直接输出次数和字符
if(a[i]==1)
{
k=i;
while(a[i]==1)//没有连续字符出现的字串
{
i++;
}
if(k==i-1)
{
if(b[k]=='1')printf("11");
   if(b[k]!='1')printf("1%c1",b[k]);
   break;
        }
         else
        {
for(q=k;q<i;q++)
{
if(q==k)
{
if(b[q]!='1')//考虑出现1的情况
        printf("1"),printf("%c",b[q]);
        if(b[q]=='1')printf("111");
}
if(q!=k&&q!=i-1)
                                 {     if(b[q]!='1')
                                       printf("%c",b[q]);
                                       if(b[q]=='1')
                                       printf("11");
         if(q==i-1)
{
         if(b[q]!='1')
                printf("%c",b[q]),printf("1");
        if(b[q]=='1')
        printf("111");
    
}
        }

  } 
   
}
}
}


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值