如何在 python 中获得最大堆
how to get the max heap in python
我在 python 中使用 heapq 模块,我发现我只能使用最小堆,即使我使用 reverse=True
我仍然得到最小堆
from heapq import *
h=[]
merge(h,key=lambda e:e[0],reverse=True)
heappush(h, (200, 1))
heappush(h, (300,2))
heappush(h, (400,3))
print(heappop(h))
我仍然得到结果:
(200, 1)
我要得到结果:
(400,3)
怎么做?
这是最小的元素。我要pop最大的emelment?
ps:这是题目中的一部分求最大值然后分成几个元素再放回堆中
Our pop method returns the smallest item, not the largest (called a
“min heap” in textbooks; a “max heap” is more common in texts because
of its suitability for in-place sorting).
所以你不能直接得到最大堆。但是,间接获取它的一种方法是将项目的 negative 压入堆中,然后在弹出项目后再次取负值。因此,您执行的不是 heappush(h, (200, 1))
,而是 heappush(h, (-200, -1))
。并弹出并打印最大项目,执行
negmaxitem = heappop(h)
maxitem = (-negmaxitem[0], -negmaxitem[1])
print(maxitem)
还有其他方法可以获得相同的效果,具体取决于您在堆中存储的内容。
请注意,在最小堆中尝试 h[-1]
无法找到最大项——堆定义不能保证最大项将在列表末尾结束。 nlargest
应该可以工作,但时间复杂度为 O(log(n))
以仅检查最小堆中最大的项目,这违背了堆的目的。我的方法在负堆中有时间复杂度 O(1)
来检查最大的项目。
为什么不使用 PriorityQueue
对象?您可以存储 (priority,key)
个元组。制作最大堆的一个简单解决方案是使 priority
与 key
:
相反
from Queue import PriorityQueue
pq = PriorityQueue()
for i in range(10): # add 0-9 with priority = -key
pq.put((-i,i))
print(pq.get()[1]) # 9
我在 python 中使用 heapq 模块,我发现我只能使用最小堆,即使我使用 reverse=True
我仍然得到最小堆
from heapq import *
h=[]
merge(h,key=lambda e:e[0],reverse=True)
heappush(h, (200, 1))
heappush(h, (300,2))
heappush(h, (400,3))
print(heappop(h))
我仍然得到结果:
(200, 1)
我要得到结果:
(400,3)
怎么做?
这是最小的元素。我要pop最大的emelment?
ps:这是题目中的一部分求最大值然后分成几个元素再放回堆中
Our pop method returns the smallest item, not the largest (called a “min heap” in textbooks; a “max heap” is more common in texts because of its suitability for in-place sorting).
所以你不能直接得到最大堆。但是,间接获取它的一种方法是将项目的 negative 压入堆中,然后在弹出项目后再次取负值。因此,您执行的不是 heappush(h, (200, 1))
,而是 heappush(h, (-200, -1))
。并弹出并打印最大项目,执行
negmaxitem = heappop(h)
maxitem = (-negmaxitem[0], -negmaxitem[1])
print(maxitem)
还有其他方法可以获得相同的效果,具体取决于您在堆中存储的内容。
请注意,在最小堆中尝试 h[-1]
无法找到最大项——堆定义不能保证最大项将在列表末尾结束。 nlargest
应该可以工作,但时间复杂度为 O(log(n))
以仅检查最小堆中最大的项目,这违背了堆的目的。我的方法在负堆中有时间复杂度 O(1)
来检查最大的项目。
为什么不使用 PriorityQueue
对象?您可以存储 (priority,key)
个元组。制作最大堆的一个简单解决方案是使 priority
与 key
:
from Queue import PriorityQueue
pq = PriorityQueue()
for i in range(10): # add 0-9 with priority = -key
pq.put((-i,i))
print(pq.get()[1]) # 9