问题标签 [heapq]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
266 浏览

python - Python,heapq,如何高效修改heapq中的最小元素?

我在 python 3.7 中使用 heapq
我有两个关于 heapq 的问题:

  1. 如果我只想修改 min 元素,我不知道如何有效地保持堆不变。
    这是我的实现。(这很慢)

    /li>
  2. _siftdown() 和 _siftup() 这两个方法是做什么用的?它们之间有什么区别?如何使用这两种方法来保持堆不变?

最后,我使用 _siftdown() 实现了一个代码(但是我仍然对这两种方法感到困惑,并且不能确保我的代码是否正确。

输出是:

0 投票
2 回答
264 浏览

python - heapq.merge() 迭代器遍历的项比列表中的多

遵循 heapq.merge() 的文档- 我得到了非常奇怪的结果,并且找不到我做错了什么......设置如下:

  1. 我正在使用 heapq.merge() 对多个列表进行排序。用2~8个列表迭代器测试,结果完全一样。列表包含 10K ~ 25K 项。
  2. 列表元素本身实现了列表排序所需的一切(__ lt__()、__ eq__()、...)。
  3. 我测试了这些特殊的排序方法是否被调用,无论是在对列表本身进行排序时,还是在调用 heapq.merge() 方法时。
  4. 我确保列表不包含任何重复条目。甚至没有交叉列表。使用我附加到每个元素的简单运行编号,并在比较中使用。

输出:在遍历 2 个每个包含 25K 项的列表时,我得到了 100K 的结果。投入的金额翻倍。

我相信我遵循了这里的所有要求。我应该在将列表输入 heapq.merge 之前对列表进行堆放吗?文档中没有这样说,也不清楚应该/是否应该这样做。

有什么线索吗?

0 投票
1 回答
1621 浏览

python - Python3 中的 Heapq 不能使用元组,因为它没有按期望顺序弹出

每个人都说如果你将元组推入heapq,它将把第一个参数作为比较因素。

但事实并非如此!我很好奇我的代码有什么问题?

输出

我想我应该先拿到有价值的物品A,对吧?但事实并非如此。

在 Python 中使用内置优先级队列的任何替代解决方案?

另一个例子的输出。

在此处输入图像描述

0 投票
2 回答
388 浏览

python - 如何有效地弹出 heapq 中键最小的所有元素?

我正在做一个模拟实验,并试图让我的代码尽可能高效。一方面,我有一个最小堆优先级队列,我使用heapq模块实现了它。

在整个模拟过程中,我必须用最小的键弹出所有元素。这样做的直接方法是:

0 投票
2 回答
70 浏览

python - Python库,heapq中的“q”代表什么?

Python 有这个库 heapq,我们可以用它来执行堆操作。“q”代表什么?

0 投票
2 回答
1013 浏览

python - python中heapq.merge的时间复杂度是多少?

我读到 heapq.merge 函数专门用于合并2个排序数组?时间复杂度是 O(n)?如果不是,那是什么,为什么?还有它的空间复杂度是多少。

我正在解决用 2 个指针合并 2 个排序数组的问题,并且可以实现 O(n) 时间复杂度和 O(n) 空间复杂度。

0 投票
1 回答
49 浏览

python - Heapq 模块和字典之间的奇怪干扰

一方面,我有一个griddefaultdict,它将每个节点的相邻节点存储在网格上及其权重(在下面的示例中均为 1)。

另一方面,我有一个Djisktra函数可以计算该网格上 2 个节点之间的最短路径。该算法使用该heapq模块并且工作得非常好。

问题:多次调用 Djikstra 函数时,是......无缘无故heappush在字典中添加新键!grid

这是一个MCVE:

原来的grid默认字典:

Djikstra...并在多次调用该函数后:

Djikstra当多次调用该函数 heappush(只是在最后评论 heappush):

问题

  • 我怎样才能避免这种奇怪的行为?

请注意,我使用的是 Python 2.7,不能使用 numpy。

0 投票
1 回答
1305 浏览

python - 为什么 _siftup 和 _siftdown 在 Python 中正好相反?

从Wikipedia 中对二叉堆sift-up的定义来看,也称为up-heap操作,sift-down称为down-heap.

所以在堆(完全二叉树)中,up意思是从叶子到根,也down就是从根到叶子。

但在python中,它似乎正好相反。我对siftupand的含义感到困惑siftdown,并且在我第一次使用时被误用。

这是_siftdown_siftupin的 python 版本实现heapq

为什么在python中相反?我已经在 wiki 和其他几篇文章中确认过。有什么我遗漏或误解的吗?

感谢您的阅读,我非常感谢它帮助我。:)

0 投票
1 回答
231 浏览

python - Dijkstra 的 SPF 算法中两个顶点(节点)实例之间的 TypeError

作为学习的一部分,我目前正在解决火车时刻表优化问题。在这个问题中,必须最大化效用函数,这会增加访问的(关键)车站的数量,并减少使用的火车数量和火车运行的总分钟数。

问题由站(节点)和连接(边)组成。这两个方面的数据首先从两个 CSV 文件中加载。然后,为每个站点(包含名称以及它是否重要)和每个连接(包含连接中的站点,以及前往另一个站点所花费的时间)实例化类。这些站点和连接都存储在字典中。

作为第一步,我和我的队友决定我们首先要实现 Dijkstra 的寻路算法的一个版本,以便找到两个站点之间的最快路线。BogoToBogo有一个关于如何实现 Dijkstra 算法版本的非常详细的指南。我们决定首先尝试实现他们的代码,看看结果如何。但是,TypeError 不断弹出:

TypeError:“顶点”和“顶点”的实例之间不支持“<”

如果有人知道是什么导致了这个错误,任何帮助都会非常感激!

在这种情况下,函数 dijkstra 被调用,给定参数 g(它是 Graph 类的一个实例)、Alkmaar 和 Zaandam。

图表类。

顶点类。谢谢你的时间!

0 投票
0 回答
19 浏览

python-3.x - 与集合的整体大小相比,N 较小意味着什么?

我是 python-3x 的新手,我很难理解与集合的整体大小相比 N 更小意味着什么:“如果您正在寻找 N 个最小或最大的项目并且 N 很小与集合的整体大小相比,这些函数提供了卓越的性能。在幕后,它们首先将数据转换为列表,其中项目作为堆排序。https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch01.html