RLE壓縮算法總結
1、RLE壓縮算法介紹
RLE(Run Length Encoding)壓縮算法是一種無損壓縮算法。算法特點:簡單、易實現。
RLE將待壓縮數據看作一個字符序列,序列中存在兩種情況:1)連續重復的字符;2)孤立的字符。壓縮對象主要是連續重復的字符,例如連續字符 AAAAA,可以使用字符5A表示。
2、RLE文本壓縮算法
2.all*is*well用2.a2l*is*we2l表示存在問題,原因是解碼器不知道第一個2和第二個2分別代表什么意義,需要區分是原始字符串中的字符還是代表緊跟着的字符的重復次數。可以使用一個特殊字符比如@表示,例如@2l可以知道@字符后面的2表示字符l出現了兩次。可以使用2.a@2l*is*we@2l壓縮2.all*is*well(實際沒有壓縮效果)。
上述方法限制
- 1 很多文本字符串一般很少出現3個連續相同的字符,這種情況下,往往起不到壓縮的效果。
- 2 重復次數字符串最大限制為255。可以優化3-258,0代表3,255代表258
- 3 字符@不可以出現在待編碼的字符中。否則需要重新選一個特殊字符。如果待編碼字符中有所有的字符,則需要其他解決方案。
[//]: # (MNP5算法是RLE的一個RLE的變體)
3、實驗
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int encode_RLE(char* input, char* output)
{
int i=0, j=0, k=0;
for(; i<strlen(input); ) {
/*待編碼字符的第一個字符*/
char head = input[i];
for (j = i+1; j < strlen(input); j++) {
/*后面第一個不相同字符位置*/
if(input[j] != head)
break;
}
/*重復字節數大於等於3*/
if(j-i>=3)
{
output[k++]='@';
output[k++]=(char)(j-i-3+'0'); //便於打印偏移到'0'.
output[k++]=head;
}else{
/*重復次數小於3*/
for(int m=0; m<j-i; m++)
output[k++]=head;
}
i=j;
}
return k;
}
int decode_RLE(char *input, char* output)
{
int k=0;
for(int i=0; i<strlen(input);){
if(input[i]=='@') {
i++;
for (int j = 0; j < input[i]-'0'+3; j++)
output[k++]=input[i+1];
i=i+2;
continue;
}
output[k++]=input[i++];
}
return k;
}
int main() {
char* input = (char*)malloc(1024);
char* output = (char*)malloc(1024);
char* result = (char*)malloc(1024);
memset(input, 0, 1024);
memset(output, 0, 1024);
memset(result, 0, 1024);
printf("Please input a string:");
scanf("%s", input);
printf("input length is %d.\n", (int)strlen(input));
int k=encode_RLE(input, output);
printf("Compressed data is:%s, and length is %d.\n", output, k);
int m = decode_RLE(output, result);
printf("decompress data is %s, and length is %d.\n", result, m);
return 0;
}
4、總結
RLE方法思路簡潔明了,實現簡單,但是,在很多情況下壓縮效果不明顯。