RLE壓縮算法總結


RLE壓縮算法總結

1、RLE壓縮算法介紹

RLE(Run Length Encoding)壓縮算法是一種無損壓縮算法。算法特點:簡單、易實現。
RLE將待壓縮數據看作一個字符序列,序列中存在兩種情況:1)連續重復的字符;2)孤立的字符。壓縮對象主要是連續重復的字符,例如連續字符 AAAAA,可以使用字符5A表示。

2、RLE文本壓縮算法

2.all*is*well2.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方法思路簡潔明了,實現簡單,但是,在很多情況下壓縮效果不明顯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM