halo,各位看客老爺們,又是我!!今天我們來學習一種我們以後經常會用到的資料結構 ——堆(也就是我們常說的優先佇列)
那麼什麼是優先佇列呢?且聽我慢慢道來,在我們c語言的學習中,我們知道,在乙個未知排序的陣列中,我們刪除最小或者最大數的時間複雜度是o(n),也就是說,每當我們希望從陣列中刪除最小數或者最大數,我們需要對陣列進行一次遍歷,找到我們要刪除的數,才能刪除。那麼如果我們想要在刪除最小數的基礎上,再加入乙個數,並求此時數列中的最小數,不可避免的,我們又需要便利一次陣列,此時的時間複雜度就從o(n)變成了o(n^2)。可能很多童鞋並不知道n到n^2有多大的變化。舉個栗子,我們要進行100w此這樣的操作(預設計算機的計算速度為1億次每秒),o(n)需要的時間為0.01秒,而o(n^2)卻需要1w秒,如何減少這麼龐大的計算量,我們的先輩創造了優先佇列!!!
說了這麼多,終於進入了我們的正文,優先佇列的本質是一顆所有父節點都比子節點要小的完全二叉樹(當然也可以都比子節點大)首先我們用c語言進行描述,因為c++中的stl庫中包含了優先佇列,我們在後面只會簡單介紹一下用法,最主要的還是c語言的用法。
首先我們要知道優先佇列最基本的兩個操作:down ,up。什麼是down,什麼是up?顧名思義,就是將乙個指定的元素在這顆二叉樹中,進行上調或者下調的操作,使這顆二叉樹達到最小堆(父節點小於子節點)的狀態。話不多說,先上**:
void down (int i)
else
if(i*2+1 <= len)
} if(temp != i)
else }}
void up(int i)
while(i != 1 && flag == 0)
else
i = i/2;
} return ;
}
對於down操作,我們需要得到該元素的位置,得到後,利用該元素的值與其子節點比較,若是比子節點小,則不變,比子節點大,將其與子節點調換位置,反覆該操作,知道該元素達到正確位置。
對於up操作,同理與父節點比較,比之小則上調。
知道了優先佇列的兩個基本操作以後我們就可以建立乙個最小堆了:
int main ()
}
其中len是我們優先佇列的長度,在每次輸入乙個資料後,對該資料進行up操作,每次輸入後都能保證陣列是最小堆狀態。
回到我們開始**的問題,我們需要刪除最小值啊,你不是還沒說到嗎,其實看到最小堆我們就想到了,最小值肯定是在1號位置,所以我們只需要將1號元素與第len號元素調換位置,再進行一次down操作即可,別忘了最後len需要減1。
void deletemin ()
如果需要得到刪除的值,可以用temp記錄1號元素的值,在最後return即可,當然void需改為int。
說了這麼多,c語言的優先佇列操作以及說的差不多了,接下來就是c++中的優先佇列。
c++中優先佇列的建立以及使用相對於c要簡單許多。
首先使用中我們需要有標頭檔案#include
在main函式中,我們利用語句priority_queueque;建立乙個優先佇列,本文中不討論優先佇列的優先順序。
關於優先佇列有以下五種操作:
1.que.push()加入乙個元素
2.que.pop()刪除乙個元素
3.que.empty()加入乙個元素
4.que.top()返回優先順序最高的元素
5.que.size()返回優先佇列中元素個數
最後貼上c語言版的完整優先佇列**,還有祝各位看客們新年快樂鴨!!!
#include#define max 100000
int arr[max];
int len = 0;
void swap(int a,int b)
void down (int i)
else
if(i*2+1 <= n)
} if(temp != i)
else }}
void up(int i)
while(i != 1 && flag == 0)
else
i = i/2;
} return ;
}void deletemin ()
int main ()
}
c 堆與優先佇列
以最小堆為例,實現下列操作 向下調整演算法 void down int p heap p a 插入 void insert int a 將p的優先順序上公升為a void increasekey int p,int a 建立堆 void build 例題 poj 2051argus 思路 維持乙個最...
C 優先佇列
半題外話 優先佇列個人認為主要優點是可以在排序後進行類似於插入排序的操作,適合於需要在陣列排序後再次進行操作的題目 再由此產生一堆bug 本蒟蒻是在敲貪心的題時遇見的 弱得連個貪心都不會敲了呵 就開始了學 mo 習 ca 之旅 優先佇列的結構 佇列1.back 返回乙個引用,指向最後乙個元素 2.e...
c 優先佇列
優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前佇列中最大的元素出隊。這點類似於給佇列裡的元素進行了由大到小的順序排序。元素的比較規則預設按元素值由大到小排序,可以過載 操作符來重新定義...