演算法導論閱讀筆記

2022-09-06 10:18:12 字數 3328 閱讀 8882

優先順序佇列:

1、概述

佇列是一種滿足先進先出(fifo)的資料結構,資料從佇列頭部取出,新的資料從佇列尾部插入,資料之間是平等的,不存在優先順序的。這個就類似於普通老百姓到火車站排隊買票,先來的先買票,每個人之間是平等的,不存在優先的權利,整個過程是固定不變的。而優先順序佇列可以理解為在佇列的基礎上給每個資料賦乙個權值,代表資料的優先順序。與佇列類似,優先順序佇列也是從頭部取出資料,從尾部插入資料,但是這個過程根據資料的優先順序而變化的,總是優先順序高的先出來,所以不一定是先進先出的。這個過就類似於買火車票時候軍人比普通人優先買,雖然軍人來的晚,但是軍人的優先順序比普通人高,總是能夠先買到票。通常優先順序佇列用在作業系統中的多任務排程,任務優先順序越高,任務優先執行(類似於出佇列),後來的任務如果優先順序比以前的高,則需要調整該任務到合適的位置,以便於優先執行,整個過程總是使得佇列中的任務的第一任務的優先順序最高。

優先順序佇列有兩種:最大優先順序佇列和最小優先順序佇列,這兩種類別分別可以用最大堆和最小堆實現。書中介紹了基於最大堆實現的最大優先順序佇列。乙個最大優先順序佇列支援的操作如下操作:

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

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

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

increase_key(s,x,k):將元素x的關鍵字的值增加到k,這裡k值不能小於x的原關鍵字的值。

2、最大優先順序佇列操作實現

(1)heap_maximum用o(1)時間實現maximum(s)操作,即返回最大堆第乙個元素的值即可(return a[1])。

(2)heap_extract_max實現extract_max操作,刪除最大堆中第乙個元素,然後調整堆。操作過程如下:將最堆中最後乙個元素複製到第乙個位置,刪除最後乙個節點(將堆的大小減少1),然後從第乙個節點位置開始調整堆,使得稱為新的最大堆。操作過程如下圖所示:

偽**描述如下:

1 head_extract_max(a)

2 if heap_size[a]<1

3 ther error

4 max = a[1]

5 a[1] = a[heap_size[a]];

6 heap_size[a] = heap_size[a]-1

7 adjust_max_heap(a,1)

8 return max

(3)heap_increase_key實現increase_key,通過下標來標識要增加的元素的優先順序key,增加元素後需要調整堆,從該節點的父節點開始自頂向上調整。操作過程如下圖所示:

偽**描述如下:

1 heap_increase_key(a,i,key)

2 if key < a[i]

3 then error

4 a[i] = key

5 while i>1 && a[parent(i)] a[parent(i)]

7 i = parent(i)

(4)max_heap_insert實現insert操作,向最大堆中插入新的關鍵字。新的關鍵字插入在優先順序的隊尾部,然後從尾部的父節點開始自頂向上調整堆偽**描述如下:

1 max_heap_insert(a,key)

2 heap_size[a] = heap_size[a]+1

3 a[heap_size[a]] = -0;

4 heap_increase_key(a,heap_size[a],key)

3、例項

問題描述如下:優先順序佇列中有多個事件發生,每個事件有自己獨立的優先順序,優先順序是非負數,數值越大優先順序越高。採用最大優先順序佇列模擬事件執行的優先順序。具體操作包括:

(1)向優先順序佇列中新增乙個新事件

(2)獲取優先順序佇列中優先順序最高的事件

(3)刪除優先順序佇列中指定位置的事件

(4)增加優先順序佇列中指定位置事件的優先順序

(5)降低優先順序佇列中指定位置事件的優先順序

採用c++語言實現,完整程式如下所示:

1 #include 2 #include 3 #include 4 using namespace std;

5 6 const static int queuelen = 100;

7 8 class event

9 ;12 event(const string &en,const int p):eventname(en),priority(p){};

13 event(const event& en)

14

18 ~event(){};

19 int get_event_priority()const

20

23 string get_event_name()const

24

27 void increase_event_priority(const int k)

28

31 void decrease_event_priority(const int k)

32

35 void show_event() const

36

95 else

96 break;

97 }

98 }

99 event priorityqueue::get_event()const

100

106

107 void priorityqueue::insert_event(const event& en)

108

113

114 void priorityqueue::increase_event_priority(int pos,int k)

115

135 }

136

137 event priorityqueue::delete_event(int pos)

138 共六個數,假設陣列下標從1開始,以元素所在陣列中的下標為優先順序建立優先順序佇列,佇列中元素出入時候調整最小優先順序佇列。操作過程如下圖所示:

演算法導論閱讀筆記

第二章 演算法入門 本章通過介紹插入排序和歸併排序兩種常見的排序演算法來說明演算法的過程及演算法分析,在介紹歸併排序演算法過程中引入了分治 divide and conquer 演算法策略。1 插入排序 輸入 n個數 a1,a2,a3,an 輸出 輸入序列的乙個排列 a1 a2 a3 an 使得 a...

對於演算法導論閱讀的感想

實際上就是暴力排序,乙個是從多變少,乙個是從少變多。選擇排序是對新陣列成員進行選擇而無需照顧源陣列,而氣泡排序則是對源陣列進行選擇而無需照顧生成陣列。時間複雜度 o n 2 乍一看,感覺和冒泡是神似的。因為他們都是通過對源陣列進行選擇而無需照顧生成陣列的。但是不同的地方就是堆排序有乙個生成堆的提前過...

《演算法導論》筆記彙總

列表裡沒有的,或者是純屬理論,不適合寫,比如第1 5章 或者是我也不怎麼明白的,比如斐波那契堆中抽取最小結點的平攤代價分析 還有沒看的,比如數論和np完全性等。陸續看了四個月,有些理解的還不是很深,筆記彙總到這裡。如果有問題,可以郵件交流。第六章 堆排序 堆排序 第七章 快速排序 四種快速排序 快速...