找到堆中元素的位置

时间:2018-04-02 21:58:51

标签: python algorithm

考虑以下元素列表。

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,这样我们就知道它的位置,如果我们跟踪从堆中弹出项目的次数。但是,当我们修改堆本身时,这并不是非常有效。

有没有更好的方法来解决问题?

3 个答案:

答案 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的计数的正确索引。堆的结尾。