我正在解决一个需要使用堆数据结构解决的问题。尽管操作将由 insert 和 extract-min 主导,但在某些情况下,我需要替换项目的键(增加或减少)或完全删除项目,键。由于该heapq
模块不提供这些操作并且在堆中搜索一个项目O(n)
,因此使用 dict 进行簿记然后仅使用它来查找项目的位置、删除或替换它并调用heapify
恢复会更聪明堆属性——所有这些操作都将在O(logn)
. 不过,问题是我无法实现这样的字典。
h, bkp = [], {}
heappush(h, (5, 'a'))
bkp['a'] = # index of 'a' in heap
heappush(h, (7, 'b'))
bkp['b'] = # index of 'b' in heap
heappush(h, (1, 'c'))
bkp['c'] = # index of 'c' in heap
# deleting 'a'
h[bkp['a']], h[-1] = h[-1], h[bkp['a']]
h.pop()
heapify(h)
#update indices in bkp
问题 - 如何找到堆中新插入的索引,以及在删除或推送操作之后,如何重新计算堆中现有项的索引?