優(yōu)先級隊(duì)列

問題模式


功能接口

template <typename T> struct PQ{

virtual void insert(T) = 0; //按照優(yōu)先級次序插入詞條

virtual T getMax() = 0; //取出優(yōu)先級最高的詞條

virtual T delMax() = 0; //刪除優(yōu)先級最高的詞條

}; //與其說PQ是數(shù)據(jù)結(jié)構(gòu)获枝,不如說是ADT(Abstract Data Type)勘纯;其不同的實(shí)現(xiàn)方式卧秘,效率及適用場合也各不相同

Stack和Queue,都是PQ的特例——優(yōu)先級完全取決于元素的插入次序


基本實(shí)現(xiàn)——向量


有序向量


BBST

AVL瓢姻、Splay、Red-black:三個接口均只需O(logn)時間

但是音诈,BBST的功能遠(yuǎn)遠(yuǎn)超過了PQ的需求

PQ = 1 * insert() + 0.5 * search() + 0.5 * remove() = 2/3 * BBST

若只需查找極值元幻碱,則不必維護(hù)所有元素之間的全序關(guān)系,偏序足矣

因此存在某種更為簡單改艇、維護(hù)成本更低的實(shí)現(xiàn)方式收班,使得各功能接口時間復(fù)雜度依然為O(logn),而且實(shí)際效率更高


完全二叉樹Complete Binary Tree

平衡因子處處非負(fù)的AVL



結(jié)構(gòu)性

邏輯上谒兄,等同于完全二叉樹

物理上摔桦,直接借助向量實(shí)現(xiàn)

邏輯節(jié)點(diǎn)與物理元素依層次遍歷次序彼此對應(yīng)

#define Parent(i) ((i-1)>>1)

#define LChild(i) (1+((i)<<1)) //奇數(shù)

#define RChild(i) ((1+(i)) <<1) //偶數(shù)

PQ_ComplHead = PQ + Vector

template <typename T> class PQ_ComplHeap : public PQ<T>, public Vector<T>{

protected: Rank percolateDown(Rank n, Rank i); //下濾

? ? ? ? ? ? ? ? ?Rank percolateUp(Rank i); //上濾

? ? ? ? ? ? ? ? ?void heapify(Rank n); //Floyd建堆算法

public: PQ_ComplHead(T* A, Rank n); //批次構(gòu)造

? ? ? ? ? ? ? ? { copyFrom(A,0,n); heapify(n);}

? ? ? ? ? ? void insert(T); //按照比較器確定的優(yōu)先級次序,插入詞條

? ? ? ? ? ? T getMax() { return _elem[0];} //讀取優(yōu)先級最高的詞條

? ? ? ? ? ? T delMax(); //刪除優(yōu)先級最高的詞條

};

堆序性

數(shù)值上,只要0<i邻耕,必滿足H[i] <= H[Parent(i)]

故H[0]即是全局最大元素

template <typename T> T PQ_ComplHeap<T>::getMax(){ return _elem[0];}


插入與上濾

為插入詞條e鸥咖,只需將e作為末元素接入向量 //結(jié)構(gòu)性自然保持,若堆序性也亦未破壞兄世,則完成

否則啼辣,e與其父節(jié)點(diǎn)換位 //只能是e與其父節(jié)點(diǎn)違反堆序性,若堆序性因此恢復(fù)御滩,則完成

否則鸥拧,e再與父節(jié)點(diǎn)換位 //依然只可能是e與其(新的)父節(jié)點(diǎn)...

不斷重復(fù),直到e與其父親滿足堆序性削解,或者e到達(dá)堆頂


實(shí)現(xiàn)

template <typename T> void PQ_ComplHeap<T>::insert(T e)

{ Vector<T>::insert(e); percolateUp(_size - 1);}

template <typename T> Rank PQ_ComplHeap<T>::percolateUp(Rank i){

while(ParentValid(i)){

? ? Rank j = Parent(i);

? ? if( lt( _elem[i], _elem[j] )) break; //一旦父子不再逆序富弦,上濾旋即完成

? ? swap( _elem[i], _elem[j] ); i = j;

}

return i;

}


刪除與下濾

最大元素始終在堆頂,故為刪除之氛驮,只需

摘除向量首元素腕柜,代之以末元素e //結(jié)構(gòu)性保持;若堆序性依然保持則完成

否則e與孩子中的大者換位?

否則e再次與孩子中的大者換位

實(shí)現(xiàn)

template <typename T> T PQ_ComplHeap<T>::delMax(){

? ? T maxElem = _elem[0]; _elem[0] = _elem[--_size];

? ? percolateDown(_size,0);

? ? return maxElem;

}

template <typename T> Rank PQ_ComplHeap<T>::percolateDown(Rank n, Rank i){

? ? Rank j; //i及其(至多兩個)孩子中矫废,堪為父者

? ? while( i != ( j = ProperParent(_elem, n, i))) //只要i非j盏缤,則

? ? ? ? { swap(_elem[i], _elem[j]); i = j; } //換位,并繼續(xù)考察i

? ? return i; //返回下濾抵達(dá)的位置

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖扑,一起剝皮案震驚了整個濱河市唉铜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赵誓,老刑警劉巖打毛,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俩功,居然都是意外死亡幻枉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門诡蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熬甫,“玉大人,你說我怎么就攤上這事蔓罚〈患纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵豺谈,是天一觀的道長郑象。 經(jīng)常有香客問我,道長茬末,這世上最難降的妖魔是什么厂榛? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任盖矫,我火速辦了婚禮,結(jié)果婚禮上击奶,老公的妹妹穿的比我還像新娘辈双。我一直安慰自己,他們只是感情好柜砾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布湃望。 她就那樣靜靜地躺著,像睡著了一般痰驱。 火紅的嫁衣襯著肌膚如雪证芭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天萄唇,我揣著相機(jī)與錄音檩帐,去河邊找鬼术幔。 笑死另萤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诅挑。 我是一名探鬼主播四敞,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拔妥!你這毒婦竟也來了忿危?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤没龙,失蹤者是張志新(化名)和其女友劉穎铺厨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬纤,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡解滓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筝家。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼裤。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溪王,靈堂內(nèi)的尸體忽然破棺而出腮鞍,到底是詐尸還是另有隱情,我是刑警寧澤莹菱,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布移国,位于F島的核電站,受9級特大地震影響道伟,放射性物質(zhì)發(fā)生泄漏迹缀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裹芝。 院中可真熱鬧部逮,春花似錦、人聲如沸嫂易。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怜械。三九已至颅和,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缕允,已是汗流浹背峡扩。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留障本,地道東北人教届。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像驾霜,于是被迫代替她去往敵國和親案训。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容