我有:
0 => a
1 => x
2 => A
...
1356 => w
1357 => o
截至目前,我可以轻松获得pos 555,因为它已被编入索引,换句话说,不需要线性搜索。
现在,如果我移除位置333,则必须移动其上方的所有内容,因为下次我调用get(555)
时,移除的元素将是旧的556,现在是移位后的新555.
但是当你的名单很大时,转移费用很高。
有没有一种方法可以在不移动的情况下移除并仍然保持所有索引的正确索引?
首先想到的是一个双重链接列表,但它没有被编入索引。
我是否需要一些奇怪的数据结构组合来节省转移并且还有索引?
答案 0 :(得分:1)
您实际上可以使用称为订单统计树的修改后的二叉树来支持随机访问和时间转换O(log n)。这是一个平衡的二叉树(例如,即使元素未被排序,它也是红/黑树或AVL树的平衡树),其中每个节点存储其左右子树中的节点数。使用修改的BST查找算法,可以在时间O(log n)中找到树中的第k个元素。获得该节点后,可以在时间O(log n)中删除它,或者在时间O(log n)之前或之后插入一个节点。
许多入门算法教科书(如CLRS)描述了如何使这些操作详细工作。
希望这有帮助!