以前用stl的queue啊stack啊priority_queue啊,一直很想懂原理,現在終於課上到了priority_queue,還有就是下週期中考,哈哈,所以寫幾篇blog總結一下。
這裡萌新講下堆這個好東西;
如果搞過acm的童鞋應該會使用stl的priority_queue,堆就是stl的priority_queue。
堆是一種特殊的佇列,從堆中取元素的依據是元素優先權大小,而不是元素進入隊的先後順序;
直接切入主題吧;
堆最常用的結構是二叉樹,一棵完全二叉樹,而完全二叉樹由於其結點特別規律,所以可以用陣列直接模擬。
下面介紹幾個堆(以完全二叉樹的形式):
最大堆:每個結點上的元素不小於其子節點元素的值;
最小堆:每個結點上的元素不大於其子節點元素的值;
拿最大堆來講幾個操作:
建立,插入,刪除,建立最大元素;
下面參考自陳越姥姥版資料結構
用c語言(窩覺得好**)描述最大堆結構;
typedef struct heapstruct* maxheap;有人會說,臥槽為什麼要結構體啊,明明說好的陣列可以直接處理,為毛不用陣列啊,而且結構體裡面還有指標,好煩(繁)啊!struct heapstruct
;
萌新想說,這樣嚴謹吧,其實差不多啊,無非是換種方式而已;ps:acm中不是很常用指標吧,說錯,不是不常用指標,而是不常用動態開闢記憶體,時間很慢。
而且指標如果用的靈活,那是很超神的能力啊!
其實。。。他就是動態開闢了乙個記憶體,然後存了乙個東西。初學者不用太深究(搞不懂就先放放,先吃西瓜,再撿芝麻)。
maxheap creat(int maxsize) //建立容量為maxsize 空的最大堆首先判斷堆 是不是已經滿了;
我們先假設這個元素插在了size+1這個結點上,
①:他比他的父節點的值小,ok,那就躺著吧,插入完成;
②:可惜他比他的父節點大啊,那麼。。。交換就好了嘛,交換以後一定是合法的啊。
這裡有一種寫法很牛逼啊,比普通交換好很多;
void insert(maxheap h,int item) //item 是要插入的元素,這裡稱目標;萌新把 根 稱做爺爺吧。i=++h->size; //先預設目標被插在了新開的結點
//對下面的迴圈細說一下,如果目標比他的父節點大的話,那麼交換,可以看到目標並沒有存到父節點上,然後i/=2使得往上繼續判斷,如果》目標就會彈出迴圈;
//最後很有可能他成了整個完全二叉樹的根,這裡目標的編號是1,所以這個編號0就發揮作用了,一定比他大啊;
for( ; h->elements[i/2] < item; i/=2)
h->elements[i]=h->elements[i/2];
h->elements[i]=item;
}
一開始爺爺做主。
我們淺顯地可以看到拿走了最大的元素(即爺爺被帶走了),那麼肯定就是要個大的子結點(最大的爸爸)來頂替他的位置。
然後處理大的那個子節點被頂替上去了,所以又要安排乙個最大的孫子頂替。
所以一直一直要處理好,但是你這樣一直一直頂替會有個問題,可能會構造不成一棵完全二叉樹。
處理方法是把最後乙個元素拿出來,以這個元素作為替補,因為根已經被刪除了,然後就從根往下遍歷,如果一旦存在這個元素可以填的位置,就填上去,一定能夠保證是乙個完全二叉樹了;
bool isfull(maxheap h)大致思路就是從底層開始判斷,因為完全二叉樹的編號很規律,從size/2也就是最後乙個結點的父節點開始判斷,每次往下看看這個結點能放到哪個位置,void deletemax(maxheap h)
temp=h->elements[h->size--]; //取末尾元素
//從根開始填
for(parent=1; parent*2<=h->size; parent = child)
h->elements[parent]=temp;
}
然後依次減減減,也就是判斷每一層的結點啊;
void buildmaxheap(maxheap h)ok,歡迎提出意見~~~~~h->elements[parent]=temp;}}
Python萌新筆記
mychael上了大學,對python產生了濃厚的興趣,便開始了python的學習 學習的時候,感覺python確實比以往學的c 表達簡潔很多,而又不失強大 以後的學習筆記就記在這啦 python中的變數無需宣告,其類別也只有具體賦值的時候才確定 整型 int 1 字串 string1 hello ...
萌新筆記03 串
字串簡稱串,是由零個或多個字元組成的有限序列。串中任意個連續的字元組成的子串行成為該串的子串。串的儲存結構 定長順序儲存表示 define maxlen 255 typedef struct sstring 堆分配儲存表示 typedef struct hstring 子串向後移動位數 子串與主串已...
C語言萌新筆記 3
1.printf函式可以用來輸出,並且可以通過格式控制符來控制輸出格式,如 int i 10 printf d i 輸出結果為102.常用的格式控制符有 格式控制符 作用 d 輸出整數 c輸出字元 s字串 f浮點數 小數 ee計數法的浮點數 x十六進製制 3.scanf函式用於從鍵盤處獲取輸入並賦值...