考虑以下元素列表。
h = [38, 203, 1, 45, 39, 10, 34, 90, 10, 2, 100, 1]
如果将它变成基于数组的堆,它将以下列方式查找。
import heapq
heapq.heapify(h)
# now we have a heap that looks like this
# [1, 2, 1, 10, 39, 10, 34, 90, 45, 203, 100, 38]
找出39
在此堆中的位置的最佳方法是什么?
找出的一种方法是从堆中弹出项目直到它返回39,这样我们就知道它的位置,如果我们跟踪从堆中弹出项目的次数。但是,当我们修改堆本身时,这并不是非常有效。
有没有更好的方法来解决问题?
答案 0 :(得分:3)
根据评论中的说明,您似乎希望将堆视为完全排序的数据结构,并查找小于或大于特定元素的元素数。
堆不支持此操作。如果您想要执行此类操作,则应使用 为其设计的数据结构。例如,sortedcontainers.SortedList
:
import sortedcontainers
l = sortedcontainers.SortedList([38, 203, 1, 45, 39, 10, 34, 90, 10, 2, 100, 1])
index = l.index(39)
如果你真的想要使用堆,你可以运行堆的greedy search并在你点击你正在寻找的项目时停止。对于低优先级的项目,这将是非常昂贵的;在最坏的情况下,它将具有完整排序的时间复杂度,具有更差的常数因子。
答案 1 :(得分:0)
如果你想保持堆,可能会这样:
ordered = []
temp = heap[:]
while temp:
ordered.append(heapq.heappop(temp))
print(ordered.index(39))
如果情况并非如此,那么使用sort会更适合你:
heap.sort()
print(heap.index(39))
Docs说:
这两个可以将堆视为常规Python列表 毫无意外:heap [0]是最小的项目,而heap.sort() 保持堆不变!
答案 2 :(得分:0)
根据您提供的数据,我认为这证明是简单的算术。
您需要39
的索引倒数,对吗?
idx = len(h) - h.index(39) - 1
这导致来自"右"的基于0的计数的正确索引。堆的结尾。