python的堆实现

xheap的Python项目详细描述


它类似于heapq(非常快),但是面向对象+更多特性。

Read more here for the background story

为什么?

更少的代码。

堆到底有什么用?

当你需要一个大名单中最小的项目快速而没有开销。

怎么做?

假设您有一个堆,您可以使用pop获取它的最小项。

fromxheapimportHeapheap=Heap(['H','D','B','A','E','C','L','J','I'])heap.pop()# returns Aheap.pop()# returns Bheap.pop()# returns Cheap.pop()# returns D

Heapsort这样工作。

我可以插入一个项目吗?

事实上,它和流行音乐一样快。使用push进行插入。

heap=Heap(['A','D','B','H','E','C','L','J','I'])heap.push('Z')

我可以从堆中间移除一个项目吗?

是的,这就是RemovalHeap.remove应该做的。

fromxheapimportRemovalHeapheap=RemovalHeap(['A','D','B','H','E','C','L','J','I'])heap.remove('L')

我能指定堆的顺序吗?

想象一下两堆相同的项目,但是每堆需要不同的排序。或者 你需要一个最大堆而不是最小堆。这就是OrderHeap的设计目的:

fromxheapimportOrderHeapitems=[date(2016,1,1),date(2016,1,2),date(2016,1,3),date(2016,1,4)]day_heap=OrderHeap(items,key=lambdadate:date.day)day_heap.peek()# returns date(2016, 1, 1)weekday_heap=OrderHeap(items,key=lambdadate:date.weekday())weekday_heap.peek()# returns date(2016, 1, 4)

删除+订购怎么办?

没问题。使用XHeap

如果您想知道为什么有4种不同的堆实现,那是速度问题。 每个附加功能都会减慢堆的速度。因此,您可以始终使用xheap,但要注意 经济放缓。

检查堆不变量

堆只是一个列表。所以,如果你修改它,你可以检查它的不变量是否仍然有效:

heap=Heap([4,3,7,6,1,2,9,8,5])heap[3]=10# I know what I am doing hereheap.check_invariant()# but better check... ooops

结论

良好

  • 使用C实现(如果可用)(即快速)
  • 面向对象
  • 如果您只需要一个简单的堆,就不会减速
  • 可能拆卸
  • 可定制订单
  • 与python2和python3一起工作

  • 到目前为止还没有发现缺点;-)
  • 需要修复/工作:
    • 允许重复项的项包装器
    • reduce key+increase key:另一个缺少heapq
    • 的用例
    • 合并堆
  • 欢迎提出意见:-)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java线程;创建一个单独的线程来定期执行某些操作   用java将SonarQube升级到5.2失败。util。同时发生的CancellationException:空   在线程对象上调用start时,线程上设置的java优先级无效   java如何在不使用reduce()或last()折叠的情况下获取通量的最后一项   java如何从ArrayList中获取元素?   应用了逻辑的JavaTwitterAPI   在这种情况下,怎样才能不让自己重复?安卓的java   JavaAndroid:线程可运行和处理程序。在run方法中发布问题(Handler.postXX在预期情况下不会按时运行)   java log4j grok与管道故障   使用循环返回命令选项时出现问题/仅运行一个命令(JAVA)   java双重比较问题   使用vertx的JWT公钥/私钥身份验证中的java握手   用Java将WMA和AAC音频转换为MP3   解析字符串java get index   与具有不同数据类型的密钥同名的java JSON