我对heapq._siftdown函数的正确用法感到困惑。任何人都可以解释我应该通过什么论点吗?
python文档声明:
'堆'是一个堆在所有索引> = startpos,除了可能pos。
pos是叶子的索引,可能有无序值。恢复 堆不变。
https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/the man
我在翻译中尝试了这个:
def _siftdown(heap, startpos, pos):
但是,这不起作用 - 即使我已经遵守了输入条件,列表也没有排序。
答案 0 :(得分:1)
答案 1 :(得分:0)
正确的用法是不使用它。这是一个内部实现细节;它可能会更改行为,更改名称或在将来的版本中完全删除。这由_
在其名称上表示,并且它不在文档中。
答案 2 :(得分:0)
heapq.heapify() 并不总是保证按照我们在打印时看到的那样对数组进行排序。它只保证第一个元素是索引 0 处的元素是所有元素中最小的。对于一些输入,由于事情已经到位,例如 [3, 2] 我们看到在 heapify 要排序的数组之后。
heapify 被调用后这个解释(来自源代码)成立:
堆是其中 a[k] <= a[2k+1] 和 a[k] <= a[2k+2] 的数组 所有 k,从 0 开始计数元素。为了比较, 不存在的元素被认为是无限的。有趣的 堆的属性是 a[0] 总是它的最小元素。
对于筛选,它只是将更大的值冒泡到正确的位置,例如,当您删除一个元素 (pop) 时,会发生以下步骤:
因此,当我们打印数组时,siftdown 并不能保证对数组进行完整排序。 有关更多实现细节,您可以在 python 源代码中查找 heapq.py 文件。
为了总是得到一个排序的表示,我们可以使用这样的东西:
def heapify_demo(nums):
heapq.heapify(nums)
print(nums)
print(heapq.nsmallest(len(nums), nums))
print(heapify_demo([1, 2, 9, 4]))