繁体   English   中英

堆和负数的怪异行为

[英]Weird Behavior With Heaps and Negative Numbers

我有一个算法可以创建两个堆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] <= a [2 * k + 1]和a [k] <= a [2 * k + 2]

请参阅文档以获取更完整的说明和一张漂亮的图片,以帮助您遵循以下结构: http : //docs.python.org/2/library/heapq.html#theory

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM