資料結構 回顧優先佇列(堆)

2021-09-23 23:25:30 字數 2531 閱讀 1367

1.優先佇列有兩項基本操作:插入(insert)和刪除最小項(deletemin),後者的工作是找出、返回和刪除優先佇列中最小的元素。而insert操作則等價於enqueue(入隊),deletemin則等價於dequeue(出隊)。補充:c++提供2個版本的deletemin,乙個刪除最小項,另乙個在刪除最小項的同時在通過引用傳遞的物件中儲存所刪除的值。

2.優先佇列的類介面

template

class binaryheap

;

3.插入到乙個二叉堆

void insert(const comparable & x)

4.在二叉堆中執行deletemin

void deletemin()

void deletemin(comparable & minitem)

void percolatedown(int hole)

array[hole]=tmp;

}

5.左式堆(leftist heap)像二叉堆那樣既有結構性質,又有堆序性質。左序堆也是二叉樹,它和二叉樹的唯一區別是:左式堆不是理想平衡的(perfectly balanced),而且事實上是趨於非常不平衡的。左式堆的性質:對於堆中的每乙個結點x,左兒子的零路徑至少於右兒子的零路徑長一樣大。由於左式堆是趨向於加深左路徑,因此右路徑應該很短,沿左式堆右側的右路徑確實是該堆中最短的路徑。否則就會存在一條路徑通過某個結點x並取得左兒子,此時x就破壞了左式堆的性質。

6.對左式堆的基本操作是合併(插入只是合併的特殊情形)。左式堆型別宣告:

template

comparable>

class

leftistheap

};leftistnode *root;

leftistnode *merge (leftistnode *h1,leftistnode *h2);

leftistnode *merge1(leftistnode *h1,leftistnode *h2);

void swapchildren(leftistnode *t);

void reclainmemory(leftistnode *t);

leftistnode *clone(leftistnode *t) const;

};

7.合併左式堆的驅動程式和實際程式

void merge(leftistheap & rhs)

leftistnode * merge(leftistnode *h1,leftistnode *h2)

leftistnode *merge1(leftistnode *h1,leftistnode *h2)

return h1;

}

8.左式堆的insert程式和deletemin程式

void insert(const comparable & x)

void deletemin()

void deltemin(comparable & minitem)

9.二項佇列不是一棵堆序的樹,而是堆序的集合,稱為森林(forest)。

10.二項佇列類構架及結點定義:

template

class binomialqueue

};enum ;

int currentsize;

vector

thetrees;

int findminindex() const;

int capacity() const;

binomialnode * combinetrees(binomialnode *t1,binomialnode *t2);

void makeempty(binomialnode * & t);

binomialnode * clone(binomialnode * t) const;

};

11.在stl中,二叉堆是通過稱為priority_queue的類模板實現的,該類模板可以在標準標頭檔案queue中找到。stl 實現了乙個最大堆而不是最小堆,因此所訪問的項就是最大的項而不是最小的項。其鍵成員函式如下:

void push(const

object & x);

const

object & top() const;

void pop();

bool empty();

void clear();

資料結構 堆(優先佇列)

一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...

資料結構 優先佇列(堆)

什麼是堆 堆是一棵具有特定性質的二叉樹 堆的基本要求是堆中所有節點的值必須大於等於 或者小於等於 其孩子節點的值 堆應該是一棵完全二叉樹 堆的表示 由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間 public class heap private int ary private int ...

資料結構 優先佇列(堆)

堆 堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 結構性質 堆總是一棵完全樹。堆序性 堆中某個節點的值總是不大於或不小於其父節點的值 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。堆的意義就在於 最快的找到最大 最小值,在堆結構中插入乙個值重新構造堆結構,取走最...