]> granicus.if.org Git - python/commitdiff
Added new heapreplace(heap, item) function, to pop (and return) the
authorTim Peters <tim.peters@gmail.com>
Sat, 3 Aug 2002 10:10:10 +0000 (10:10 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 3 Aug 2002 10:10:10 +0000 (10:10 +0000)
currently-smallest value, and add item, in one gulp.  See the second
N-Best algorithm in the test suite for a natural use.

Lib/heapq.py
Lib/test/test_heapq.py

index 278ba2458b15e0c87f9d09d9b36d02efac033a3e..23f8be54fad60881dfda7f461d3fb47498703fbf 100644 (file)
@@ -14,6 +14,8 @@ heappush(heap, item) # pushes a new item on the heap
 item = heappop(heap) # pops the smallest item from the heap
 item = heap[0]       # smallest item on the heap without popping it
 heapify(x)           # transforms list into a heap, in-place, in linear time
+item = heapreplace(heap, item) # pops and returns smallest item, and adds
+                               # new item; the heap size is unchanged
 
 Our API differs from textbook heap algorithms as follows:
 
@@ -140,6 +142,22 @@ def heappop(heap):
         returnitem = lastelt
     return returnitem
 
+def heapreplace(heap, item):
+    """Pop and return the current smallest value, and add the new item.
+
+    This is more efficient than heappop() followed by heappush(), and can be
+    more appropriate when using a fixed-size heap.  Note that the value
+    returned may be larger than item!  That constrains reasonable uses of
+    this routine.
+    """
+
+    if heap:
+        returnitem = heap[0]
+        heap[0] = item
+        _siftup(heap, 0)
+        return returnitem
+    heap.pop()  # raise IndexError
+
 def heapify(x):
     """Transform list into a heap, in-place, in O(len(heap)) time."""
     n = len(x)
index 7f6d918b5101422f569dc46a167ab721e58e0536..f0bb2e7d1be9cc043062cadea986e3adc29a5f34 100644 (file)
@@ -2,7 +2,7 @@
 
 from test.test_support import verify, vereq, verbose, TestFailed
 
-from heapq import heappush, heappop, heapify
+from heapq import heappush, heappop, heapify, heapreplace
 import random
 
 def check_invariant(heap):
@@ -68,8 +68,7 @@ def test_main():
     heapify(heap)
     for item in data[10:]:
         if item > heap[0]:  # this gets rarer the longer we run
-            heappop(heap)       # we know heap[0] isn't in best 10 anymore
-            heappush(heap, item)
+            heapreplace(heap, item)
     vereq(list(heapiter(heap)), data_sorted[-10:])
     # Make user happy
     if verbose: