堆中刪除任意元素

2021-07-23 14:53:56 字數 640 閱讀 7133

演算法導論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...