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 的用例
- 合并堆
- 欢迎提出意见:-)