數(shù)據(jù)結(jié)構(gòu)與算法(Python語言描述)課件DS_053_優(yōu)先級隊列和堆排序_第1頁
數(shù)據(jù)結(jié)構(gòu)與算法(Python語言描述)課件DS_053_優(yōu)先級隊列和堆排序_第2頁
數(shù)據(jù)結(jié)構(gòu)與算法(Python語言描述)課件DS_053_優(yōu)先級隊列和堆排序_第3頁
數(shù)據(jù)結(jié)構(gòu)與算法(Python語言描述)課件DS_053_優(yōu)先級隊列和堆排序_第4頁
數(shù)據(jù)結(jié)構(gòu)與算法(Python語言描述)課件DS_053_優(yōu)先級隊列和堆排序_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、優(yōu)先級隊列、堆排序優(yōu)先級隊列、堆排序 2016 Fall 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 2021-7-281中國海洋大學(xué)數(shù)學(xué)科學(xué)學(xué)院中國海洋大學(xué)數(shù)學(xué)科學(xué)學(xué)院 優(yōu)先級隊列優(yōu)先級隊列 Priority Queue 2021-7-28 l與棧和隊列一樣:與棧和隊列一樣: n可以保存數(shù)據(jù)元素,訪問、入、出可以保存數(shù)據(jù)元素,訪問、入、出 l不同之處:每個數(shù)據(jù)都附有不同之處:每個數(shù)據(jù)都附有優(yōu)先級優(yōu)先級,任何時候訪,任何時候訪 問、出對列的總是當(dāng)前隊列中最優(yōu)先的元素問、出對列的總是當(dāng)前隊列中最優(yōu)先的元素 n“有序有序” 隊列!隊列! 2021-7-28 優(yōu)先級隊列優(yōu)先級隊列 l代表了數(shù)據(jù)的某種性質(zhì):代表了數(shù)據(jù)的某種性質(zhì)

2、: n各項工作的計劃開始時間各項工作的計劃開始時間 n一個大項目中各種工作任務(wù)的急迫程度一個大項目中各種工作任務(wù)的急迫程度 n銀行客戶的誠信評估,用于決定優(yōu)先貸款等銀行客戶的誠信評估,用于決定優(yōu)先貸款等 優(yōu)先級(優(yōu)先級(Priority) 2021-7-28 class PrioQue: def _init_(self, elist = ): self.elems = list(elist) self.elems.sort(reverse = True) # 由大到小排序由大到小排序 def is_empty(self): return self.elems = def peek(self):

3、 if self.is_empty(): raise PrioQueueError(in top) return self.elems-1 實現(xiàn)方式實現(xiàn)方式1:sorted list 2021-7-28 def dequeue(self): if self.is_empty(): raise PrioQueueError(in pop) return self.elems.pop() # 元素由大到小排,直接元素由大到小排,直接pop def enqueue(self, e): i = len(self.elems) - 1 while i = 0: if self.elemsi = e: i

4、 -= 1 else: break self.elems.insert(i+1, e) # 循環(huán)結(jié)束時,遇到了第一個大于循環(huán)結(jié)束時,遇到了第一個大于e的元素的元素elemsi # 入入隊列的時間復(fù)雜度隊列的時間復(fù)雜度: O(n) 2021-7-28 l 入隊列時保持有序,出隊列直接入隊列時保持有序,出隊列直接pop; n入隊列:入隊列:O(n) n出對列:出對列:O(1) l入隊列時不處理,出隊列時搜索最優(yōu)先:入隊列時不處理,出隊列時搜索最優(yōu)先: n入隊列:入隊列:O(1) n出隊列:出隊列:O(n) 線性方式兩種策略線性方式兩種策略 2021-7-28 堆結(jié)構(gòu)堆結(jié)構(gòu) Heap 2021-7-

5、28 大頂堆大頂堆 和和 小頂堆小頂堆 l堆頂?shù)亩秧數(shù)摹皟?yōu)先級優(yōu)先級”最高最高 【數(shù)最小數(shù)最小 小頂堆小頂堆】 n上面輕,下面沉;上面輕,下面沉; 上面氣泡,下面石頭上面氣泡,下面石頭 n氣泡上浮,石頭下沉氣泡上浮,石頭下沉 “土堆土堆” 2021-7-28 堆堆 l是是一棵一棵“基本有基本有序序”的完全二叉樹的完全二叉樹 ! n任何結(jié)點的值都小于等于其左右孩子的值!任何結(jié)點的值都小于等于其左右孩子的值! 堆(遞歸定義)堆(遞歸定義) n空樹;空樹; n若非空,是一棵完全二叉樹,滿足:若非空,是一棵完全二叉樹,滿足: 若根結(jié)點有左孩子,則根結(jié)點值小于等于其左孩子值;若根結(jié)點有左孩子,則根結(jié)點值

