提问人:Egret 提问时间:11/10/2023 最后编辑:Egret 更新时间:11/12/2023 访问量:39
修改堆项后,VSCode Python heap[0] 不再是最小值
VSCode Python heap[0] is no longer the min after modifying the heap items
问:
在 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)
答:
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
评论