斜堆(待補充)

2022-08-23 03:03:15 字數 1588 閱讀 7815

一、斜堆的介紹

斜堆(skew heap)也叫自適應堆(self-adjusting heap),它是左傾堆的乙個變種。和左傾堆一樣,它通常也用於實現優先佇列;作為一種自適應的左傾堆,它的合併操作的時間複雜度也是o(lg n)。

它與左傾堆的差別是:

(01) 斜堆的節點沒有"零距離"這個屬性,而左傾堆則有。

(02) 斜堆的合併操作和左傾堆的合併操作演算法不同。

斜堆的合併操作

(01) 如果乙個空斜堆與乙個非空斜堆合併,返回非空斜堆。

(02) 如果兩個斜堆都非空,那麼比較兩個根節點,取較小堆的根節點為新的根節點。將"較小堆的根節點的右孩子"和"較大堆"進行合併。

(03) 合併後,交換新堆根節點的左孩子和右孩子。

第(03)步是斜堆和左傾堆的合併操作差別的關鍵所在,如果是左傾堆,則合併後要比較左右孩子的零距離大小,若右孩子的零距離 > 左孩子的零距離,則交換左右孩子;最後,在設定根的零距離。

二、斜堆的基本操作

1. 基本定義

template 

class

skewnode

};

skewnode是斜堆對應的節點類。

template 

class

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...