Python算法详解
上QQ阅读APP看书,第一时间看更新

4.5.2 实践演练——实现二叉堆操作

一种实现优先队列的经典方法便是采用二叉堆(Binary Heap),二叉堆能将优先队列的入队和出队复杂度都保持为O(log2n)。二叉堆的逻辑结构像二叉树,但用非嵌套的列表来实现。二叉堆有两种:键值总是最小的排在队首,称为“最小堆”(min heap);反之,键值总是最大的排在队首,称为“最大堆”(max heap)。

在Python语言中,用于二叉堆操作的函数如下。

· binaryHeap():创建一个空的二叉堆对象。

· insert(k):将新元素压入堆中。

· findMin():返回堆中的最小项,最小项仍保留在堆中。

· delMin():返回堆中的最小项,同时从堆中删除。

· isEmpty():返回堆是否为空。

· size():返回堆中节点的个数。

· buildHeap(list):从一个包含节点的列表里创建新堆。

下面的实例文件brackets.py演示了实现二叉堆操作的过程。

源码路径:daima\第4章\brackets.py

class BinHeap:
     def __init__(self):
          self.heapList = [0]
          self.currentSize = 0
     def percUp(self,i):
          while i // 2 > 0:
            if self.heapList[i] < self.heapList[i // 2]:
                tmp = self.heapList[i // 2]
                self.heapList[i // 2] = self.heapList[i]
                self.heapList[i] = tmp
            i = i // 2
     def insert(self,k):
        self.heapList.append(k)
        self.currentSize = self.currentSize + 1
        self.percUp(self.currentSize)
     def percDown(self,i):
        while (i * 2) <= self.currentSize:
             mc = self.minChild(i)
             if self.heapList[i] > self.heapList[mc]:
                   tmp = self.heapList[i]
                   self.heapList[i] = self.heapList[mc]
                   self.heapList[mc] = tmp
             i = mc
     def minChild(self,i):
        if i * 2 + 1 > self.currentSize:
             return i * 2
        else:
             if self.heapList[i*2] < self.heapList[i*2+1]:
                   return i * 2
             else:
                   return i * 2 + 1
     def delMin(self):
       retval = self.heapList[1]
       self.heapList[1] = self.heapList[self.currentSize]
        self.currentSize = self.currentSize - 1
        self.heapList.pop()
        self.percDown(1)
        return retval
     def buildHeap(self,alist):
        i = len(alist) // 2
        self.currentSize = len(alist)
        self.heapList = [0] + alist[:]
        while (i > 0):
            self.percDown(i)
            i = i - 1
bh = BinHeap()
bh.buildHeap([9,5,6,2,3])
print(bh.delMin())
print(bh.delMin())
print(bh.delMin())
print(bh.delMin())
print(bh.delMin())

执行后会输出:

2
3
5
6
9