【发布时间】:2011-10-16 17:30:56
【问题描述】:
假设我有一个任意的 RLE 序列。 (不知道的人,RLE把[4 4 4 4 4 6 6 1 1]这样的数组压缩成[(5,4)(2,6)(2,1)]。首先是a的个数运行中的特定整数,然后是数字本身。)
如何确定算法以在给定索引处设置值而不解压缩整个内容?例如,如果您执行 set(0,1),则 RLE 将变为 [(1,1) (4,4) (2,6) (2,1)]。 (在set中,第一个值为索引,第二个为值)
此外,我已将此压缩序列划分为 ArrayList of Entries。也就是说,每个条目都是以下之一:(1,1) 其中它有一个数量和价值。
我正在尝试找到一种有效的方法来做到这一点,现在我可以想到的方法有太多的 if 语句被认为是干净的。有很多可能的变化:例如,如果给定值拆分了现有条目,或者它与现有条目具有相同的值,等等......
任何帮助将不胜感激。我现在正在研究一种算法,这里是其中的一些:
while(i<rleAL.size() && count != index)
{
indexToStop=0;
while(count<index || indexToStop == rleAL.get(i).getAmount())
{
count++;
indexToStop++;
}
if(count != index)
{
i++;
}
}
正如你所看到的,这变得越来越草率......
谢谢!
【问题讨论】:
-
出于性能原因,使用链表而不是 ArrayList 可能会更好。
-
即使我必须删除索引中的条目?
-
@user977036: +1 但是...除非您保留其他信息,否则您可能需要大量解压缩。比如你的图片有10000像素,你想设置5000像素,那么无论是从头开始还是从底部开始尝试“变得聪明”,都必须解压缩一半的像素。所以要么你以某种方式跟踪各种索引,要么你需要解压缩很多东西才能做你想做的事情(如果我没记错的话)。如果您必须进行多项此类更改,则可以在解压缩一次然后执行所有插入时进行索引。
-
@user988052 我有点不清楚 - 目标是根本不解压缩。你提到的附加信息是什么?另外,我一次只需要更改一个条目,而不是全部更改。
-
@user977036: “目标是根本不解压” 可以避免将整个解压缩数据保存在内存中,但您无法避免遍历数据。我的意思是,这有点像 RLE:压缩并相对较小。如果你想访问/更改数据,你必须解压缩......除非你已经控制了算法并带有包含更多数据的东西(但因此比典型的 RLE 更大)。
标签: java arraylist run-length-encoding