【发布时间】:2017-03-01 08:31:43
【问题描述】:
我正在寻找存储 E = (K, V) 元素的有序列表并在最多 O(log(N)) 时间内支持以下操作的数据结构,其中 N 是元素的数量。内存使用不是问题。
- E get(index) // 按索引获取元素
- int find(K) //找到K匹配的元素的索引
- delete(index) // 删除索引处的元素,后面的元素索引减1
- insert(index, E) // 在索引处插入元素,后面的元素索引增加1
我考虑过以下不正确的解决方案:
- 使用数组:
find、delete和insert仍然是 O(N) - 使用数组 + K 的映射来索引:
delete和insert仍将花费 O(N) 来移动元素和更新映射 - 使用链表 + 映射 K 到元素地址:
get和find仍将花费 O(N)
在我的想象中,最后一个解决方案是最接近的,但不是链表,而是一个自平衡树,其中每个节点存储它左侧的元素数量,这将使我们可以在 get O(log(N))。
但是我不确定我是否正确,所以我想问一下我的想象是否正确以及这种数据结构是否有名称,以便我寻找现成的解决方案。
【问题讨论】:
-
+1 等待答案。我怀疑这是否可能,因为您必须使用键或索引在 O(lg N) 中支持 find(),但结构(我知道)只能按键或索引或值排序...跨度>
-
@shole 同意,我也认为您可以从询问的 4 个操作中选择 3 个操作并支持 O(logn) 而不是全部 4 个。如果在 cs.stackexchange.com 中标记问题可能会更好还有
-
一个标准的平衡二叉搜索树,每个节点存储其子节点的数量应该足以支持您的所有要求。
标签: algorithm data-structures random-access