我有一个算法可以创建两个堆minMinap和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')]


为什么最近两天出现故障?是因为仅保证第一天是最少的时间,并且一旦我弹出第一天,堆便会自动进行调整?

最佳答案

堆不是排序列表。堆是一棵二进制树,碰巧被存储为列表。堆的元素具有以下属性:

对于a中的所有k,a [k]
请参阅文档,以获取更完整的说明和漂亮的图片,以帮助遵循以下结构:http://docs.python.org/2/library/heapq.html#theory

关于python - 堆和负数的怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14282292/

10-16 12:57