堆及其應用

2021-07-03 11:00:05 字數 2056 閱讀 1394

對於堆的資料結構的介紹,在網上搜了下,具體講的不是很多。發現比較好的一篇介紹堆的部落格是在此感謝他。

通過對上面那篇部落格的學習,然後自己也去翻了下《演算法導論》裡面關於堆排序(heapsort)的介紹。這樣就對堆有了更加深刻的認識,在此,我結合自己的一點點理解,主要還是基於上面那篇部落格的內容(主要也是《演算法導論》裡的內容),也把他裡面程式的一些錯誤改正,我把這篇部落格寫了出來,以加深對堆的認識,並供自己日後溫習。後面我還要練習poj上幾天關於堆的題目,鏈結會在後面給出。

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當前的元素數目

3.保持堆的性質 heapify(a,n,t)

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

void heapify(int a,int

i)}

4.建堆 buildheap(a,n)

操作主要是將陣列a轉化成乙個大頂堆。思想是,先找到堆的最後乙個非葉子節點(即為第n/2個節點),然後從該節點開始,從後往前逐個調整每個子樹,使之稱為堆,最終整個陣列便是乙個堆。子陣列a[(n/2)+1..n]中的元素都是樹中的葉子,因此都可以看作是只含有乙個元素的堆。具體的過程我覺得看《演算法導論》裡面的圖的話理解應該很簡單,我找不到那圖。

void buildheap(int

a,)

5.堆排序演算法   

先用buildheapo將陣列a[1..n]構造成乙個最大堆。因為陣列中最大元素在根a[1],則可以通過把它與a[n]交換來達到最終正確的位置。

void heapsort(int

a)}

6.優先佇列  priority queue

優先佇列是一種用來維護由一組元素構成的集合s的資料機構。相信大家對它都有所了解。雖然說c++裡面有了priority_queue,但我們還是要了解它的一些基本構成及實現的**。

getmax:

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

void getmaximum(int

a)

insert:

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

void insert(int a, int

i)

a[p]=i;

}

總結。

堆的最常見應用是堆排序,時間複雜度為o(n lg n)。如果是從小到大排序,用小頂堆;從大到小排序,用大頂堆。雖然堆排序是乙個很漂亮的演算法,但實際中,快排的乙個好的實現往往優於堆排序。儘管這樣,對資料結構還是有著很大的用處,比如說優先佇列。

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

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

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

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

堆及其應用

應用1.優先順序佇列 優先順序佇列 是不同於先進先出佇列的另一種佇列。每次從佇列中取出的是具有最高優先權的元素。pragma once include include include include heap.h using namespace std template class priority...

堆及其應用學習小結

堆及其應用 堆結構是一種陣列物件,它可以被視為一棵完全二叉樹。如果一棵深度為k二叉樹,1至k 1層的結點都是滿的,即滿足2i 1,只有最下面的一層的結點數小於2i 1,並且最下面一層的結點都集中在該層最左邊的若干位置,則此二叉樹稱為完全二叉樹。樹中每個結點與陣列中存放該結點中值的那個元素相對應 大根...

堆及其操作

堆及其操作 include include include define maxdata 1000 該值根據具體情況定義為大於堆中所有可能元素的值 define error 1 錯誤標誌 應根據具體情況定義為堆中不可能出現的元素值 堆的c語言描述 struct hnode struct hnode ...