資料結構 優先佇列(堆)

2021-09-06 09:34:30 字數 2150 閱讀 2543

堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:

結構性質:堆總是一棵完全樹。

堆序性:堆中某個節點的值總是不大於或不小於其父節點的值;

將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

堆的意義就在於:最快的找到最大/最小值,在堆結構中插入乙個值重新構造堆結構,取走最大/最小值後重新構造堆結構,其時間複雜度為o(logn),而其他方法最少為o(n)

堆結構是一種陣列物件,它可以被視為一棵完全二叉樹。則a[i]儲存二叉樹中編號為i的結點值(1≤i≤size),樹的根為a[1],並且利用完全二叉樹的性質,我們很容易求第i個結點的父結點(parent(i))、左孩子結點(left(i))、右孩子結點(right(i))的下標了,分別為:trunc(i/2)、2i、2i+1;

例如下圖中插入80,先將80放在最後,然後兩次上浮到合適位置.

操作原理是:當刪除節點的數值時,原來的位置就會出現乙個孔,填充這個孔的方法就是,把最後的葉子的值賦給該孔並下調到合適位置,最後把該葉子刪除。

如圖中要刪除72,先用堆中最後乙個元素來35替換72,再將35下沉到合適位置,最後將葉子節點刪除。

「結點下沉」「下濾」

方法1:插入法:

對如圖的序列,要使其成為堆,我們從最後乙個分支結點(10/2),其值為72開始,依次對每個分支節點53,18,36 45進行調整(下沉).

設有n 個元素,欲將其按關鍵字排序。可以首先將這n個元素按關鍵字建成堆,將堆頂元素輸出,得到n個元素中關鍵字最大(或最小)的元素。然後,再將剩下的n-1個元素重新建成堆,再輸出堆頂元素,得到n個元素中關鍵字次大(或次小)的元素。如此反覆執行,直到最後只剩乙個元素,則可以得到乙個有序序列,這個排序過程稱之為堆排序。

銀行系統模擬 

【問題描述】假設銀行有四個服務視窗,初始每個視窗都可以提供服務;模擬開始後,每個視窗都能給出最早空閒時間(即最早可以提供服務的時間);當顧客到達後,總可以看到每個視窗標出的最早可以提供服務的時間,由此來選擇視窗,其中,顧客按照一定的頻率到達;到達後系統隨機產生服務時間,同時產生下乙個到達事件的時間。當顧客離開視窗時,該視窗為空閒,即可以為下乙個等待顧客提供服務。所有到達事件和離開事件都被插入優先佇列。 銀行系統模擬中的關鍵部分為客戶事件,包括到達事件和離開事件,所有事件都被加上時間戳,放到優先佇列中,佇列中優先順序最高的事件就是時間戳最早的事件。銀行模擬中用隨機數來決定下個顧客何時到達及當前顧客所需的服務時間,它可保證事件在某一範圍內等概率發生。如果,當前到達事件發生在t時刻,下乙個到達事件將發生在範圍t+arrivallow和t+arrivelhigh之間。而每個顧客的服務事件在範圍servicelow和servicehigh之間。到達/離開事件資料均應包括:時間、事件型別、顧客號、服務視窗、等待時間、服務時間等。試編寫程式模擬銀行系統的執行。

d叉堆與二叉堆很類似,但其中的每個非葉節叉堆與叉堆很類似,但其中的每個非葉節點有d個子女,而不是兩個.

參考:二叉堆 d叉堆 左式堆 斜堆

最大堆的插入、刪除、調整、操作(程式+**)

資料結構 堆(優先佇列)

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

資料結構 優先佇列(堆)

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

資料結構 堆 優先佇列

堆,實際上是乙個完全二叉樹,大概就是介個樣子。堆一般又分為大頂堆和小頂堆 實際上差不多。這裡就用小頂堆舉個例好了qwq 其實stl中的優先佇列已經有堆的作用了,但是手寫的堆也有一些自己的優勢。我們先來看看堆的一些常用操作。1.插入乙個數 2.求集合當中的最小值 3.刪除最小值 4.刪除任意乙個元素 ...