Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换和删除堆中的操作_Python_Data Structures - Fatal编程技术网

Python 替换和删除堆中的操作

Python 替换和删除堆中的操作,python,data-structures,Python,Data Structures,我正在解决一个需要使用堆数据结构来解决的问题。虽然操作将由insert和extract min控制,但在某些情况下,我需要替换项的键(增加或减少)或删除项,即全部键。由于heapq模块不提供这些操作,在堆中搜索项目将是O(n),因此更明智的做法是只使用dict记账,然后使用它查找项目的位置,删除或替换它并调用heapify以恢复堆属性-所有这些操作都将在O(logn)中运行。 但问题是我无法实现这样一个命令 h, bkp = [], {} heappush(h, (5, 'a')) bkp['a

我正在解决一个需要使用堆数据结构来解决的问题。虽然操作将由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

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

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

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

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


希望这有帮助

如果它是C/C++,我会在对象移动时保留对它的引用并计算索引。在不亲自进行堆计算的情况下,很难说一个对象最终会得到哪个索引。您是否在
heapq
文档中看到了删除的方法(并在此基础上更改键)?我不确定是否理解第一个选项。你能写一些示例代码来说明你的意思吗?谢谢