6、小于等于其左孩子值; 若根結(jié)點有右孩子,則根結(jié)點值小于等于其右孩子值;若根結(jié)點有右孩子,則根結(jié)點值小于等于其右孩子值; 左右子樹仍然是堆!左右子樹仍然是堆! l特點:特點: n最優(yōu)先的元素位于堆頂;最優(yōu)先的元素位于堆頂; n 左右子樹仍然是堆;左右子樹仍然是堆; n 由根到葉子的路徑上,結(jié)點是有序的;由根到葉子的路徑上,結(jié)點是有序的; l應(yīng)用:應(yīng)用: n表示優(yōu)先級隊列!表示優(yōu)先級隊列! n堆排序堆排序 堆堆 2021-7-28 堆的表示堆的表示 2021-7-28 l適合順序存儲適合順序存儲 n結(jié)點結(jié)點i 的孩子:的孩子: 2 * i + 1, 2 * i + 2 n結(jié)點結(jié)點i 的雙親:的雙親

7、: ( i -1 )/2 l由根到葉子的路徑長由根到葉子的路徑長 logn n含含有有n個結(jié)點的完全二叉樹的深度:個結(jié)點的完全二叉樹的深度: log2n 回憶:完全二叉樹的性質(zhì)回憶:完全二叉樹的性質(zhì) 2021-7-28 堆的表示堆的表示 l順序存儲!順序存儲! 01234567 1236248547305391 l含含n個元素的線性序列個元素的線性序列elem0,n-1,滿足:,滿足: nelemi = elem2 * i + 1, 如果如果2*i+1 n nelemi = elem2 * i + 2, 如果如果2*i+2 0 and e elemsj: elemsi = elemsj # 把

8、雙親擠下來把雙親擠下來對應(yīng)小數(shù)上浮對應(yīng)小數(shù)上浮 i, j = j, (j-1)/2 # 繼續(xù)上行繼續(xù)上行 elemsi = e 時間復(fù)雜度:時間復(fù)雜度:O(logn) siftup向上篩選向上篩選 2021-7-28 如何由堆中刪除元素?如何由堆中刪除元素? 2021-7-28 01234567 1338274976654997 輸出堆頂后的輸出堆頂后的siftdown過程過程 13 3827 65764949 97 3827 65764949 97 97 3827 65764949 27 3897 65764949 27 3849 65764997 輸出堆頂后的輸出堆頂后的siftdown過

9、程過程 左右兩棵子樹已經(jīng)是堆,左右兩棵子樹已經(jīng)是堆, 將將最后一個最后一個元素充填堆頂,元素充填堆頂, 讓其根據(jù)讓其根據(jù)“重量重量”自然下沉:自然下沉: 效果是把小的孩子向上擠!效果是把小的孩子向上擠! siftdown從根開始沿小孩子下行從根開始沿小孩子下行 2021-7-28 j 是是i的小孩子的小孩子 i i i 的小孩子的小孩子 j def siftdown(self, e, begin, end): # j的下行范圍的下行范圍 end elems = self.elems, i, j = begin, begin*2+1 while j end: if j+1 end and ele

10、msj+1 elemsj: j += 1 # 選出小選出小孩子孩子 if e 0: self.siftdown(e, 0, len(elems) #0,len) return e0 2021-7-28 l 初始初始一次性一次性建堆:建堆: O(n) l出隊列:出隊列:O(logn) l入隊列:入隊列:O(logn) 堆方式堆方式 2021-7-28 堆排序堆排序 HeapSort 2021-7-28 lstep1:對序列建堆;:對序列建堆; lstep2: 不斷輸出堆頂元素,然后通過不斷輸出堆頂元素,然后通過siftdown再再 次調(diào)整成元素數(shù)少次調(diào)整成元素數(shù)少1的堆,直到所有元素輸出。的堆,

11、直到所有元素輸出。 堆結(jié)構(gòu)的應(yīng)用堆結(jié)構(gòu)的應(yīng)用堆排序堆排序 2021-7-28 堆排序堆排序 2021-7-28 小頂堆排序的結(jié)果是由大到小!小頂堆排序的結(jié)果是由大到?。?堆排序堆排序 def heap_sort(elems): def siftdown(elems, e, begin, end): # begin, end) i, j = begin, begin*2+1 while j end: if j+1 end and elemsj+1 elemsj: j += 1 if e elemsj: break elemsi = elemsj i, j = j, 2*j+1 elemsi =

12、e end = len(elems) for i in range(end/2-1, -1, -1): # 初始建堆初始建堆 siftdown(elems, elemsi, i, end) for i in range(end-1), 0, -1): # 不斷輸出堆頂,然后調(diào)整不斷輸出堆頂,然后調(diào)整 e = elemsi elemsi = elems0 # 堆頂輸出后,放到當(dāng)前的最后堆頂輸出后,放到當(dāng)前的最后 siftdown(elems, e, 0, i) # 注意:堆的范圍在縮小注意:堆的范圍在縮小 l時間:時間:O(n logn) n 建堆:建堆:O(n) n 不斷輸出堆頂、調(diào)整:不斷輸出堆頂、調(diào)整: O(n logn) 共共n個元素個元素 每個元素輸出后的每個元素輸出后的siftdown,不超過樹的深度,不超過樹的深度 log(n-1) + + log(2) n logn l空間:空間:O(1) 堆排序的復(fù)雜度分析堆排序的復(fù)雜度分析 2021-7-28 小結(jié)小結(jié) 2021-7-28 l堆結(jié)構(gòu)的特點堆結(jié)構(gòu)的特點 n邏輯上是邏輯上是“基本有序基本有序”的完全二叉樹,小頂堆堆頂最??!的完全二叉樹,小頂堆堆頂最??! l堆調(diào)整堆調(diào)整 nSiftu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論