在少于O(n)的时间内对阵列执行插入,搜索和删除查询,并使用O(1)辅助空间

时间:2015-06-17 16:30:05

标签: arrays data-structures time-complexity

我获得了一系列数字并允许对它们进行预处理 有三种类型的查询:

插入(x),将元素“x”插入数组中 删除(x)从数组中删除元素“x”(假设x存在于数组中)
如果数组中存在“x”,则返回(x)返回。

我被允许只使用恒定的辅助空间。

有没有办法在 O(n)时间内回答这些查询。如果没有,这可以证明吗?即使是查询时间的微小改进也会很有用。

2 个答案:

答案 0 :(得分:0)

这里的实现仍然具有插入和删除的O(n)运行时,但它会在时间O(log n)中运行查找。

将数据结构作为动态分配的排序数组,没有松弛空间。要执行查找,只需在时间O(log n)中使用二进制搜索。

要进行插入,请分配n + 1个元素的新数组。复制现有元素,将新元素插入正确的排序位置。这需要时间O(n)。删除可以类似的方式实施。

你可以通过选择一些固定常数k来加快速度,然后在每次需要增长时用k个元素来分配数组。这意味着在k个元素中只需要实际复制数组一次,因此尽管最坏情况运行时仍为O(n),但插入或删除的分摊成本变为O(n / k)。对于常数k,这与前面的渐近相同,但实际上这可能会产生巨大的差异。

希望这有帮助!

答案 1 :(得分:-1)

是的,我们可以在数组中的O(1)中进行。 insert(x)表示最后插入< ll默认为O(1),delete(x)表示删除索引并将最后一个索引放入已删除的索引中,所以它再次为O(1),用于内部搜索哈希映射,它给你O(1)。