堆(英語:heap)是計算機科學中一類特殊的數據結構的統稱。堆通常是一個可以被看做一棵樹的數組對象。堆總是滿足下列性質:
-
堆中某個節點的值總是不大於或不小於其父節點的值;
-
堆總是一棵完全二叉樹。
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。他們的時間復雜度如下:
| Operation | find-max | delete-max | insert | decrease-key | merge |
|---|---|---|---|---|---|
| Binary |
Θ(1) | Θ(log n) | O(log n) | O(log n) | Θ(n) |
| Fibonacci |
Θ(1) | O(log n)[b] | Θ(1) | Θ(1)[b] | Θ(1) |
class BigPq(object): def __init__(self, arr: list): self.arr = arr self.mark = 1 while self.mark == 1: self.build() def build(self): self.mark = 0 # 先置為零, 只要經過一次swap函數,就再次置為1 index = len(self.arr) - 1 for i in range(index): if i * 2 + 2 <= index: # 如果左右兩個子節點都存在,去比較他們的大小 self.tri(i, i * 2 + 1, i * 2 + 2) elif i * 2 + 1 <= index: # 如果只有左子節點存在,去比較他們的大小 if self.arr[i] < self.arr[i * 2 + 1]: self.swap(i, i * 2 + 1) else: break def tri(self, head: int, left: int, right: int): if self.arr[head] < self.arr[left]: self.swap(head, left) if self.arr[head] < self.arr[right]: self.swap(head, right) def swap(self, index_1: int, index_2: int): self.mark = 1 temp = self.arr[index_2] self.arr[index_2] = self.arr[index_1] self.arr[index_1] = temp def show(self): print(self.arr) def pop(self) -> int: self.arr[0] = self.arr[-1] temp = self.arr.pop() self.mark = 1 while self.mark == 1: self.build() return temp def push(self, value: int): self.arr.append(value) self.mark = 1 while self.mark == 1: self.build()
