2013-01-11 48 views
1

我有一个算法,创建两个堆,minHeap和maxHeap。两者之间的唯一区别是maxHeap颠倒了minHeap的符号,这是一种简单的黑客方式,将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作品一样预期,但最大堆给我奇当存在多于一个相同的密钥时的行为。见下:

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

为什么最近两天出现故障?是否因为只有第一天保证是最低限度的,并且一旦我第一天离开堆会自动调整自己?

回答

3

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

一个[K] < = A [2 * K + 1]和a [k]的< = A [2 * K + 2]一种用于在

所有k

请参阅文档以获得更全面的解释和帮助遵循结构的漂亮照片:http://docs.python.org/2/library/heapq.html#theory

1

堆不是排序列表。它们是可以快速拉出第一个元素的列表,并且还可以维护该结构,以便继续快速拉取下一个元素。当您将堆看作列表时,元素将不会完全排序。