演算法導論6.5-8
def
heapdelete
(a, i):
a[i], a[-1] = a[-1], a[i]
a.pop()
maxheap(a, i)
上面這個演算法是錯誤的,因為沒有考慮如果替換元素比被替換元素的值更大,那麼有可能i的父節點也不能保持最大堆性質的情況。如圖,要刪除1,用6替換1,3不再保持最大堆性質。
10
/ \
9 3
/ \ / \
8 5 1 2
/ \7 6
修改後的版本
def
heapdelete
(a, i):
t = a.pop()
if a[i] < t:
# a[i]節點保持最大堆性質,但是a[i]的父節點可能最大堆性質不再保持
heapincreasekey(a, i, t)
else:
# a[i]父節點保持最大堆性質,但是a[i]的最大堆性質可能不在保持
a[i] = t
maxheapify(a, i)
支援刪除任意元素以及一些其他基本操作的堆
安利乙個黑科技,不知道是誰發明的 好像也有些年代了?其實這個黑科技的本質就是乙個大根堆,不同的是 它支援刪除堆內任意元素,同時也支援堆的基本操作 如下 struct heap inline void erase int x inline void pop inline int top inline ...
雙堆實現任意刪除 天際線掃瞄
堆其結構為完全二叉樹,物理儲存採取陣列,乙個點i 其孩子節點為 2i 1 2i 2 堆的操作包含top pop push 並且這些操作都是基於堆的頂部進行,其通常呼叫down下沉操作和up上浮操作。堆不支援任意節點的刪除 意味著節點之間順序打亂 通常可以基於雙堆實現邏輯刪除。class my hea...
C vector中刪除元素
vector中刪除指定元素 刪除指定元素 vectorv printf v size d n v.size 單獨使用remove只代表移除元素,vector總大小還是原來大小,5 6為要刪除的元素 remove v.begin v.end 5 remove v.begin v.end 6 erase...