萌新筆記之堆 heap

2022-02-28 22:46:10 字數 2244 閱讀 2920

以前用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)

void deletemax(maxheap h)

temp=h->elements[h->size--]; //取末尾元素

//從根開始填

for(parent=1; parent*2<=h->size; parent = child)

h->elements[parent]=temp;

}

大致思路就是從底層開始判斷,因為完全二叉樹的編號很規律,從size/2也就是最後乙個結點的父節點開始判斷,每次往下看看這個結點能放到哪個位置,

然後依次減減減,也就是判斷每一層的結點啊;

void buildmaxheap(maxheap h)

h->elements[parent]=temp;}}

ok,歡迎提出意見~~~~~

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函式用於從鍵盤處獲取輸入並賦值...