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 Android中比较字符串   java Month二月在下面的程序中被解析为'33'。如何修复?   用于在方法调用中显式指定泛型参数的Javasyntax   java 安卓。操作系统。NetworkOnMainThread尝试与jsoup 安卓连接时出现异常   java Spring引导找不到jsp视图   java如何访问注释中的属性值?   反射我可以使用isAssignableFrom检查C1是Java中C2的子类型吗?   java如何在selenium中从HTTP服务器传递图像URL   java导入失败。hibernate中的sql   Java中的“断开”while循环   java如何向Spark数据集添加映射列?   java应该在中部署消息驱动bean。耳文件?   java为何如此悲观。在springboot JPA中写入不起作用?   web服务如何在Java中高效地管理文件系统上的文件?   Java验证日期条目   java错误:在AWS RDS上找不到适合数据库的驱动程序   java如何将OBJ文件面定义传递给openGL