O(1)额外空间查找数据结构

时间:2013-04-20 20:55:49

标签: algorithm

我想知道是否有一个简单的数据结构支持分摊的log(n)查找和插入,就像自平衡二进制搜索树一样但具有恒定的内存开销。 (我真的不在乎删除元素。)

我的一个想法是将所有内容存储在一个连续的内存块中,分为两个连续的块:一个S部分,其中所有元素都被排序,一个U未被排序。

要执行插入,我们可以向U添加一个元素,如果U的大小超过log(S的大小),则对整个连续数组进行排序(将S和U都视为一个连续数组),这样在排序后,一切都在S中,U是空的。

在S上执行查找运行二进制搜索,然后查看所有U.

但是,我无法计算算法的分期插入时间。

最后,我会欣赏一些具有所需属性的相当简单的算法/数据结构,并且有些保证它在摊销时间内运行得相当快。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果持续的内存开销量意味着对于存储在数据结构中的N元素,空间消耗应为O(N),那么任何平衡树都会 - 事实上,任何n - ary树存储外部叶子中的元素,其中n > 1和每个外部树都包含一个元素,具有此属性。

这是因为任何带有N个节点的树形图都有N - 1个边缘。

如果持续的内存开销量意味着对于N元素,空间消耗应该是N + O(1),那么平衡树和散列表都不具有此属性 - 两者都将使用{{ 1}}内存,其中k * N是由于树的情况下的额外节点指针和哈希表的加载因子。

我发现你的方法很有趣,但即使你只对U进行排序,然后在线性时间内合并这两组,我认为它不会起作用。您需要在每次k > 1次更新后进行排序(O(logN * log(logN))操作),然后合并S和U logN合并(请注意到目前为止nobody actually knows how to do this in linear time,也就是说,没有额外的数组)。

摊销的插入时间为O(n)。但是如果允许U的大小增长到S的平方根,你可以使用你的方法来实现接近O(n / logN)的东西。

答案 1 :(得分:0)

任何哈希表都会这样做。关于它的唯一棘手的部分是如何解决冲突 - 实现它的方法很少,另一个棘手的部分是正确的哈希计算。

请参阅: http://en.wikipedia.org/wiki/Hash_table