【发布时间】:2021-07-14 03:39:02
【问题描述】:
总结: 我有一段代码想要初始化一个数组,然后迭代地查找一个索引,获取值,然后删除该索引处的元素,将上面的所有值向下移动一个索引。使用普通数组执行此操作是 θ(n^2)。如果有比我想出的更好的方法,我想这样做。
抽象数据类型需要支持: 使用一开始就知道的所有数据进行初始化。 查找索引的值。 删除索引,通过将所有元素向左移动来填补空白。
我想出的数据结构: 一棵完整的二叉树,在叶子和内部节点处具有“索引”,用于存储已填充的叶子数量。 初始化很简单而且是 nlogn 索引是通过从根检查其孩子的计数并递归到正确的孩子登录来完成的。 一旦你在一个叶子删除是通过清空数据然后返回树将所有计数减 1 logn 来完成的。
使用 nlogn 初始化和 n 个已登录的索引/删除,整个运行时间为 nlogn。
【问题讨论】:
-
感觉很像skip list。初始化为
O(n)。否则推理看起来是正确的。注意索引处的插入也是O(log n)。 -
您在这里提出的建议与 Fenwick 树和顺序统计树密切相关。似乎是一个很棒的方法!
标签: algorithm data-structures abstract-data-type array-splice