1,操作时间复杂度
2,基本结构
说明:
1)由多个最小堆组成
2)每个最小堆的根节点构成一个双向链表,称为根链表
3)每个最小堆内同级的节点构成一个双链表。
4)每个非根节点保存父节点指针和任意一个孩子节点指针。
5)min 指向根链表key值最小的节点,即堆的最小节点。
2,基本操作
1)add/insert 节点:
直接插入根链表,并更新min值。O(1) 的时间复杂度。
2)合并两个堆
合并连个堆的根链表,并更新min值。O(1) 的时间复杂度。
3)提取最小值
3.1, 将min的子节点并入根链表,返回min值
3.2, 重新整理根链表,如果根节点x与根节点y有相同的孩子数(假设x.key < y.key3),则将y从根链表移除并加入到x的孩子节点链表。
3.3, 重复3.2直到所有根节点的孩子数都不相同
3.4, 更新min值
4)减小节点关键字
4.1 若x为根节点或x新的key比父节点大,则直接保存x的key为新值
4.2 否则将x的key更新为新值,并将x并入到根节点链表
4.3 设x原父节点为y,若y曾经失去过孩子节点(y.mark == true)则将y并入到根节点链表。继续查找y的父节点,直到根。
否则若y未曾失去过孩子节点(y.mark == false)则set y.mark =true,结束查找。
注:4.3 步的目的是为了保证堆操作的摊还复杂度
5)删除一个节点
5.1 调用减小节点的key方法, 将待删除节点key值设为一个小于min的值。
5.2 调用提取最小节点方法。