Python heapq._siftdown函数说明

时间:2015-05-22 01:29:33

标签: python python-2.7

我对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):

但是,这不起作用 - 即使我已经遵守了输入条件,列表也没有排序。

3 个答案:

答案 0 :(得分:1)

除非你认为行为不端,否则它会减少。堆不是微不足道的。搜索wikipedia page for heap上的向下搜索。或者你可能想从页面的顶部开始并按照你的方式工作:)。

答案 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) 时,会发生以下步骤:

  1. 查找要删除的号码的索引
  2. 最后一个元素被放入该索引中,这可能会更大,可能会破坏二叉树规则。
  3. 然后调用 sift down 将这个更大的值发送到正确的位置。

因此,当我们打印数组时,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]))