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");
    
}
        }

  } 
   
}
}
}


發佈了52 篇原創文章 · 獲贊 23 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章