堆和负数的奇怪行为

时间:2013-01-11 16:21:52

标签: python data-structures

我有一个算法可以创建两个堆,minHeap和maxHeap。两者之间的唯一区别是maxHeap颠倒了minHeap的标志,这是一个简单的hack,将Python的heapq数据结构用作最大堆。这是我创建堆的代码(堆密钥基本上是一周中给定日期字典中的工作者数量):

for day in self.weekDict:
    if day != 'Saturday' and len(self.weekDict[day]) != 0: #saturdays and holidays not part of optimization
        heapq.heappush(minHeap, (len(self.weekDict[day]), day))
        heapq.heappush(maxHeap, (-len(self.weekDict[day]), day))

minHeap正如预期的那样工作,但是当存在多个相同的键时,max heap会给出奇怪的行为。见下文:

[(-8, 'Thursday'), (-7, 'Monday'), (-5, 'Friday'), (-7, 'Wednesday'), (-7, 'Tuesday')]

为什么最近两天出现故障?是因为只保证第一天是最小的,一旦我第一天离开堆就会自动调整自己?

2 个答案:

答案 0 :(得分:4)

堆不是排序列表。堆是一个二叉树,恰好作为列表存储。堆的元素具有以下属性:

a [k]< = a [2 * k + 1]和[k]< = a [2 * k + 2]对于所有k

请参阅文档以获得更全面的解释,并提供一张图片来帮助您了解结构:http://docs.python.org/2/library/heapq.html#theory

答案 1 :(得分:1)

堆不是排序列表。它们是列表,您可以从中快速拉出第一个元素,并保持结构,以便您可以继续快速拉出下一个第一个元素。当您将堆作为列表查看时,元素将不会完全排序。