Python 支持修改其元素的堆?

Python 支持修改其元素的堆?,python,heap,a-star,Python,Heap,A Star,这是我的设想。我想实现一个*(在Python中)而不必求助于线性时间min或in操作。我需要一个堆,以便能够有效地获得最低重量的项目 我的第一反应是“简单!我要用heapq然后我发现生活很少像我们希望的那样简单。事实证明,这种策略对于A*的一个关键点来说是次优的。当考虑孩子时,我需要偶尔更新已经堆在的孩子的分数。 对于那些对A*的记忆有点消失的人来说,其要点是我想取一个元素,修改它的权重,修改堆以反映变化,所有这些都是在次线性时间内完成的 有什么建议吗 没错,无论是heapq中的堆函数还是Que

这是我的设想。我想实现一个*(在Python中)而不必求助于线性时间min或in操作。我需要一个堆,以便能够有效地获得最低重量的项目

我的第一反应是“简单!我要用heapq然后我发现生活很少像我们希望的那样简单。事实证明,这种策略对于A*的一个关键点来说是次优的。当考虑孩子时,我需要偶尔更新已经堆在的孩子的分数。 对于那些对A*的记忆有点消失的人来说,其要点是我想取一个元素,修改它的权重,修改堆以反映变化,所有这些都是在次线性时间内完成的


有什么建议吗

没错,无论是
heapq
中的堆函数还是
Queue.PriorityQueue
中的堆函数都非常有用。A:在你的博客上写一篇长篇大论或B:自己实现一篇长篇大论可能需要同样的时间。

出于复杂性的目的,你可能想尝试使用二项式或斐波那契堆;在Python中似乎有这两种语言的实现,但在生产级库中没有。不过,实际上,二进制或d进制堆可能工作得更快。
heapq
页面提到如何进行更新(保留对插入到堆中的项的引用,将其标记为无效,然后插入新版本)。不过,有一些更快的算法可以在更新后维护heap属性。查看用于快速更新的算法,但您可能需要在这些算法的数组上实现自己的堆。

我总是实现自己版本的堆类型,确切的原因是您无法在堆中实际搜索,而所有有效的方法都需要“指向元素的指针”作为输入

通常,我将堆实现为项目的非结构化容器和指向项目的指针(或索引)堆的组合。如果在项目中保留指向堆位置的指针,则会有一个直接的双向链接: a) 给定一个Heap元素(例如,extractMin或在比较过程中返回):取消对指针的引用,就得到了项目。 b) 给定一个项(例如,通过图形算法的邻接列表):将指针传递给所需的任何更新函数

当然,这会导致空间开销(每个项增加2个指针/整数),但这会使堆重构非常便宜(交换几个指针而不是交换整个项),这反过来会减少向项中添加额外卫星数据的痛苦