【发布时间】:2017-09-12 19:46:29
【问题描述】:
我的代码如下所示,其中heap 是list:
heap[0] = heap.pop()
问题是弹出唯一的项目时它不起作用。根据 python wiki,弹出最后一个元素是 O(1)。 (我也想去掉最后一个元素)
到目前为止,我想出了什么:
last_element = heap.pop() # I don't want to catch potential IndexError here
try:
heap[0] = last_element
except IndexError:
heap.append(last_element)
更长的时间
或者这个
if len(heap) != 1:
heap[0] = heap.pop()
应该更慢。
有没有更蟒蛇的方式来做到这一点?在内部,python 甚至可能不会调整数组的大小。
更新: 我需要 O(1) 访问给定索引处的元素(因此它不能是链表)。
【问题讨论】:
-
heap[0] = heap.pop(-1)是否也适用于更大的列表?例如,如果heap是[1,2,3],那么您希望它变成[3,1,2],对吗?但是heap[0] = heap.pop(-1)导致它变成[3,2],.. 或者这就是你想要的?请澄清。 -
单个
if声明不是您应该担心的成本。 -
Python 文档说
list.pop(),没有参数,删除并返回列表中的最后一项。 -
您确定了解您的要求吗?
heap[0] = heap.pop(-1)听起来像是在筛选之前立即出现在堆弹出例程中的那种东西,但是如果你从堆中弹出唯一的元素,你不应该在全部;您应该只删除并返回单个元素。 -
@user2357112 是的,它在筛选之前。你刚刚把我从另一个调试中救了出来。所以我可能会使用 try except 的东西,在这种情况下不要冒泡。
标签: python python-3.x heap