如何在最小堆中跟踪元素的位置/索引?

Posted

技术标签:

【中文标题】如何在最小堆中跟踪元素的位置/索引?【英文标题】:How can I keep track of the positions/indices of my elements in a minimum heap? 【发布时间】:2021-05-27 10:08:34 【问题描述】:
heap = MinHeap()
print(heap) #[]
heap.push(5)
print(heap) #[5]
heap.push(1)
print(heap) #[1,5]
heap.push(4)
print(heap) #[1,5,4]
heap.push(20)
print(heap) #[1,5,4,20]
heap.push(2)
print(heap) #[1,2,4,20,5]

每次服务或推入最小堆时,我如何不断跟踪最小堆中每个项目的索引位置?这个复杂度能在O(1)时间复杂度内实现吗?

【问题讨论】:

欢迎来到 SO,您能否更准确地了解预期输出以及您尝试达到的目标? 你是否假设堆中的值是唯一的? 【参考方案1】:

如果您有自己的 MinHeap 实现,则为其添加一个字典属性(如 self._dict),其中键是堆中的值,值是它们的位置(索引)。

因此,如果您当前为某个索引分配(移动、交换、...)值,例如 self.arr[i] = val,那么您也应该使用 self._dict[val] = i

要使其按预期工作,您需要确保堆中的值是唯一的。如果没有,则在您的实现中添加一个频率计数器,并且不要在不同的索引处存储两次相同的值。

【讨论】:

以上是关于如何在最小堆中跟踪元素的位置/索引?的主要内容,如果未能解决你的问题,请参考以下文章

使用最小堆优化Dijkstra算法

数据结构堆的删除

O(klogk) 时间算法从二进制堆中找到第 k 个最小元素

最小堆排序MinHeap

二叉堆

堆排序学习笔记