資料結構 堆

2021-08-18 16:35:55 字數 1687 閱讀 1007

最近在學慕課上浙江大學資料結構的課程,記錄一下過程。以免後面忘記了。

下面是第五講-樹(下)關於堆的內容

1. 概念

在講堆之前先講了優先佇列(priority queue)的含義,一般的佇列是按照先近先出的原則,也就是誰先請求,就先響應誰。但是在很多情況下,先請求的任務不一定有後請求的任務重要,不同任務的重要性,權重不同。 因此在佇列中,就應該優先取出權重大的元素,而不一定是最先進入佇列的元素。這種優先佇列也需要一種儲存結構,陣列或者鍊錶。選擇一種特殊的完全二叉樹來表示這種優先佇列,這種二叉樹有兩種特性:

1.使用陣列來儲存這種完全二叉樹,所以在陣列中父節點的索引值是其左右孩子索引值的一半,parent=child/2;

2. 這種完全二叉樹從根節點一層層往下具有一定的順序,公升序或者降序,如果根節點大於其左右孩子為,為最大堆,反之為最小堆

2. 堆的陣列表示及插入刪除操作

可以將堆作為乙個類封裝起來,下面考慮該類的資料成員和函式成員

資料成員:

1).首先要有乙個指標*data(指向某一陣列的首位址),指向乙個陣列,

2)然後需要乙個整形變數capacity,儲存陣列的容量;

3)最後需要乙個變數size,陣列表示實際的大小

函式成員:

函式成員主要是對這個堆的操作,包括插入,刪除,列印節點到跟的路徑等等;

在a*演算法中,如果openlist使用最小堆儲存其中的資料(並按f值大小為排序基準),如果當前節點周圍8個待擴充套件節點,有的已經處於openlist中了,那麼需要判斷這些節點通過當前節點到達起點的g1是否比之前的g0要小,如果g1

3. **實現

#include "stdafx.h"

#includeusing namespace std;

minheap::minheap(int cap)

int minheap::insert(int x)

int i = ++size;

for (;date[i/2]>x;i/=2)

date[i] = x;

return 1;

} int minheap::delete()

int mindate = date[1];

int temp = date[size];

size--;

int parent = 1;

int child;

for (;parent*2<=size;parent=child)

if (date[child] >= temp)

break;

else

date[parent] = date[child];

}date[parent] = temp;

return mindate;

} minheap::~minheap()

void minheap::printpath(int i)

for (int j=i;j>1;j=j/2)

cout << date[1] << endl;

} void minheap::adjust(int index)

{ int parent = 0.5*index;

while(date[index]

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...