一、斜堆的介紹
斜堆(skew heap)也叫自適應堆(self-adjusting heap),它是左傾堆的乙個變種。和左傾堆一樣,它通常也用於實現優先佇列;作為一種自適應的左傾堆,它的合併操作的時間複雜度也是o(lg n)。
它與左傾堆的差別是:
(01) 斜堆的節點沒有"零距離"這個屬性,而左傾堆則有。
(02) 斜堆的合併操作和左傾堆的合併操作演算法不同。
斜堆的合併操作
(01) 如果乙個空斜堆與乙個非空斜堆合併,返回非空斜堆。
(02) 如果兩個斜堆都非空,那麼比較兩個根節點,取較小堆的根節點為新的根節點。將"較小堆的根節點的右孩子"和"較大堆"進行合併。
(03) 合併後,交換新堆根節點的左孩子和右孩子。
第(03)步是斜堆和左傾堆的合併操作差別的關鍵所在,如果是左傾堆,則合併後要比較左右孩子的零距離大小,若右孩子的零距離 > 左孩子的零距離,則交換左右孩子;最後,在設定根的零距離。
二、斜堆的基本操作
1. 基本定義
templateclass
skewnode
};
skewnode是斜堆對應的節點類。
templateclass
skewheap ;
skewheap是斜堆類,它包含了斜堆的根節點,以及斜堆的操作。
2. 合併
/** 合併"斜堆x"和"斜堆y" */
template
skewnode
* skewheap::merge(skewnode* &x, skewnode* &y)
/** 將other的斜堆合併到this中。 */
template
void skewheap::merge(skewheap*other)
merge(x, y)是內部介面,作用是合併x和y這兩個斜堆,並返回得到的新堆的根節點。
merge(other)是外部介面,作用是將other合併到當前堆中。
3. 新增
/** 新建鍵值為key的結點並將其插入到斜堆中
* * 引數說明:
* heap 斜堆的根結點
* key 插入的結點的鍵值
* 返回值:
* 根節點 */
template
void skewheap::insert(t key)
mroot =merge(mroot, node);
}
insert(key)的作用是新建鍵值為key的節點,並將其加入到當前斜堆中。
4. 刪除
/** 刪除結點 */
template
void skewheap::remove()
remove()的作用是刪除斜堆的最小節點。
指標 待補充
將位址視為指定的量,將值視為派生量。指標 一種特殊型別的變數 用於儲存值的位址。指標名表示的是位址,運算子被稱為間接值或解除引用運算子,將其應用於指標,可以得到該位址處儲存的值。例,假設manly是乙個指標,manly表示的是乙個位址,manly表示儲存在該位址處的值。宣告和初始化 運算子兩遍的空格...
dinic 模板 待補充
include using namespace std define mk make pair define pus push back define mo 1005 vector d mo vector de mo int tag mo int dfs int node,int low,int n...
常用其他(待補充)
echo 輸出乙個或者多個字串 var dump 列印變數的詳細資訊,可以一次列印乙個或多個變數的資訊 print r 列印陣列的資訊 unset 銷毀變數,可以一次銷毀乙個或多個變數,銷毀之後變數的值為null header語句的作用 header content type text html c...