假设您有未排序的不同项目列表。例如:
['a', 'z', 'g', 'i', 'w', 'p', 't']
您还将获得插入和删除操作的列表。插入操作由要插入的索引和要插入的项目组成。例如:Insert(5,'s')
使用要删除的元素表示删除操作。例如:Remove('s')
因此,操作列表可能如下所示:
我正在寻找可以转换操作列表的最有效算法,以便它们基于索引。这意味着不需要修改插入操作,但是应该用删除操作替换删除操作,该操作说明要删除的项目(不是原始项目)的当前索引。>
因此示例的输出应如下所示:
很显然,我们可以在每次操作后扫描下一个项以删除集合中的项,这意味着整个算法将采用O(n * m),其中n是列表的大小,m是数字操作。
问题是-有没有更有效的算法?
答案 0 :(得分:0)
如果您可以提前访问所有remove
操作,则可以提高效率 ,并且和都是明显的(上下文定义)比对象列表短。
您可以维护感兴趣的项目的列表:要删除的项目。查找其初始位置-在原始列表中或插入时。每当在位置n
进行插入时,列表中该位置之后的每个元素的索引都会增加1;对于每个此类删除,请减少一个。
这与已经显而易见的方法没有什么不同;它只是数量上更快,在 O(n * m)复杂度上可能更小m
。