修改堆项后,VSCode Python heap[0] 不再是最小值

VSCode Python heap[0] is no longer the min after modifying the heap items

提问人:Egret 提问时间:11/10/2023 最后编辑:Egret 更新时间:11/12/2023 访问量:39

问:

在 VS Code 中,我有一个 Python 堆变量,它是一个包含三项元组的列表,定义为

heapq.heappush(heap, (len(candidates[(i, j)]), i, j))

在调试之初,总是最短的元组。但是,在对堆中的项目(不是顶部项目)进行了几轮修改后,通过执行以下操作:heap[0]len(candidates[i, j])

heap.remove((length, r, c))
heapq.heappush(heap, (length - 1, r, c))

,不再指向最小项目。例如,在调试控制台中,可能会显示 ,而存在另一个堆项。因为 显然不应该位于堆中的其他项之上。heap[0]heap[0](3, 4, 5)(1, 6, 7)1 < 3(3, 4, 5)

python 数独

评论


答:

2赞 Tanishq Chaudhary 11/10/2023 #1

它不再指向最小项,因为在执行 . 从技术上讲,Python允许你为某些值做一些事情,但堆的全部意义在于允许你或“删除”堆中的最低值。remove()list.remove(x)x(heap)pop

这样做在逻辑上是不正确的,并且将不再保持堆不变性(因此它仅充当列表)。用于从堆中删除元素。heap.remove()heapq.heappop(heap)

如果您仍然想从数据结构中删除特定元素,并希望访问最小的元素,您可以在此处查看 Python 中的排序列表。

评论

0赞 Egret 11/12/2023
谢谢!我正在考虑的另一个解决方案(没有第三方库)是,如果在每次修改之后进行修改是一个好主意(例如时间复杂性)heapify
1赞 Tanishq Chaudhary 11/12/2023
heapify每次都需要时间(其中是堆中的元素数)。它可能不是最优化的,但是的,一个可能的解决方案。O(N)N