数据结构设计与O(log n)摊销时间?

时间:2015-12-08 00:30:19

标签: algorithm data-structures time-complexity

我正在处理这个问题,但我对如何解决这个问题感到很困惑:

设计一个支持以摊销的O(log n)时间执行以下操作的数据结构,其中n是元素的总数:

  1. Ins(k):插入一个带有键k的新元素
  2. Extract-Max:查找并删除具有最大键的元素
  3. Extract-Min:查找并删除具有最小键的元素
  4. Union:合并两组不同的元素
  5. 如何计算摊销时间?这不就是哈希表吗?或者它是它的变种? 如果有人可以帮助我,我真的很感激。 谢谢!!

1 个答案:

答案 0 :(得分:2)

您提出的建议并不是大多数哈希表都可以处理的事情,因为哈希表通常不支持快速查找最小和最大元素,同时支持删除。

然而,这个你可以用一对支持融合的优先级队列。例如,假设您使用two binomial heaps备份数据结构 - 最小堆和最大堆。每次将元素插入数据结构时,都会将其添加到min-heap和max-heap中。但是,您稍微修改了两个堆,以便堆中的每个元素都存储指向另一个堆中相应元素的指针;这样,给定最小堆中的节点,您可以在max-heap中找到相应的节点,反之亦然。

现在,要执行extract-min或extract-max,只需对min-heap应用find-min操作或对max-heap应用find-max操作即可获得结果。然后,使用正常的二项式堆删除操作从两个堆中删除该元素。 (您可以使用在插入步骤中设置的指针快速定位其他堆中的兄弟元素。)

最后,对于联合操作,只需将正常的二项式堆合并操作应用于相应的最小堆和最大堆。

由于所有描述的操作都需要对二项式堆进行O(1)运算,因此每个运算都在时间O(log n)的最坏情况下运行,不需要摊销。

一般来说,您描述的数据结构称为double-ended priority queue。您可以使用几种专门的数据结构来满足这些要求,尽管上面描述的那些可能是最容易使用现成组件构建的。