我试图解决一个任务,我需要为RLE函数实现两个方法。我为压缩方法编写了以下代码:
List<Character> compressRLE(List<Character> text) {
List<Character> ergebnis = new ArrayList<>();
int count = 48;
for (int i = 0; i < text.size(); i++) {
if (i == 0) {
ergebnis.add(text.get(0));
count++;
}
if (i != 0 && text.get(i) == text.get(i-1)) {
count++;
}else if(i != 0 && text.get(i) != text.get(i-1)) {
ergebnis.add((char)count);
ergebnis.add(text.get(i));
count = 49;
}
if (i == text.size()-1) {
ergebnis.add((char)count);
}
}
return ergebnis;
}
下面我想压缩的数组列表:
[a, a, a, c, a, a, a, e, e, a, d, e, f, a, d, a, c, d, c, e, a, c, a, f, a, a, a, b, e, a, c, b, c, e, b, d, e, a, e, d, a, e, c, f, b, a, a, a, e, a, d, d, a, d, a, f, e, a, a, a, a, e, c, c, d, f, e, d, e, e, a, e, a, a, b, e, e, a, a, d, a, b, b, a, a, a, d, e, a, e, e, b, a, e, a, e, c, a, e, f, a, a, a, b, e, d, a, c, a, d, f, a, c, b, a, e, a, a, d, d, a, e, a, f, b, d, d, d, a, c, b, d, d, e, f, b, e, d, c, e, c, d, a, a, a, a, a, d, d, a, e, c, a, d, c, e, a, b, a, a, b, a, a, f, b, a, a, d, a, e, d, b, a, b, e, a, a, d, d, d, a, e, a, a, b, e, a, a, a, e, e, e, a, c, d, e, d, c, a, a, e, a, e, e, e, e, a, e, e, e, a, a, a, a, d, a, b, a, a, e, e, c, c, a, e, d, a, d, e, c, a, d, f, c, a, e, a, a, e, e, e, e, a, d, e, a, e, a, c, e, a, d, a, b, a, a, e, a, b, b, e, b, d, a, e, e, e, e, c, a, d, b, e, e, a, b, b, c, a, b, a, a, a, d, a, a, c, e, e, e, a, c, f, a, d, a, d, b, e, a, a, e, b, a, a, a, e, a, a, e, a, d, f, c, a, e, c, d, b, e, a, a, e, d, b, a, a, e, e, b, a, e, e, c, b, a, a, a, a, d, a, a, a, d, e, b, c, e, a, a, a, e, b, a, e, a, a, e, a, a, e, c, a, a, e, c, a, b, c, e, e, c, d, b, a, e, e, d, e, a, c, f, e, a, e, b, e, e, a, e, a, b, a, a, d, e, a, e, e, d, c, b, a, a, e, f, a, a, a, d, f, e, c, a, a, e, e, a, d, a, d, a, a, f, a, a, a, e, a, a, b, a, e, e, a, c, a, f, a, c, e, a, e, a, c, a, c, a, a, a, a, a, c, d, a, a, e, a, a, c, a, b, a, a, a, e, a, c, e, a, a, a, d, c, e, a, e, a, a, d, a, a, d, c, c, a, a, b, d, a, a, e, c, e, e, e, f, a, c, c, c, d, a, a, d, a, b, a, c, b, a, b, e, e, a, e, a, c, d, a, a, a, c, a, a, a, a, a, e, e, c, c, a, a, a, e, d, a, c, e, c, a, a, c, d, b, a, e, a, e, c, d, c, e, a, f, e, a, e, a, a, e, e, a, c, a, c, a, a, e, a, a, a, e, e, a, c, d, a, a, d, a, a, d, e, b, b, f, a, a, b, d, e, a, a, d, c, d, b, c, a, a, c, d, c, a, a, d, d, d, a, d, a, c, a, a, a, a, a, a, e, e, a, f, e, f, f, b, e, b, c, a, a, a, b, a, e, e, f, e, d, b, b, a, a, a, a, e, e, a, b, d, a, a, b, a, a, e, a, d, d, d, f, a, a, f, e, d, a, a, a, d, d, a, d, b, a, e, a, e, c, e, d, e, b, a, a, a, e, c, a, b, e, e, c, e, e, c, a, a, e, a, a, d, b, a, b, e, a, a, a, d, d, e, a, e, a, a, b, d, a, d, a, c, b, f, a, c, a, a, a, d, a, f, a, a, a, d, c, e, a, d, a, a, a, c, d, a, b, e, c, d, d, b, a, b, b, a, a, e, f, a, d, b, a, a, c, a, d, b, a, e, e, a, a, c, a, c, a, a, e, c, b, c, a, e, a, a, b, a, d, b, b, e, a, d, c, e, c, d, c, d, d, c, a, a, e, c, b, a, a, a, a, d, f, f, a, d, d, d, a, a, a, f, e, e, e, c, a, a, f, a, b, d, d, b, a, b, b, d, a, a, d, b, a, a, d, a, d, c, c, a, d, b, e, e, b, a, d, d, f, b, e, a, a, e, d, a, c, d, a, d, a, e, b, b, a, a, e, a, a, c, e, a, a, d, d, d, a, e, a, e, a, a, c, b, c, d, a, b, d, d, f, f, a, a, a, a, a, e, a, f, b, b, c, c, b, d, d, e, a, c, e, f, b, e, a, a, a, a, d, a, d, a, e, c, e, d, d, b, c, a, d, c, a, b, c, e, d, d, d, c, d, c, a, d, e, a, a, d, a, a, a, a, c, b, e, b, e, d, a, a, d, e, b, c, d, b, a, a, e, a, a, e, f, a, c, d, d, e, a, b, d, a, a, d, d, a, d, e]
但不知怎么的,我同时做对了又做错了。我做了压缩,但是列表的大小增加了近3倍:
[a, 3, c, 1, a, 3, e, 2, a, 1, d, 1, e, 1, f, 1, a, 1, d, 1, a, 1, c, 1, d, 1, c, 1, e, 1, a, 1, c, 1, a, 1, f, 1, a, 3, b, 1, e, 1, a, 1, c, 1, b, 1, c, 1, e, 1, b, 1, d, 1, e, 1, a, 1, e, 1, d, 1, a, 1, e, 1, c, 1, f, 1, b, 1, a, 3, e, 1, a, 1, d, 2, a, 1, d, 1, a, 1, f, 1, e, 1, a, 4, e, 1, c, 2, d, 1, f, 1, e, 1, d, 1, e, 2, a, 1, e, 1, a, 2, b, 1, e, 2, a, 2, d, 1, a, 1, b, 2, a, 3, d, 1, e, 1, a, 1, e, 2, b, 1, a, 1, e, 1, a, 1, e, 1, c, 1, a, 1, e, 1, f, 1, a, 3, b, 1, e, 1, d, 1, a, 1, c, 1, a, 1, d, 1, f, 1, a, 1, c, 1, b, 1, a, 1, e, 1, a, 2, d, 2, a, 1, e, 1, a, 1, f, 1, b, 1, d, 3, a, 1, c, 1, b, 1, d, 2, e, 1, f, 1, b, 1, e, 1, d, 1, c, 1, e, 1, c, 1, d, 1, a, 5, d, 2, a, 1, e, 1, c, 1, a, 1, d, 1, c, 1, e, 1, a, 1, b, 1, a, 2, b, 1, a, 2, f, 1, b, 1, a, 2, d, 1, a, 1, e, 1, d, 1, b, 1, a, 1, b, 1, e, 1, a, 2, d, 3, a, 1, e, 1, a, 2, b, 1, e, 1, a, 3, e, 3, a, 1, c, 1, d, 1, e, 1, d, 1, c, 1, a, 2, e, 1, a, 1, e, 4, a, 1, e, 3, a, 4, d, 1, a, 1, b, 1, a, 2, e, 2, c, 2, a, 1, e, 1, d, 1, a, 1, d, 1, e, 1, c, 1, a, 1, d, 1, f, 1, c, 1, a, 1, e, 1, a, 2, e, 4, a, 1, d, 1, e, 1, a, 1, e, 1, a, 1, c, 1, e, 1, a, 1, d, 1, a, 1, b, 1, a, 2, e, 1, a, 1, b, 2, e, 1, b, 1, d, 1, a, 1, e, 4, c, 1, a, 1, d, 1, b, 1, e, 2, a, 1, b, 2, c, 1, a, 1, b, 1, a, 3, d, 1, a, 2, c, 1, e, 3, a, 1, c, 1, f, 1, a, 1, d, 1, a, 1, d, 1, b, 1, e, 1, a, 2, e, 1, b, 1, a, 3, e, 1, a, 2, e, 1, a, 1, d, 1, f, 1, c, 1, a, 1, e, 1, c, 1, d, 1, b, 1, e, 1, a, 2, e, 1, d, 1, b, 1, a, 2, e, 2, b, 1, a, 1, e, 2, c, 1, b, 1, a, 4, d, 1, a, 3, d, 1, e, 1, b, 1, c, 1, e, 1, a, 3, e, 1, b, 1, a, 1, e, 1, a, 2, e, 1, a, 2, e, 1, c, 1, a, 2, e, 1, c, 1, a, 1, b, 1, c, 1, e, 2, c, 1, d, 1, b, 1, a, 1, e, 2, d, 1, e, 1, a, 1, c, 1, f, 1, e, 1, a, 1, e, 1, b, 1, e, 2, a, 1, e, 1, a, 1, b, 1, a, 2, d, 1, e, 1, a, 1, e, 2, d, 1, c, 1, b, 1, a, 2, e, 1, f, 1, a, 3, d, 1, f, 1, e, 1, c, 1, a, 2, e, 2, a, 1, d, 1, a, 1, d, 1, a, 2, f, 1, a, 3, e, 1, a, 2, b, 1, a, 1, e, 2, a, 1, c, 1, a, 1, f, 1, a, 1, c, 1, e, 1, a, 1, e, 1, a, 1, c, 1, a, 1, c, 1, a, 5, c, 1, d, 1, a, 2, e, 1, a, 2, c, 1, a, 1, b, 1, a, 3, e, 1, a, 1, c, 1, e, 1, a, 3, d, 1, c, 1, e, 1, a, 1, e, 1, a, 2, d, 1, a, 2, d, 1, c, 2, a, 2, b, 1, d, 1, a, 2, e, 1, c, 1, e, 3, f, 1, a, 1, c, 3, d, 1, a, 2, d, 1, a, 1, b, 1, a, 1, c, 1, b, 1, a, 1, b, 1, e, 2, a, 1, e, 1, a, 1, c, 1, d, 1, a, 3, c, 1, a, 5, e, 2, c, 2, a, 3, e, 1, d, 1, a, 1, c, 1, e, 1, c, 1, a, 2, c, 1, d, 1, b, 1, a, 1, e, 1, a, 1, e, 1, c, 1, d, 1, c, 1, e, 1, a, 1, f, 1, e, 1, a, 1, e, 1, a, 2, e, 2, a, 1, c, 1, a, 1, c, 1, a, 2, e, 1, a, 3, e, 2, a, 1, c, 1, d, 1, a, 2, d, 1, a, 2, d, 1, e, 1, b, 2, f, 1, a, 2, b, 1, d, 1, e, 1, a, 2, d, 1, c, 1, d, 1, b, 1, c, 1, a, 2, c, 1, d, 1, c, 1, a, 2, d, 3, a, 1, d, 1, a, 1, c, 1, a, 6, e, 2, a, 1, f, 1, e, 1, f, 2, b, 1, e, 1, b, 1, c, 1, a, 3, b, 1, a, 1, e, 2, f, 1, e, 1, d, 1, b, 2, a, 4, e, 2, a, 1, b, 1, d, 1, a, 2, b, 1, a, 2, e, 1, a, 1, d, 3, f, 1, a, 2, f, 1, e, 1, d, 1, a, 3, d, 2, a, 1, d, 1, b, 1, a, 1, e, 1, a, 1, e, 1, c, 1, e, 1, d, 1, e, 1, b, 1, a, 3, e, 1, c, 1, a, 1, b, 1, e, 2, c, 1, e, 2, c, 1, a, 2, e, 1, a, 2, d, 1, b, 1, a, 1, b, 1, e, 1, a, 3, d, 2, e, 1, a, 1, e, 1, a, 2, b, 1, d, 1, a, 1, d, 1, a, 1, c, 1, b, 1, f, 1, a, 1, c, 1, a, 3, d, 1, a, 1, f, 1, a, 3, d, 1, c, 1, e, 1, a, 1, d, 1, a, 3, c, 1, d, 1, a, 1, b, 1, e, 1, c, 1, d, 2, b, 1, a, 1, b, 2, a, 2, e, 1, f, 1, a, 1, d, 1, b, 1, a, 2, c, 1, a, 1, d, 1, b, 1, a, 1, e, 2, a, 2, c, 1, a, 1, c, 1, a, 2, e, 1, c, 1, b, 1, c, 1, a, 1, e, 1, a, 2, b, 1, a, 1, d, 1, b, 2, e, 1, a, 1, d, 1, c, 1, e, 1, c, 1, d, 1, c, 1, d, 2, c, 1, a, 2, e, 1, c, 1, b, 1, a, 4, d, 1, f, 2, a, 1, d, 3, a, 3, f, 1, e, 3, c, 1, a, 2, f, 1, a, 1, b, 1, d, 2, b, 1, a, 1, b, 2, d, 1, a, 2, d, 1, b, 1, a, 2, d, 1, a, 1, d, 1, c, 2, a, 1, d, 1, b, 1, e, 2, b, 1, a, 1, d, 2, f, 1, b, 1, e, 1, a, 2, e, 1, d, 1, a, 1, c, 1, d, 1, a, 1, d, 1, a, 1, e, 1, b, 2, a, 2, e, 1, a, 2, c, 1, e, 1, a, 2, d, 3, a, 1, e, 1, a, 1, e, 1, a, 2, c, 1, b, 1, c, 1, d, 1, a, 1, b, 1, d, 2, f, 2, a, 5, e, 1, a, 1, f, 1, b, 2, c, 2, b, 1, d, 2, e, 1, a, 1, c, 1, e, 1, f, 1, b, 1, e, 1, a, 4, d, 1, a, 1, d, 1, a, 1, e, 1, c, 1, e, 1, d, 2, b, 1, c, 1, a, 1, d, 1, c, 1, a, 1, b, 1, c, 1, e, 1, d, 3, c, 1, d, 1, c, 1, a, 1, d, 1, e, 1, a, 2, d, 1, a, 4, c, 1, b, 1, e, 1, b, 1, e, 1, d, 1, a, 2, d, 1, e, 1, b, 1, c, 1, d, 1, b, 1, a, 2, e, 1, a, 2, e, 1, f, 1, a, 1, c, 1, d, 2, e, 1, a, 1, b, 1, d, 1, a, 2, d, 2, a, 1, d, 1, e, 1]
ergebnis.size()给我这个:2996(从1000到2996)
我不知道这里出了什么问题,所以我恳请你帮忙。
首先:不要在stackoverflow上抛出首字母缩略词,并期望人们知道它的意思。也许你现在的整个世界都是关于RLE的,所以你非常清楚它的含义,但不是每个人都知道。因此,为了其他读者(和搜索引擎)的利益:
RLE表示运行长度编码.
RLE是可以想象的最原始的无损压缩算法。(存在更原始的压缩算法,但它们是有损的,例如compress( String s ) => return "";
)
第二:你真的不知道你是否"做了压缩";除非你也"解压"。但是让我们假设你的算法是正确的,基于对输入数据和结果的视觉检查。(我非常怀疑它是正确的,因为它包含一些神奇的数字,比如48和49,这让我不想读代码。)
最后:是的,你观察到的是完全正常的RLE。如果要压缩的数据有很多单值序列,而重复值序列不多,那么RLE算法的结果将比要压缩的原始数据长,因为对于每个单值序列,它将在输出中产生两个值。