加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – RLE序列,设置一个值

发布时间:2020-12-15 02:28:40 所属栏目:Java 来源:网络整理
导读:说我有一个任意的RLE序列. (对于那些不知道的人,RLE将[4 4 4 4 4 6 6 1 1]这样的数组压缩成[(5,4)(2,6)(2,1)].首先是数字a运行中的特定整数,然后是数字本身.) 如何在不解压缩整个事物的情况下确定在给定索引处设置值的算法?例如,如果设置(0,1),则RLE将变为[
说我有一个任意的RLE序列. (对于那些不知道的人,RLE将[4 4 4 4 4 6 6 1 1]这样的数组压缩成[(5,4)(2,6)(2,1)].首先是数字a运行中的特定整数,然后是数字本身.)

如何在不解压缩整个事物的情况下确定在给定索引处设置值的算法?例如,如果设置(0,1),则RLE将变为[(1,1)(4,1)]. (在set中,第一个值是索引,第二个值是值)

此外,我已将此压缩序列划分为条目的ArrayList.也就是说,每个条目都是以下之一:(1,1)它具有金额和价值.

我正在尝试找到一种有效的方法来做到这一点,现在我可以想到如果语句被认为是干净的那么方法太多了.有很多可能的变化:例如,如果给定值拆分现有条目,或者它与现有条目具有相同的值,等等……

任何帮助将非常感激.我现在正在研究一种算法,这里有一些:

while(i<rleAL.size() && count != index)
    {
        indexToStop=0;
        while(count<index || indexToStop == rleAL.get(i).getAmount())
        {
            count++;
            indexToStop++;
        }

        if(count != index)
        {
            i++;
        }
    }

正如你所看到的那样越来越邋……

谢谢!

解决方法

RLE通常在更新时很糟糕,完全出于上述原因.将ArrayList更改为LinkedList将没有多大帮助,因为LinkedList在除插入之外的所有内容中都非常慢(即使使用插入,您也必须使用例如ListIterator来保存对特定位置的引用).

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

>你在一个区块,这个区块与你想要保存的数字相同.
>你在一个街区内,数量不同.
>你在块的开头或结尾,数字与块的不同,但与邻居相同.
>你在块的开头或结尾,数字既不是块也不是邻居的数字.

行动是一样的,显然:

>什么都不做
>更改块中的计数器,添加两个块
>在两个区块中更改计数器
>在一个区块中更改计数器,插入一个新区域

(注意,如果你有跳过列表,你也必须更新它们.)

更新:如果要更新的块的长度为1,则更有趣.尽管如此,它仍然是微不足道的:在任何情况下,变化都限制在最多三个块.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读