資料結構 什麼是堆

2021-08-20 19:30:17 字數 2777 閱讀 2334

堆(英語:heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。

堆的性質:

1.堆中某個節點的值總是不大於或不小於其父節點的值。

2.堆總是一棵完全二叉樹。

將根節點最大的堆叫做最大堆或大頂堆,根節點最小的堆叫做最小堆或小頂堆。常見的堆有二叉堆、斐波那契堆等。

堆的定義如下:n個元素的序列當且僅當滿足下關係時,稱之為堆。

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)

若將和此次序列對應的一維陣列(即以一維陣列作此序列的儲存結構)看成是乙個完全二叉樹,則堆的含義表明,完全二叉樹中所有非終端結點的值均不大於(或不小於)其左、右孩子結點的值。由此,若序列是堆,則堆頂元素(或完全二叉樹的根)必為序列中n個元素的最小值(或最大值)。

每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖:

大堆:

小堆:

build:建立乙個空堆;

insert:向堆中插入乙個新元素;

update:將新元素提公升使其符合堆的性質;

get:獲取當前堆頂元素的值;

delete:刪除堆頂元素;

heapify:使刪除堆頂元素的堆再次成為堆。

某些堆實現還支援其他的一些操作,如斐波那契堆支援檢查乙個堆中是否存在某個元素。

n個結點的堆,高度d =log2n。根為第0層,則第i層結點個數為2i,考慮乙個元素在堆中向下移動的距離。大約一半的結點深度為d-1,不移動(葉)。四分之一的結點深度為d-2,而它們至多能向下移動一層。樹中每向上一層,結點的數目為前一層的一半,而子樹高度加一。

這種演算法時間代價為ο(n)由於堆有log n層深,插入結點、刪除普通元素和刪除最小元素的平均時間代價和時間複雜度都是

ο(log n)。

在程式中,堆用於動態分配和釋放程式所使用的物件。在以下情況中呼叫堆操作:

1.事先不知道程式所需物件的數量和大小。

2.物件太大,不適合使用堆疊分配器。

堆使用執行期間分配給**和堆疊以外的部分記憶體。

傳統上,作業系統和執行時庫隨附了堆實現。當程序開始時,作業系統建立稱為程序堆的預設堆。如果沒有使用其他堆,則使用程序堆分配塊。語言執行時庫也可在乙個程序內建立單獨的堆。(例如,c 執行時庫建立自己的堆。)除這些專用堆外,應用程式或許多載入的動態鏈結庫 (dll) 之一也可以建立並使用單獨的堆。win32 提供了一組豐富的 api用於建立和使用專用堆。有關堆函式的優秀教程,請參閱 msdn 平台 sdk 節點。

當應用程式或 dll 建立專用堆時,這些堆駐留於程序空間中並且在程序範圍內是可訪問的。某一給定堆分配的任何資料應為同一堆所釋放。(從乙個堆分配並釋放給另乙個堆沒有意義。)

在所有虛擬記憶體系統中,堆位於作業系統的虛擬記憶體管理器之上。語言執行時堆也駐留在虛擬記憶體之上。某些情況下,這些堆在作業系統堆的上層,但語言執行時堆通過分配大的塊來執行自己的記憶體管理。繞開作業系統堆來使用虛擬記憶體函式可使堆更好地分配和使用塊。

典型的堆實現由前端分配器和後端分配器組成。前端分配器維護固定大小塊的自由列表。當堆收到分配呼叫後,它嘗試從前端列表中查詢自由塊。如果此操作失敗,則堆將被迫從後端(保留和提交虛擬記憶體)分配乙個大塊來滿足請求。通常的實現具有每個塊分配的開銷,這花費了執行週期,也減少了可用儲存區。

單個全域性鎖可防止多執行緒同時使用堆。此鎖主要用於保護堆資料結構不受多執行緒的任意訪問。當堆操作過於頻繁時,此鎖會對效能造成負面影響。

#pragma once

template

class jbminheap

jbminheap(jbminheap &h)

}~jbminheap()

//獲取整個最小堆的頭部指標

t * getminheap()

//判斷堆是不是空的

bool isempty()

bool add(t x)

_index++;

_minheap[_index] = x;

return

true;

}bool isfull()

//堆進行向下調整

void adjustdown(int index);

//隊進行向上調整

void adjustup(int index);

//建堆運算

void createminheap()

for (int i = (_index-1)/2;i >-1;i--)

}};template

void jbminheap::adjustdown(int index)

while (index<_index>

if (twoc >_index)

if (_minheap[onec] <= _minheap[twoc])

else

}else

else }}

}template

void jbminheap::adjustup(int index)

while (index>-1)

else

}else

//出界就結束迴圈}}

資料結構 什麼是資料結構?

緒論 其實,資料結構在計算機科學界至今沒有標準的定義。個人根據各自的理解的不同而有不同的表述方法 資料結構是資料物件,以及存在於該物件的例項合組成例項的資料元素之間的各種聯絡。這些聯絡可以通過定義相關的函式來給出。他將資料物件 data object 定義為 乙個資料物件是例項或值的集合 其實,究竟...

資料結構 什麼是資料結構

基本概念 資料 是對客觀事物的符號表示 資料元素 是資料的基本單位 資料物件 是性質相同的資料元素的集合,是資料的乙個子集 資料結構 是相互之間存在的一種或多種特定關係的資料元素的集合,資料元素相互之間的關係稱為結構。通常有下列四類基本結構 線性結構 樹形結構 圖狀結構和網狀結構 資料結構在計算機中...

資料結構 什麼是資料結構?

什麼是資料結構 1.資料結構的有關定義 1 資料結構 是帶有結構資料元素的集合 2 資料 是客觀事物的數值 字元以及能輸入機器且能被處理的各種符號的集合 編譯 鏈結 源程式 c 目標程式 obj 可執行程式 exe 3 資料物件 是性質相同的資料元素的集合 4 資料型別 一組性質相同的值的集合以及定...