Python heapq 优先队列 Maxheap

Posted

技术标签:

【中文标题】Python heapq 优先队列 Maxheap【英文标题】:Python heapq Priority Queue Maxheap 【发布时间】:2021-06-17 19:59:44 【问题描述】:

我了解使用 heapq 的优先级队列是作为 minheap 实现的。我需要将优先级队列实现为按 AWS 日期时间字符串对元素进行排序的 maxheap。当我调用 heapq.heappop() 方法时,我希望首先从队列中弹出具有最新日期时间的元素。在线上的所有内容似乎都指向仅使用 minheap,但在输入期间使您的值变为负值,以便将更大的值推到顶部而不是底部。但是,我似乎找不到任何方法将其实际应用于像这样的日期时间字符串“2021-06-03T16:11:14.206650Z”。有没有一种方法可以使该字符串为“负数”或以某种方式使其首先从堆中弹出更新的日期?

【问题讨论】:

不要使用字符串本身作为key;使用从日期时间和“最大”时间(如程序启动的时间)计算的负偏移量。 【参考方案1】:

有几种方法可以解决这个问题。

一种是将日期/时间转换为序数,然后取反

-dateutil.parser.parse('2021-06-03T16:11:14.206650Z').toordinal()

如果要保留原始日期字符串,则将此数字与日期字符串一起放在一个元组中。

【讨论】:

【参考方案2】:

将您的时间戳转换为最大时间戳的偏移量。然后最近的时间戳将具有最小的键,从而使 minheap 合适。

注意dateutil 是第三方模块。

>>> import datetime, dateutil
>>> now = datetime.datetime.now().timestamp()
>>> june3 = dateutil.parser.isoparse('2021-06-03T16:11:14.206650Z').timestamp()
>>> june1 = dateutil.parser.isoparse('2021-06-01T00:00:00Z').timestamp()
>>> now - june3 < now - june1
True

【讨论】:

以上是关于Python heapq 优先队列 Maxheap的主要内容,如果未能解决你的问题,请参考以下文章

实现优先级队列 --heapq模块

python Cookbook

python[数据]--队列,堆,优先级队列

Python库,heapq中的“q”代表啥?

线性表--优先队列

线性表--优先队列