我正在处理这个问题,但我对如何解决这个问题感到很困惑:
设计一个支持以摊销的O(log n)时间执行以下操作的数据结构,其中n是元素的总数:
如何计算摊销时间?这不就是哈希表吗?或者它是它的变种? 如果有人可以帮助我,我真的很感激。 谢谢!!
答案 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。您可以使用几种专门的数据结构来满足这些要求,尽管上面描述的那些可能是最容易使用现成组件构建的。