From 68571cffb21fbb88f77052dbf652d6528fd9f7d4 Mon Sep 17 00:00:00 2001 From: ahuigo Date: Mon, 11 Feb 2019 17:41:12 +0800 Subject: [PATCH] More Simple Kiss BinHeap --- trees/binheap.py | 65 +++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/trees/binheap.py b/trees/binheap.py index df619bc..68cc532 100644 --- a/trees/binheap.py +++ b/trees/binheap.py @@ -7,58 +7,55 @@ # this heap takes key value pairs, we will assume that the keys are integers class BinHeap: def __init__(self): - self.heapList = [0] + self.heapList = [] self.currentSize = 0 - def buildHeap(self,alist): - i = len(alist) // 2 self.currentSize = len(alist) - self.heapList = [0] + alist[:] - print(len(self.heapList), i) - while (i > 0): - print(self.heapList, i) + self.heapList = alist[:] + + i = len(alist)//2 -1 + while (i >= 0): self.percDown(i) + print(i, self.heapList) i = i - 1 - print(self.heapList,i) 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 + heapList = self.heapList + while True: + child = 2*i+1 + if child >= self.currentSize: + break + if child+1 heapList[child]: + # swap + heapList[i],heapList[child] = heapList[child],heapList[i] else: - return i * 2 + 1 + break + i = child 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 - + heapList = self.heapList + while (i-1) // 2 >= 0: + parent = (i-1)//2 + if heapList[i] < heapList[parent]: + heapList[i], heapList[parent] = heapList[parent],heapList[i] + else: + break + i = parent + def insert(self,k): self.heapList.append(k) self.currentSize = self.currentSize + 1 - self.percUp(self.currentSize) + self.percUp(self.currentSize-1) def delMin(self): - retval = self.heapList[1] - self.heapList[1] = self.heapList[self.currentSize] + retval = self.heapList[0] + self.heapList[0] = self.heapList[self.currentSize-1] self.currentSize = self.currentSize - 1 self.heapList.pop() - self.percDown(1) + self.percDown(0) return retval def isEmpty(self):