问题标签 [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.
python - Python,heapq,如何高效修改heapq中的最小元素?
我在 python 3.7 中使用 heapq
我有两个关于 heapq 的问题:
如果我只想修改 min 元素,我不知道如何有效地保持堆不变。
/li>
这是我的实现。(这很慢)_siftdown() 和 _siftup() 这两个方法是做什么用的?它们之间有什么区别?如何使用这两种方法来保持堆不变?
最后,我使用 _siftdown() 实现了一个代码(但是我仍然对这两种方法感到困惑,并且不能确保我的代码是否正确。)
输出是:
python - heapq.merge() 迭代器遍历的项比列表中的多
遵循 heapq.merge() 的文档- 我得到了非常奇怪的结果,并且找不到我做错了什么......设置如下:
- 我正在使用 heapq.merge() 对多个列表进行排序。用2~8个列表迭代器测试,结果完全一样。列表包含 10K ~ 25K 项。
- 列表元素本身实现了列表排序所需的一切(__ lt__()、__ eq__()、...)。
- 我测试了这些特殊的排序方法是否被调用,无论是在对列表本身进行排序时,还是在调用 heapq.merge() 方法时。
- 我确保列表不包含任何重复条目。甚至没有交叉列表。使用我附加到每个元素的简单运行编号,并在比较中使用。
输出:在遍历 2 个每个包含 25K 项的列表时,我得到了 100K 的结果。投入的金额翻倍。
我相信我遵循了这里的所有要求。我应该在将列表输入 heapq.merge 之前对列表进行堆放吗?文档中没有这样说,也不清楚应该/是否应该这样做。
有什么线索吗?
python - 如何有效地弹出 heapq 中键最小的所有元素?
我正在做一个模拟实验,并试图让我的代码尽可能高效。一方面,我有一个最小堆优先级队列,我使用heapq
模块实现了它。
在整个模拟过程中,我必须用最小的键弹出所有元素。这样做的直接方法是:
python - Python库,heapq中的“q”代表什么?
Python 有这个库 heapq,我们可以用它来执行堆操作。“q”代表什么?
python - python中heapq.merge的时间复杂度是多少?
我读到 heapq.merge 函数专门用于合并2个排序数组?时间复杂度是 O(n)?如果不是,那是什么,为什么?还有它的空间复杂度是多少。
我正在解决用 2 个指针合并 2 个排序数组的问题,并且可以实现 O(n) 时间复杂度和 O(n) 空间复杂度。
python - Heapq 模块和字典之间的奇怪干扰
一方面,我有一个grid
defaultdict,它将每个节点的相邻节点存储在网格上及其权重(在下面的示例中均为 1)。
另一方面,我有一个Djisktra
函数可以计算该网格上 2 个节点之间的最短路径。该算法使用该heapq
模块并且工作得非常好。
问题:多次调用 Djikstra 函数时,是......无缘无故heappush
在字典中添加新键!grid
这是一个MCVE:
原来的grid
默认字典:
Djikstra
...并在多次调用该函数后:
Djikstra
当多次调用该函数时 heappush
(只是在最后评论 heappush):
问题:
- 我怎样才能避免这种奇怪的行为?
请注意,我使用的是 Python 2.7,不能使用 numpy。
python - 为什么 _siftup 和 _siftdown 在 Python 中正好相反?
从Wikipedia
中对二叉堆sift-up
的定义来看,也称为up-heap
操作,sift-down
称为down-heap
.
所以在堆(完全二叉树)中,up
意思是从叶子到根,也down
就是从根到叶子。
但在python中,它似乎正好相反。我对siftup
and的含义感到困惑siftdown
,并且在我第一次使用时被误用。
这是_siftdown
和_siftup
in的 python 版本实现heapq
:
为什么在python中相反?我已经在 wiki 和其他几篇文章中确认过。有什么我遗漏或误解的吗?
感谢您的阅读,我非常感谢它帮助我。:)
python - Dijkstra 的 SPF 算法中两个顶点(节点)实例之间的 TypeError
作为学习的一部分,我目前正在解决火车时刻表优化问题。在这个问题中,必须最大化效用函数,这会增加访问的(关键)车站的数量,并减少使用的火车数量和火车运行的总分钟数。
问题由站(节点)和连接(边)组成。这两个方面的数据首先从两个 CSV 文件中加载。然后,为每个站点(包含名称以及它是否重要)和每个连接(包含连接中的站点,以及前往另一个站点所花费的时间)实例化类。这些站点和连接都存储在字典中。
作为第一步,我和我的队友决定我们首先要实现 Dijkstra 的寻路算法的一个版本,以便找到两个站点之间的最快路线。BogoToBogo有一个关于如何实现 Dijkstra 算法版本的非常详细的指南。我们决定首先尝试实现他们的代码,看看结果如何。但是,TypeError 不断弹出:
TypeError:“顶点”和“顶点”的实例之间不支持“<”
如果有人知道是什么导致了这个错误,任何帮助都会非常感激!
在这种情况下,函数 dijkstra 被调用,给定参数 g(它是 Graph 类的一个实例)、Alkmaar 和 Zaandam。
图表类。
顶点类。谢谢你的时间!
python-3.x - 与集合的整体大小相比,N 较小意味着什么?
我是 python-3x 的新手,我很难理解与集合的整体大小相比 N 更小意味着什么:“如果您正在寻找 N 个最小或最大的项目并且 N 很小与集合的整体大小相比,这些函数提供了卓越的性能。在幕后,它们首先将数据转换为列表,其中项目作为堆排序。https://www.oreilly.com/library/view/python-cookbook-3rd/9781449357337/ch01.html