其中Add,Get kth最大的数据结构是O(log n)和O(1)

时间:2011-05-17 00:03:54

标签: algorithm language-agnostic sorting data-structures

提供存储可比较对象的数据结构,并支持add()get(k)操作[get(k)返回数据结构(1 <= k <= n)]中的第k个最小元素。 get(k)必须为O(1)add()必须为O(log n),其中n是添加到数据结构中的对象数。提供get(k)O(log n)且添加为O(1)

的其他结构

3 个答案:

答案 0 :(得分:4)

如果我收到这个面试问题,我会回答说我不知道​​任何这样的数据结构,并怀疑它们不存在。但是我怀疑访问者正在考虑的数据结构分别是“排序数组”和“跳过列表”。

然后我会解释按位置检索数组的任何元素是O(1)。找出插入位置的是O(log(n))。然而,实际插入是O(n),因为必须移动阵列的其余部分。然而,O(n)片具有非常好的常数。

对于跳过列表,检索是O(log(n))。插入涉及仅修改一个元素的一半时间,编辑时间的1/4,编辑3的时间的1/8,依此类推,这是2个元素的平均值。那是O(1)。但是,如果不确定放置元素的位置,则无法插入元素。那个查找是O(log(n))。 (要使插入真正为O(1),您需要在可用于插入的查找中收集O(log(n))数据,或者您需要创建双向链接跳过列表的道德等效项。)

答案 1 :(得分:3)

没有办法构建一个确定性的基于比较的数据结构,其中包含分摊的O(1) - 时间添加和最坏情况下的O(log n) - 时间获取。其他配置不能被信息理论下限排除,但我严重怀疑有人知道如何去做。

对于专家:对手首先添加n个项目,回答算法的O(n)比较,以便留下至少log 2 n的大小的反共。然后它以这样的方式选择k:计算get(k)迫使算法对antichain进行选择,产生Ω的成本(log 2 n)。

为什么对手强迫这么大的反身?假设算法总是没有留下超过log 2 n元素的反链。根据Dilworth定理,元素可以被划分为至多log 2 n链,可以使用O(n log log n)比较进行合并,给出使用o(n log n)的排序算法比较,从而形成矛盾。

你的面试官有什么意思?我可以想象,如果两项业务都摊销,那么就有了解决方案。然而,这是对规范要求的非规范性放宽。

答案 2 :(得分:0)

我按照@btilly的回答,但我将尝试另一种方式来描述具有常量加法和常量get(k)的数据结构。这将使用大量内存。

任何反馈都表示赞赏,我只是在我继续做这件事时......

想象一下,我们正在讨论一组8位整数。因此,有256个整数可以成为集合的成员。

现在,想象一个平衡的二叉树,其中包含所有256个整数作为叶子,以及255个其他非叶子节点,总共给出了9个级别。此树的形状是固定的,但我们将在每个节点存储一个计数。每个叶节点上的计数将只是10,具体取决于该整数当前是否是我们集合的成员。每个非叶节点的计数将是它下面的叶子总数。

这将给我们O(1)添加(和删除)。每次添加(或删除)元素时,正好有9个节点(根节点,相关叶节点和其间的7个节点)必须递增(递减)计数。

我认为这也会给我们不断的时间查询。如果你想找到第k个最小的元素,只需从根节点开始,向下朝向相关的叶子,向右或向右移动。