演算法導論 第三章 優先順序佇列(以堆為思想)

2021-06-02 00:15:43 字數 1766 閱讀 7961

1.優先順序佇列:是一種用來維護一組元素構成的集合s的資料結構,這一組元素中的每乙個都有乙個關鍵字key

對優先佇列執行的操作有1) 查詢;2) 插入乙個新元素;3) 刪除. 4)返回最大或最小值

insert

(s,x):把元素x插入到集合s。

maxmum

(s):返回s中的具有最大關鍵字的元素

extractmaxmum

(s):刪除並返回s中的具有最大關鍵字的元素

increasekey

(s,i,key):將第i個元素的關鍵字的值增加到k,這裡k值不能小於i原來關鍵字的值。

最大優先順序佇列不管各元素的入隊順序,在出隊時,總是對應優先順序最大的元素出隊。

最大優先順序佇列一般用二叉樹來實現。因為考慮到,對於最大優先順序佇列來講,我們關心的只是最大值,因此,這時的二叉樹只需要具備下面這個性質,那麼就可以實現了:

性質a:總是讓二叉樹中的每乙個節點的key(也就是優先順序)值比該節點的子節點的key值大。

#include using namespace std;

const int inf = 999999; /

// 以下**在堆排序中已講解過 ///

void maxheapify(int *a, int i, int len)}

void buildmaxheap(int *a, int size)

void printarray(int data, int size)}

// 插入關鍵字為key的元素

void maxheapinsert(int *a, int key, int &heapsize)

int main()

; // 區別len 和 heapsize

// heapsize是堆的大小,而len是初始陣列的總大小。

len = heapsize = 12;

// 首先建堆

buildmaxheap(arr, len);

cout << "建堆後: " << endl;

printarray(arr, len);

// 使用heapmaximum

cout << "當前最大的元素是: " << endl;

cout << heapmaximum(arr) << endl << endl;

// 使用heapextractmax

cout << "使用heapextractmax後: " << endl;

heapextractmax(arr,heapsize);

printarray(arr, heapsize);

// 再次使用heapextractmax

cout << "再次使用heapextractmax後: " << endl;

heapextractmax(arr,heapsize);

printarray(arr, heapsize);

// 使用heapincreasekey

cout << "使用heapincreasekey後: " << endl;

heapincreasekey(arr, 2, 15);

printarray(arr, heapsize);

// 使用maxheapinsert

cout << "使用maxheapinsert後: " << endl;

maxheapinsert(arr, 28, heapsize);

printarray(arr, heapsize);

演算法導論 第三章 函式的增長

漸近記號 1 漸近上界記號o 大寫o 含義 漸近地給出了乙個函式在常量因子內的上界 2 漸進下界記號 大寫 含義 漸進的給出乙個函式在常量因子的下界 漸進緊確界記號 含義 漸進的給出了乙個函式的上界和下界,eg 形式證明 n n 2 3 n n n 非漸進緊確上界記號o 小寫0 如果f n o g ...

演算法導論第三章函式的增長問題研究

演算法導論3.2 5 lg lg n 與lg lgn 哪個漸近更大些?先看lg n怎麼定義的。lg n min 假設乙個比宇宙原子總數目10 80還要大的數2 65536.根據多重對數函式定義知道 當i 1時,第一次lg得 lg2 65536 65536 書中規定log2 lg 當i 2時,第二次l...

演算法導論 第三章 掌握漸進符號O和

本篇文章基於麻省理工學院的公開課第二講。首先從純數學的角度上來理解。exam1 f n o g n 代表存在常數c和n0,使得n n0時,滿足0 f n c g n 比如2 n 2 o n 3 這裡n 2代表n的平方,n 3代表n的三次方,用過matlab的應該很好理解。這裡套用o的定義可知,即存在...