【发布时间】:2015-06-30 14:15:09
【问题描述】:
我需要一个包含有序列表的数据结构。我需要有一个插入、一个删除操作以及一个 getPosition 操作。
getPosition 操作经常在连续元素上调用,例如我有一个列表:
[a0, a1, …, ak, ak', …, an]
我需要经常获取ak 的索引,然后是ak' 的索引。
我在想类似于伸展树的算法,但它也可以移动访问元素的邻居可能是有效的,但我找不到任何参考。你有什么建议吗?
编辑: 我还需要快速插入+删除。 O(log(n)) 中的东西就足够了。
【问题讨论】:
-
一旦你有了
ak的位置,你就有了ak'的位置,不是吗? -
是的,但是由于您检查了
ak位置,因此可能发生了插入或删除,因此之前计算的位置可能不再相关。 -
看看 linux 进程调度器。有一个很适合你的情况。它用于 CFS(完全公平的调度程序)。它使用 RBTree,但是,有一个额外的双向链表以按顺序遍历顺序将所有节点链接在一起。这种冗余可以将后继和前继操作减少到
O(1),同时保持删除和插入O(lg n)。
标签: algorithm list binary-search-tree