優先佇列是一種常用的adt,其中的元素有序排列,入隊的元素會插入到正確的位置,隊首元素始終為最小(大)值,隊首出隊後優先佇列仍然保持原來的性質。
這裡我們規定優先佇列以公升序排列。
優先佇列提供的介面包括:
二叉堆是優先佇列一種常用的實現,二叉堆是一種完全二叉樹,完全二叉樹除最低一層外其它層均被填滿,最低一層的節點全部集中在左側。完全二叉樹的性質決定它可以很容易地由二叉陣列來實現。
二叉堆滿足堆序性,即任意乙個節點x的父節點不大於x(最小堆)。由堆序性可知,二叉堆的根節點一定為最小值或最大值,根節點為最小值的堆稱為最小堆,根節點為最大值的堆稱為最大堆。
最小堆類的宣告:
templateclass minheap ;
~minheap() = default;
};
插入元素採用上濾的方法:
(1)在陣列超出末端(size位置)建立乙個空穴
(2)比較新元素與空穴父節點的大小,若新元素較大則將原父節點填入空穴,原父節點的位置變為空穴
(3)直至新元素不大於空穴父節點時停止空穴上溯
templatevoid minheap::insert(val_t val)
vec[i] = val;
}
在實現過程中,我們只是用i標記了空穴的位置,並沒有交換空穴與父節點的位置。
刪除元素採用恰好相反的下濾策略:
(1) 移除根節點後在根節點處產生了乙個空穴
(2) 比較空穴的左右子節點,較大的乙個與空穴交換位置,直至空穴到達最下層
(3) 將原來最後乙個元素填入空穴的位置
templatevoid minheap::rmmin()
min = vec[1];
last = vec[size--];
for (i = 1; i * 2 <= size; i = next)
//if (last > vec[next])
else
}vec[i] = last;
}
#include //#include using namespace std;
templateclass minheap ;
~minheap() = default;
};templateminheap::minheap()
templatebool minheap::empty()
else
}templatevoid minheap::insert(val_t val)
vec[i] = val;
}templatevoid minheap::rmmin()
min = vec[1];
last = vec[size--];
for (i = 1; i * 2 <= size; i = next)
//if (last > vec[next])
else
}vec[i] = last;
}
優先佇列和二叉堆
優先佇列 我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於 先進 某種定義賦予它們不同的優先順序,優先順序更高的先出列。本文涉及的優先佇列優先順序定義是 數值越小,優先順序越高。也就是說,每次取出的元素都是當前...
二叉堆和優先佇列
優先佇列是一種用來維護由一組元素構成的集合s的資料結構,其中的每乙個元素都有乙個相關的值,稱為關鍵字。優先佇列有最大優先佇列和最小優先佇列。優先佇列和一般的fifo佇列不一樣,從優先佇列獲取出來的值是喲優先順序的。例如,用來處理傳送給計算機部門印表機的職位 部門主管發來的職位應該首先被列印,依次是經...
優先佇列 二叉堆
優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...