資料結構 堆 優先佇列

2021-10-02 11:50:18 字數 2009 閱讀 3732

堆,實際上是乙個完全二叉樹,大概就是介個樣子。。。

堆一般又分為大頂堆和小頂堆(實際上差不多。。。這裡就用小頂堆舉個例好了qwq)

其實stl中的優先佇列已經有堆的作用了,但是手寫的堆也有一些自己的優勢。我們先來看看堆的一些常用操作。

1.插入乙個數

2.求集合當中的最小值

3.刪除最小值

4.刪除任意乙個元素

5.更改任意乙個元素

前三個功能,都可以通過優先佇列直接實現,而後面兩個功能,用手寫的堆更容易實現,所以。。。手寫的堆,也是有優勢滴qwq

手寫的堆可以用一維陣列儲存,雖然看起來5個功能很麻煩,但其實依賴兩個函式就可以全部實現。

利用down(下沉)函式和up(上公升)函式,兩個函式就可以實現上面的功能。

down函式

down函式主要是為了把大的數往樹的下方沉,每次比較選擇子節點中較小的乙個數,進行替換,模板如下

void

down

(int u)

}

up函式

同樣的,up函式是為了讓小的數往上公升,模板也更簡單,以為up函式只用和根節點比較就好了

voidup(

int u)

}

1.插入

在數列尾部插入後上公升

scanf

("%d"

,&x)

; h[

++ size]

= x;

up(size)

;

2.求最小值

也就是在 1 位置的元素

printf

("%d"

, h[1]

);

3.刪除最小值

先把堆尾的元素賦值給堆首,再刪除堆尾

h[1]

= h[size]

; size --

;down(1

);

4.刪除任意元素

與刪除最小值差不多,但是要注意你不知到替換之後數的大小情況,所以要down一遍,再up一遍

scanf

("%d"

,&k)

h[k]

= h[size]

; szie --;up

(k),

down

(k);

5.替換任意元素

直接賦值以後,利用兩個函式,找到替換後的位子就可以了

scanf

("%d%d"

,&k,

&x);

h[k]

= x;

up(k)

,down

(k);

優先佇列,priority_queue也與堆有著相同的作用

priority_queue預設的情況是大根堆,我們有兩種方法來把它變成小根堆,一種是直接輸入負值,一種是在定義時就定義成小根堆,定義的方法還有一些常見的操作方法,都會在下面的**中

priority_queue<

int, vector<

int>

, greater<

int>> q;

q.push()

// 插入乙個元素

q.pop()

//刪除乙個元素

q.top()

//返回堆頂的元素

優先佇列屬於c++中的stl,是乙個語法問題,在這也不多闡述了。

這就是堆的用法,是不是好簡單的。。。(其實完全不知道有什麼用。。。要不是最短路用的到才不會來學qwq)

不管了,至少也算是學會了乙個新知識點。。。怎麼用以後再說吧qwq

資料結構 堆(優先佇列)

一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...

資料結構 優先佇列(堆)

什麼是堆 堆是一棵具有特定性質的二叉樹 堆的基本要求是堆中所有節點的值必須大於等於 或者小於等於 其孩子節點的值 堆應該是一棵完全二叉樹 堆的表示 由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間 public class heap private int ary private int ...

資料結構 優先佇列(堆)

堆 堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 結構性質 堆總是一棵完全樹。堆序性 堆中某個節點的值總是不大於或不小於其父節點的值 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。堆的意義就在於 最快的找到最大 最小值,在堆結構中插入乙個值重新構造堆結構,取走最...