最近在學慕課上浙江大學資料結構的課程,記錄一下過程。以免後面忘記了。
下面是第五講-樹(下)關於堆的內容
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 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...
資料結構 堆
堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...