堆:可視為一棵完全二叉樹結構,最小堆每個父節點都小於孩子結點,最大堆每個父節點都大於孩子結點。
建堆思想:實現向下調整演算法adjustdown():即當乙個節點的左子樹和右子樹都已為最大堆或最小堆(在這裡則尋找樹倒著走的第乙個非葉子結點,依次進行調整),比較其左右孩子結點滿足大堆或小堆要求的節點,再與此節點比較,若孩子結點大,滿足大堆交換兩節點值,或小堆,孩子結點小則交換。大堆與小堆思想基本相同,所以實現用仿函式進行實現。
建堆完成後可在堆中實現在尾部插入和刪除頭節點等操作,從中又實現乙個向上調整演算法adjustup(),其類似於向下調整演算法.
優先順序佇列:則在大堆與小堆基礎上實現佇列的優先順序等系列操作。
**實現:
#include #include #include #include using namespace std;
template //仿函式
struct less
};template >
class heap
heap(t* a,size_t n)
:_a(a,a+n) }
void push(const t& x)
void pop()
const t& top()
size_t size()
bool empty()
protected:
void _adjustdown(size_t root) //向下調整
else
break;
} }void _adjustup(size_t child) //向上調整
else
break;
} }protected:
vector_a;
};template >
class priorityqueue //優先順序佇列
void pop()
const t& top()
size_t size()
bool empty()
protected:
heap_hp1; //用堆實現
};void testheap()
; heaphp1(a1,sizeof(a1)/sizeof(a1[0]));
hp1.push(20);
hp1.pop();
//最小堆
int a2=;
heap> hp2(a2,sizeof(a2)/sizeof(a2[0]));
hp2.push(9);
hp2.pop();
}void testpriorityqueue()
{ priorityqueueque;
que.push(10);
que.push(11);
que.push(13);
que.push(12);
que.push(16);
que.push(18);
que.push(15);
que.push(17);
if(!que.empty())
{ cout<
優先順序佇列的實現
優先順序佇列 佇列裡面的所有元素都有相應的權值,元素的刪除順序由這些權值決定。優先順序佇列的實現一般用堆來實現其效率比一般的實現要高。要弄清楚堆我們得先弄清楚下面的定義 一顆大根樹 小根樹 是這樣一棵樹,其中每個節點的值都大於 小於 或等於其子節點 如果有子節點的話 的值。大根堆 乙個大根堆 小根堆...
優先順序佇列的實現
首先優先順序佇列的概念脫胎於佇列,佇列有先進先出的概念,優先順序佇列則根據優先順序的次序從佇列中彈出元素。優先佇列的底層實現是堆,因為堆的插入時間複雜度為o logn 所以優先順序佇列的入隊操作的時間複雜度也是o logn 堆可以由動態陣列實現的。優先順序佇列中比較重要的兩個操作是插入和刪除。如下簡...
堆的實現(大小堆及 優先佇列
一 堆的概念 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。堆結構的二叉樹儲存是 最大堆 每個父節點的都大於孩子節點。最小堆 每個父節點的都小於孩子節點。堆疊中的物體具有乙個特性 最後乙個放入堆疊中的物體總是被最先拿出來,這個特性通常稱為後進先出 lifo 佇列。堆疊中定義了一些操作。兩...