【问题标题】:existence of a certain data structure存在某种数据结构
【发布时间】:2018-04-21 16:09:29
【问题描述】:

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

如果我们获得一个未排序的列表 L 并用它构建一个数据结构,如下所示:

  • Build(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 未排序。这样的数据结构能存在吗?

【问题讨论】:

  • 你如何在亚线性时间内构建一个数据结构?您假设此列表具有哪些属性?是链表吗?还有什么?
  • 列表以未排序的方式包含数字。如果它是一个链表,这可能吗?我知道这很复杂,这就是为什么我想知道它是否存在
  • 当然不是。您不能在不处理项目的情况下将项目放入数据结构中。你的问题有点像“我想做一百万件事,我可以通过做不到一百万件事来做一百万件事吗?”
  • @JohnColeman 让我们慢慢来,逐案进行。实现 Build(L,X)(在 O(n) 下)和 Insert (y,S)(在 O(log n) 下)的最佳方法是什么?
  • 我希望“under O(.)”的意思是“in O(.)”。在此前提下,保持子树大小的平衡二叉搜索树就是这样的数据结构。事实上,对于一些流行的语言,只需初步的理解努力是可能的:例如,可以从 C++ 标准库的this GCC extension 构造这样一棵树。

标签: algorithm data-structures


【解决方案1】:

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

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

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

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

【讨论】:

  • DEL-MIN 和 DEL-MAX 不需要单独的最小堆和最大堆。有一个min-max heap
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 2011-01-30
相关资源
最近更新 更多