python 中的最小堆
我想通过定义自定义比较函数将一组对象存储在最小堆中。 我看到有一个 heapq 模块作为 python 发行版的一部分可用。 有没有办法在此模块中使用自定义比较器? 如果没有,其他人是否构建了自定义最小堆?
I'd like to store a set of objects in a min heap by defining a custom comparison function. I see there is a heapq module available as part of the python distribution. Is there a way to use a custom comparator with this module? If not, has someone else built a custom min heap?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有两个选项(除了 Devin Jeanpierre 的建议):
在使用堆之前装饰您的数据。 这相当于排序的
key=
选项。 例如,如果您(出于某种原因)想根据正弦值堆积数字列表:heapq 模块是用纯 python 实现的。 您只需将其复制到工作目录并更改相关位即可。 快速浏览一下,您必须修改 siftdown() 和 siftup(),如果需要的话还可能需要修改 nlargest 和 nsmallest。
Two options (aside from Devin Jeanpierre's suggestion):
Decorate your data before using the heap. This is the equivalent of the
key=
option to sorting. e.g. if you (for some reason) wanted to heapify a list of numbers according to their sine:The
heapq
module is implemented in pure python. You could just copy it to your working directory and change the relevant bits. From a quick look, you would have to modify siftdown() and siftup(), and possibly nlargest and nsmallest if you need them.是的,有办法。 定义一个实现自定义比较器的包装类,并使用这些比较器的列表而不是实际对象的列表。 这是在仍然使用 heapq 模块时最好的,因为它没有像排序函数/方法那样提供 key= 或 cmp= 参数。
Yes, there is a way. Define a wrapping class that implements your custom comparator, and use a list of those instead of a list of your actual objects. That's about the best there is while still using the heapq module, since it provides no key= or cmp= arguments like the sorting functions/methods do.