将列表操作转换为基于索引的算法

时间:2019-06-09 22:09:50

标签: algorithm list time-complexity

假设您有未排序的不同项目列表。例如:

['a', 'z', 'g', 'i', 'w', 'p', 't']

您还将获得插入和删除操作的列表。插入操作由要插入的索引和要插入的项目组成。例如:Insert(5,'s')

使用要删除的元素表示删除操作。例如:Remove('s')

因此,操作列表可能如下所示:

  • 插入('s',5)
  • 删除('p')
  • 插入('j',0)
  • 删除('a')

我正在寻找可以转换操作列表的最有效算法,以便它们基于索引。这意味着不需要修改插入操作,但是应该用删除操作替换删除操作,该操作说明要删除的项目(不是原始项目)的当前索引。

因此示例的输出应如下所示:

  • 起始设置:['a','z','g','i','w','p','t']
  • Insert('s',5)(现在的列表为:['a','z','g','i','w','s','p','t'] < / li>
  • 删除(6)(列表现在为:['a','z','g','i','w','s','t']
  • 插入('j',0)(现在列表为:['j','a','z','g','i','w','s','t'] < / li>
  • 删除(1)(列表现在为:['j','z','g','i','w','s','t']

很显然,我们可以在每次操作后扫描下一个项以删除集合中的项,这意味着整个算法将采用O(n * m),其中n是列表的大小,m是数字操作。

问题是-有没有更有效的算法?

1 个答案:

答案 0 :(得分:0)

如果您可以提前访问所有remove操作,则可以提高效率 ,并且都是明显的(上下文定义)比对象列表短。

您可以维护感兴趣的项目的列表:要删除的项目。查找其初始位置-在原始列表中或插入时。每当在位置n进行插入时,列表中该位置之后的每个元素的索引都会增加1;对于每个此类删除,请减少一个。

这与已经显而易见的方法没有什么不同;它只是数量上更快,在 O(n * m)复杂度上可能更小m