目录
字符串压缩算法用于减少字符串的存储空间,尤其是在需要传输或保存大量文本数据时。以下是三种常见的字符串压缩算法:RLE、Huffman编码和LZW压缩。
RLE(游程长度编码)
算法原理
游程长度编码(Run-Length Encoding,RLE)是一种简单的压缩算法,主要针对字符串中连续重复的字符。该算法通过记录每个字符的重复次数来实现压缩。
步骤说明
- 遍历字符串,记录每个字符及其连续出现的次数。
- 生成一个新的字符串,其中每个字符后面跟着其出现的次数。
示例说明
考虑字符串 "AAAABBBCCDAA"
:
- 第1步:找到字符
A
连续出现了4次,记为"4A"
。 - 第2步:找到字符
B
连续出现了3次,记为"3B"
。 - 第3步:字符
C
连续出现2次,记为"2C"
。 - 第4步:字符
D
出现1次,记为"1D"
。 - 第5步:字符
A
连续出现2次,记为"2A"
。
最终压缩结果为 "4A3B2C1D2A"
。
代码示例
python语言:
def rle_encode(data):
encoding = ''
i = 0
while i < len(data):
count = 1
while i + 1 < len(data) and data[i] == data[i + 1]:
i += 1
count += 1
encoding += str(count) + data[i]
i += 1
return encoding
# 示例使用
input_string = "AAAABBBCCDAA"
encoded_string = rle_encode(input_string)
print(encoded_string) # 输出: "4A3B2C1D2A"
C语言:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *rleEncode(const char *data) {
int dataLength = strlen(data);
char *encoding = (char *)malloc(2 * dataLength * sizeof(char));
int encodingIndex = 0;
int i = 0;
while (i < dataLength) {
int count = 1;
while (i + 1 < dataLength && data[i] == data[i + 1]) {
i++;
count++;
}
int countDigits = 0;
int tempCount = count;
while (tempCount > 0) {
tempCount /= 10;
countDigits++;
}
int digitIndex = countDigits;
tempCount = count;
while (tempCount > 0) {
encoding[encodingIndex + digitIndex--] = '0' + tempCount % 10;
tempCount /= 10;
}
encoding[encodingIndex + countDigits] = data[i];
encodingIndex += countDigits + 1;
i++;
}
encoding[encodingIndex] = '\0';
return encoding;
}
int main() {
const char *inputString = "AAAABBBCCDAA";
char *encodedString = rleEncode(inputString);
printf("%s\n", encodedString);
free(encodedString);
return 0;
}
优缺点
- 优点:RLE算法实现简单,适用于字符重复较多的场景。
- 缺点:对于字符重复较少的字符串,RLE可能会增加字符串的长度而非压缩。