[Python-Dev] Priority queue (binary heap) python code
Kevin O'Connor
kevin@koconnor.net
Mon, 24 Jun 2002 21:33:18 -0400
I often find myself needing priority queues in python, and I've finally
broken down and written a simple implementation. Previously I've used
sorted lists (via bisect) to get the job done, but the heap code
significantly improves performance. There are C based implementations, but
the effort of compiling in an extension often isn't worth the effort. I'm
including the code here for everyone's amusement.
Any chance something like this could make it into the standard python
library? It would save a lot of time for lazy people like myself. :-)
Cheers,
-Kevin
def heappush(heap, item):
pos = len(heap)
heap.append(None)
while pos:
parentpos = (pos - 1) / 2
parent = heap[parentpos]
if item <= parent:
break
heap[pos] = parent
pos = parentpos
heap[pos] = item
def heappop(heap):
endpos = len(heap) - 1
if endpos <= 0:
return heap.pop()
returnitem = heap[0]
item = heap.pop()
pos = 0
while 1:
child2pos = (pos + 1) * 2
child1pos = child2pos - 1
if child2pos < endpos:
child1 = heap[child1pos]
child2 = heap[child2pos]
if item >= child1 and item >= child2:
break
if child1 > child2:
heap[pos] = child1
pos = child1pos
continue
heap[pos] = child2
pos = child2pos
continue
if child1pos < endpos:
child1 = heap[child1pos]
if child1 > item:
heap[pos] = child1
pos = child1pos
break
heap[pos] = item
return returnitem
--
------------------------------------------------------------------------
| Kevin O'Connor "BTW, IMHO we need a FAQ for |
| kevin@koconnor.net 'IMHO', 'FAQ', 'BTW', etc. !" |
------------------------------------------------------------------------