把输入流中连续重复出现的字符用字符对来替换。游程指的是出现次数。
样例输入 ABBCAAAAACD
输出 A2BC5ACD
文本压缩
图像压缩
步骤
counter为字符连续出现次数计数器,SC保存前一个字符,来判断是否与当前字符相同。读入第一个字符时,SC保存该字符,counter=1。
之后每读入一个字符,就与SC比较,若相同则counter+1,若不相同,当counter>1,输出,counter=1,SC保存当前字符;当counter=1,说明该字符仅出现一次,输出SC即可。
为了区分游程和数字文本,在游程前输出@表示接下去的数字为游程。
流程图
代码实现# 游程编码
s = input()
counter = 1
sc = s[0]
for ch in s[1:]:
if sc == ch:
counter += 1
else:
if counter > 1:
ans = '@' + str(counter) + sc
print(ans, end='')
else:
print(sc, end='')
sc = ch
counter = 1
if counter > 1:
ans = '@' + str(counter) + sc
print(ans, end='')
else:
print(sc, end='')
压缩比
假设带压缩字符长度为N,字符中包含M次重复,每次重复的平均长度为L。M次中的每一次重复可用3字节代替,因此压缩后的字符串长度为N-M(L-3),压缩因子为N/(N-M(L-3))
若N=1000,M=10,L=4,压缩因子=1.01
若N=1000,M=50,L=10,压缩因子=1.538
问题
普通英文单词中字母重复频率并不高 文本中出现@时需要另外找一个标志符号 重复次数以字节的形式保存到输出流中,最大只能到255 图像压缩二值图像
二值图像只有黑像素和白像素,压缩该类图像只需要按行扫描位图,给出黑白像素的游程即可。
>例如:开始20个黑像素,接着5个白像素,再接着12个黑像素,则把20,5,12……写入压缩流。
灰度图像
灰度图像是指每个像素只有一个采样颜色的图像,每个像素点用8位存储,用游程编码压缩该类图像需要考虑的是如何区分表示灰度值的字节和表示计数值的字节。
如果是128灰度级的图像,灰度值占7位,可以用每个字节的一位来表示该字节所表示的是灰度值还是计数值。
如果是256灰度级的图像,可降为255,保留一个值做标志,该值置于每个游程计数字节之前。
每字节均加一位,以表示该字节是灰度值还是计数值,这些附加位每8个累计一组,每组先于其所属的8个字节写到输出流中。
彩色图像按照RGB模型保存,每个像素分成3个字节,(red,greed,blue),因此把像素分成3个序列,每一个序列分别游程编码。