【发布时间】:2012-05-07 07:25:40
【问题描述】:
我不确定这是否可能,但对我来说似乎有点合理,我正在寻找一种允许我执行这些操作的数据结构:
- 用 O(log n) 插入一个项目
- 用 O(log n) 移除一个项目
- 查找/编辑 O(1) 中的第 k 个最小元素,用于任意 k(O(1) 索引)
当然,编辑不会导致元素顺序发生任何变化。使之成为可能的原因是我将以递增的顺序一个接一个地插入元素。因此,例如,如果我尝试第五次插入,我确信在这之前的所有四个元素都比它小,而在这之后的所有元素都会更大。
【问题讨论】:
-
我不确定这样的数据结构是否存在。通常,您需要权衡每种不同类型的数据结构,而您所描述的是一种功能异常强大的数据结构。我敢肯定,如果存在这样的东西,它会比堆/树/等更普遍。如果删除时间可以变得不那么重要,您可以使用一个简单的数组(它有 O(1) 附加和 O(1) 找到第 k 个元素)。我会继续考虑,但我不能保证任何事情。
-
我可以想到
O(logn)insert+remove &O(logk)find k - 但我没时间详细回答。这个想法是创建一个具有 3 个修改的 AVL 树:(1) 维护min- 指向最小元素的指针。 (2)维护每个节点的father字段。 (3) 为每个节点维护numberOfSons字段。现在,当您需要第 k 个元素时,从 min 开始,一直向上,同时使用numberOfSons知道您已经通过了多少元素。您最多需要上O(logk)个节点,然后再返回O(logk)个节点,这导致O(logk)找到第k 个元素 -
你到底想做什么?如果您清楚地陈述所有假设,则可能有一种数据结构可以满足您的需求。例如,您真的需要按递增顺序插入元素吗?这可能会伤害(或帮助)。什么是绝对必要的?为什么性能会成为问题?
-
如果您的数组只有 10000 个条目,可能 O(log N) 删除要求太强了?您可以使用tiered vector,它允许非常快速的索引,但 O(sqrt N) 删除。要在这个分层向量中找到要删除的元素,您需要并行维护其他数据结构。它可能是一个搜索树,它的每个节点都增加了后代的数量。总的来说,你有 O(1) 几乎即时索引、O(log N) 插入和 O(sqrt N) 删除。
-
如果你真的想要这个数据结构,我建议发帖到cstheory.stackexchange.com,因为这个问题要求一个相当前沿的数据结构。当前现有的动态数组可能支持这一点,但仅适用于数组末尾的插入和删除。
标签: algorithm data-structures containers