講堆不得不提的就是優先佇列。
什麼是優先佇列?
普通佇列:先進先出,後進後出
如何實現優先佇列?
由上圖可知,用堆來實現優先佇列是乙個理想的方法。
這裡採用二叉堆(最大堆)的定義:
所有節點的值都不大於其父節點的值
二叉堆是乙個完全二叉樹
採用陣列來儲存二叉堆
由二叉堆的定義可以得出結論:對一顆完全二叉樹按層序遍歷編號,根節點的編號為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 該樹全然平衡,最後一層的葉子都處於最左...