在堆中替换和删除操作

时间:2012-12-11 04:49:13

标签: python data-structures

我正在解决一个需要使用堆数据结构解决的问题。虽然操作将由insert和extract-min控制,但是有些情况下我需要更换项目的键(增加或减少)或完全删除项目键。由于heapq模块不提供这些操作并且在堆中搜索项目将是O(n),因此仅使用dict进行簿记会更聪明,然后只使用它来查找位置item,删除或替换它并调用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

问题 - 如何在堆中找到新插入的索引,在删除或推送操作之后,如何重新计算堆中现有项的索引?

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。

一种选择是通过将每个对象的位置存储在对象本身中来使您的堆具有侵入性。这样,无论何时想要查找对象的位置,只需在对象中查找位置字段,就可以在O(1)中执行此操作。

您还可以存储辅助哈希表或BST以及将堆中的每个值映射到堆中位置的堆。这类似于第一种方法,但有一个额外的间接层。

希望这有帮助!