存在某种数据结构

时间:2018-04-21 16:09:29

标签: algorithm data-structures

我想知道,在下列标准和时间下是否存在这样的数据结构(可能很复杂)?

如果我们获得一个未排序的列表L,就像这样构建一个数据结构:

  • 构建(L,X) - 在O(n)时间,我们从n个元素的未排序列表构建结构S
  • 在O(lg n)下插入(y,S),我们将z插入结构S
  • DEL-MIN(S) - 在O(lg n)下,我们从S
  • 中删除最小元素
  • DEL-MAX(S) - 在O(lg n)下,我们从S
  • 中删除最大元素
  • DEL-MId(S) - 在O(lg n)下我们从S
  • 删除上部内侧(天花板功能)元素

问题是列表L未排序。可以存在这样的数据结构吗?

1 个答案:

答案 0 :(得分:2)

DEL-MIN和DEL-MAX很简单:保留所有元素的最小堆和最大堆。唯一的技巧是你必须在堆中保留值的索引,以便在(例如)删除max时,你也可以找到它并在min-heap中删除它。

对于DEL-MED,您可以保持元素的最大堆小于中位数,并且元素的最小堆大于或等于中位数。完整的描述在这个答案中:Data structure to find median。请注意,在该答案中,返回了中位数,但这很容易修复。同样,您需要使用交叉索引技巧来引用第一部分中的其他数据结构。如果在您的问题公式中可行,您还需要考虑如何处理重复元素。 (如果有必要,可以通过在堆中存储重复的元素作为(count,value)来实现,但这会使插入/删除堆上的堆重新平衡变得复杂。)

这一切都可以用O(n)构建吗?是的 - 您可以在O(n)时间内找到n个事物的中位数(使用中位数中值算法),并且可以在O(n)时间内构建堆。

总的来说,数据结构是4堆(所有元素的最小堆,所有元素的最大堆,最小堆的最小堆(n / 2)最小元素,最小堆ceil(n / 2)个最大的元素。所有元素都有相互交叉索引。