資料結構之堆

2021-06-25 10:42:27 字數 3374 閱讀 5569

1. 概述

堆(也叫優先佇列),是一棵完全二叉樹,它的特點是父節點的值大於(小於)兩個子節點的值(分別稱為大頂堆和小頂堆)。它常用於管理演算法執行過程中的資訊,應用場景包括堆排序,優先佇列等。

2. 堆的基本操作

堆是一棵完全二叉樹,高度為o(lg n),其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,先介紹幾個基本術語:

a:用於表示堆的陣列,下標從1開始,一直到n

parent(t):節點t的父節點,即floor(t/2)

right(t):節點t的左孩子節點,即:2*t

left(t):節點t的右孩子節點,即:2*t+1

heap_size(a):堆a當前的元素數目

下面給出其主要的四個操作(以大頂堆為例):

2.1 heapify(a,n,t)

該操作主要用於維持堆的基本性質。假定以right(t)和left(t)為根的子樹都已經是堆,然後調整以t為根的子樹,使之成為堆。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

voidheapify(inta,intn,intt)

}

2.2  buildheap(a,n)

該操作主要是將陣列a轉化成乙個大頂堆。思想是,先找到堆的最後乙個非葉子節點(即為第n/2個節點),然後從該節點開始,從後往前逐個調整每個子樹,使之稱為堆,最終整個陣列便是乙個堆。

1

2

3

4

5

6

7

8

9

10

11

voidbuildheap(inta,intn)

2.3 getmaximum(a,n)

該操作主要是獲取堆中最大的元素,同時保持堆的基本性質。堆的最大元素即為第乙個元素,將其儲存下來,同時將最後乙個元素放到a[1]位置,之後從上往下調整a,使之成為乙個堆。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

voidgetmaximum(inta,intn)

2.4  insert(a, n, t)

向堆中新增乙個元素t,同時保持堆的性質。演算法思想是,將t放到a的最後,然後從該元素開始,自下向上調整,直至a成為乙個大頂堆。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

voidinsert(inta,intn,intt)

a[p] = t;

returnmax;

}

3.  堆的應用

3.1  堆排序

堆的最常見應用是堆排序,時間複雜度為o(n lg n)。如果是從小到大排序,用小頂堆;從大到小排序,用大頂堆。

3.2  在o(n lg k)時間內,將k個排序表合併成乙個排序表,n為所有有序表中元素個數。

【解析】取前100 萬個整數,構造成了一棵陣列方式儲存的具有小頂堆,然後接著依次取下乙個整數,如果它大於最小元素亦即堆頂元素,則將其賦予堆頂元素,然後用heapify調整整個堆,如此下去,則最後留在堆中的100萬個整數即為所求 100萬個數字。該方法可大大節約記憶體。

3.3 乙個檔案中包含了1億個隨機整數,如何快速的找到最大(小)的100萬個數字?(時間複雜度:o(n lg k))

4. 總結

堆是一種非常基礎但很實用的資料結構,很多複雜演算法或者資料結構的基礎就是堆,因而,了解和掌握堆這種資料結構顯得尤為重要。

5. 參考資料

(1)經典演算法教程《演算法導論》

資料結構之堆

原帖 對於堆的資料結構的介紹,在網上搜了下,具體講的不是很多。發現比較好的一篇介紹堆的部落格是在此感謝他。通過對上面那篇部落格的學習,然後自己也去翻了下 演算法導論 裡面關於堆排序 heapsort 的介紹。這樣就對堆有了更加深刻的認識,在此,我結合自己的一點點理解,主要還是基於上面那篇部落格的內容...

資料結構之堆

堆 我們這裡指二叉堆 是一棵完全二叉樹,並且祖先節點的所有子孫節點都不小於 或不大於 祖先節點的值。通常我們把根節點作為第一層的話,那麼深度為h的堆就有2 h 1 2 h 1個節點,顯然擁有n個節點的堆,其高度為lgn。也就是說對堆進行插入語刪除操作我們都需要lgn的時間。由於堆的完全樹的性質,因此...

資料結構之堆

堆是一棵完全被填滿的二叉樹,可以的例外是在底層,底層上的元素從左到右填入。這樣的樹被稱為完全二叉樹。堆有兩種情況,一種是大堆,就是最大元素在最根部的,一種是小堆,就是最小元素位於最根部的。下面是一棵完全二叉樹的結構圖 堆可以使我們想要的操作得到快速的執行,為了達到快速執行的目的,一般來說堆的最小元應...