【问题标题】:RLE sequence, setting a valueRLE序列,设置一个值
【发布时间】: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


【解决方案1】:

RLE 通常不擅长更新,正是出于上述原因。将 ArrayList 更改为 LinkedList 并没有多大帮助,因为 LinkedList 在除插入之外的所有内容中都非常缓慢(即使使用插入,您也必须已经使用例如 ListIterator 持有对特定位置的引用)。

不过,说到原来的问题,没必要全部解压。您所需要的只是找到正确的位置(汇总计数),这是线性时间(考虑跳过列表以使其更快),之后您将只有四个选项:

  1. 您在一个区块中,而这个区块与您要保存的号码相同。
  2. 你在一个街区里,而且数字不同。
  3. 您在区块的开头或结尾,数字与区块不同,但与邻居相同。
  4. 您在区块的开头或结尾,数字既不与区块相同,也不与邻居相同。

显然,动作是一样的:

  1. 什么都不做
  2. 更改块中的计数器,添加两个块
  3. 在两个块中更改计数器
  4. 在一个块中更改计数器,插入一个新的

(请注意,如果您有跳过列表,您也必须更新它们。)

更新:如果要更新的块的长度为 1,它会变得更有趣,真的。尽管如此,这一切仍然是微不足道的:无论如何,更改仅限于三个块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多