資料結構與演算法 堆

2022-09-29 00:48:16 字數 1649 閱讀 7535

堆的乙個經典的實現是完全二叉樹(complete binary tree),這樣實現的堆稱為二叉堆(binary heap)。

這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。

滿二叉樹:除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。

可以看出:滿二叉樹所有的節點都擁有左孩子,又擁有右孩子。

完全二叉樹:不一定是乙個滿二叉樹,但它不滿的那部分一定在右下側,如下圖

堆的特性:

假設現有元素 5 需要插入,為了維持完全二叉樹的特性,新插入的元素一定是放在結點 6 的右子樹;同時為了滿足任一結點的值要小於左右子樹的值這一特性,新插入的元素要和其父結點作比較,如果比父結點小,就要把父結點拉下來頂替當前結點的位置,自己則依次不斷向上尋找,找到比自己大的父結點就拉下來,直到沒有符合條件的值為止。

動畫講解

在這裡先將元素 5 插入到末尾,即放在結點 6 的右子樹。

然後與父模擬較, 6 > 5 ,父類數字大於子類數字,子類與父類交換。

重複此操作,直到不發生替換。

核心點:將最後乙個元素填充到堆頂,然後不斷的下沉這個元素。

假設要從節點 1 ,也可以稱為取出節點 1 ,為了維持完全二叉樹的特性 ,我們將最後乙個元素 6 去替代這個 1 ;然後比較 1 和其子樹的大小關係,如果比左右子樹大(如果存在的話),就要從左右子樹中找乙個較小的值替換它,而它能自己就要跑到對應子樹的位置,再次迴圈這種操作,直到沒有子樹比它小。

通過這樣的操作,堆依然是堆,總結一下:

找到要刪除的節點(取出的節點)在陣列中的位置

用陣列中最後乙個元素替代這個位置的元素

當前位置和其左右子樹比較,保證符合最小堆的節點間規則

刪除最後乙個元素

對於有 n 個節點的堆來說,其高度 \(d = \log_2 + 1\)。 根為第 0 層,則第 \(i\) 層結點個數為 \(2i\),

考慮乙個元素在堆中向下移動的距離。

大約一半的結點深度為 \(d-1\) ,不移動(葉)。

四分之一的結點深度為 \(d-2\) ,而它們至多能向下移動一層。

樹中每向上一層,結點的數目為前一層的一半,而子樹高度加一

堆有 \(\log n\)層深,所以插入刪除的平均時間和最差時間都是 \(o(\log n)\)

普通佇列是一種先進先出的資料結構,先放進佇列的元素取值時優先被取出來。而優先佇列是一種具有最高優先順序元素先出的資料結構,比如每次取值都取最大的元素。

優先佇列支援下面的操作:

找出優先順序最高的元素(最大或最小元素);

刪除乙個具有最高優先順序的元素;

新增乙個元素到集合中。

資料結構與演算法 堆結構

1 本質 一顆特殊的樹。2 特性 3 分類 對於每乙個節點的值都大於等於子節點的值的情況,該堆被稱為大頂堆。對於每乙個節點的值都小於等於子節點的值的情況,該堆被稱為小頂堆。4 儲存方式 對於完全二叉樹而言,陣列儲存方式是最節省記憶體的。5 插入節點的時間複雜度 將節點插入到靠左的底層作為新的葉子節點...

資料結構與演算法 堆

堆 完全二叉樹,高度為o lgn 基本操作至多和樹的高度成正比,構建堆的時間複雜度是o n 堆是一顆完全二叉樹,假設有n個節點,樹高h log2 n 證明方法如下 1 假設根節點的高度為0,葉子節點高度為h,每層包含元素個數為2 x,x 從0 到h。2 構建堆的過程是自下而上,對於每層非葉子節點需要...

資料結構與演算法 堆

在 演算法設計技巧與分析 這本書的第四章,介紹了堆。於是按照上面的偽 實現了一下。資料結構定義maxheap.hpp如下,1 ifndef max heap hpp 2 define max heap hpp 34 include 5using std vector 67 class maxheap...