堆相關問題

2021-08-17 21:44:24 字數 1861 閱讀 7688

講堆不得不提的就是優先佇列。

什麼是優先佇列?

普通佇列:先進先出,後進後出

如何實現優先佇列?

由上圖可知,用堆來實現優先佇列是乙個理想的方法。

這裡採用二叉堆(最大堆)的定義:

所有節點的值都不大於其父節點的值

二叉堆是乙個完全二叉樹

採用陣列來儲存二叉堆

由二叉堆的定義可以得出結論:對一顆完全二叉樹按層序遍歷編號,根節點的編號為1, 假設父節點的編號為 i , 則任何子節點的編號滿足:

用c++語言一步一步實現最大堆

初始化:

#include #include #include #include #include #include using namespace std;

//maxheap implements

template class maxheap

~maxheap()

//return the size of maxheap

int size()

int isempty()

void print()

cout << endl;

}};int main()

插入乙個值:

首先將插入值放在陣列的最後面,然後將值與父節點比較,如果父節點的值比插入值大,則當前位置就是合適位置;如果父節點的值比插入值小,則當前位置不合適,將當前值與父節點值交換,然後再向上比較。直到父節點的值比插入值大或者已到根節點。

void shiftup(int k) 

}//插入乙個值

void insert(item item)

推出乙個值:

在最大堆中推出乙個值,即最大值,也就是二叉樹的根節點。

可以先將陣列中的最後乙個元素賦值給第乙個元素,由於我們堆有乙個對的大小屬性維護,不用刪除最後乙個元素的值。

然後由根節點一次向下比較左右兩個字節點的大小,如果左字節點小於右字節點,那麼將右子節點與父節點交換,否則與左字節點交換。

void shiftdown(int k) 

}item extractmax()

索引堆

當我們要建立堆的資料結構過於複雜時,交換元素困難,我們可以考慮使用索引堆,即採用乙個indexes陣列儲存二叉最大堆的索引值,data陣列儲存值,每次只交換索引,而不交換值。這裡給出一種實現方式。

template class indexmaxheap

}void shiftdown(int k)

}public:

indexmaxheap(int capacity)

~indexmaxheap()

//return the size of maxheap

int size()

int isempty()

//插入乙個值

//使用者以為i通常以為是從0開始索引的

void insert(int i, item item)

void print()

cout << endl;

}//返回最大的元素

item extractmax()

//返回最大元素的索引

int extractmaxindex()

//由索引來取值

item getitem(int i)

void change(int i, item newitem) }};

堆以及堆的相關應用

本文中的堆是一種樹形資料結構,可以把堆看成一種特殊的完全二叉樹,再從二叉樹上加上一些限制條件即可以構成堆。即要求父節點元素全部都大於或等於子節點元素,或者小於等於。這就構成了倆種堆 堆的常見應用為 使用堆進行排序,也就是常說的堆排序,時間複雜度為nlgn 這是比較排序時間複雜度的下限,即使用比較的排...

記憶體相關函式(堆)

每個程序有個預設堆,用於作業系統對程序呼叫win32函式時分配所需記憶體。這個堆系統自動管理,使用者無法干預 只能夠編譯時指定大小 getprocessheap 獲取預設堆控制代碼。堆的好處 部件保護 防止乙個型別的記憶體物件破壞其他型別的 更有效 相同結構使用乙個堆,分配和釋放時更有效 區域性訪問...

堆的相關演算法

堆是一種特殊的二叉樹。它具有下面兩個性質 1 每乙個節點的值大於或等於其每乙個子節點的值。2 該樹全然平衡,最後一層的葉子都處於最左側的位置。有最大堆和最小堆之分。以上定義是最大堆的定義,最小堆的定義例如以下 1 每乙個節點的值小於或等於其每乙個子節點的值 2 該樹全然平衡,最後一層的葉子都處於最左...