我想知道,在下列标准和时间下是否存在这样的数据结构(可能很复杂)?
如果我们获得一个未排序的列表L,就像这样构建一个数据结构:
问题是列表L未排序。可以存在这样的数据结构吗?
答案 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)个最大的元素。所有元素都有相互交叉索引。