




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第7章每一步局部最優(yōu)—貪心法7.1貪心法概述7.2求解組合問題7.3求解圖問題7.4求解調(diào)度問題7.5哈夫曼編碼CONTENTS提綱1/197.4求解調(diào)度問題調(diào)度問題有許多形式,這里專指這樣形式的調(diào)度問題,n個作業(yè)要在一臺機器上加工,每個作業(yè)的加工時間可能不同,這樣有些作業(yè)就需要等待,全部作業(yè)完工的時間為等待時間和加工時間之和,稱為系統(tǒng)總時間。該調(diào)度問題通常有兩種,一是不帶懲罰,另外一種是帶懲罰的。2/197.4.1不帶懲罰的調(diào)度問題不帶懲罰的調(diào)度問題的最優(yōu)解是最小系統(tǒng)總時間,實際上n個作業(yè)的加工順序不同對應的系統(tǒng)總時間也不相同,該問題就是求一個具有最小系統(tǒng)總時間的加工順序。貪心策略是選擇當前加工時間最小的作業(yè)優(yōu)先加工,也就是按加工時間遞增排序,再按排序后的順序依次加工。3/19序號i作業(yè)編號no加工時間ti等待時間wi總時間si00505113582248123321214序號i作業(yè)編號no加工時間ti等待時間wi總時間si032021132522459305914按加工時間遞增排序系統(tǒng)總時間T=2+5+9+14=304/191 defgreedly(a): #貪心算法2 a.sort() #遞增排序3 T,w=0,0 #當前系統(tǒng)總時間和當前作業(yè)的等待時間4 foriinrange(0,len(a)):#依次處理各個作業(yè)5 T+=a[i]+w6 w+=a[i]7 returnT【算法分析】算法的執(zhí)行時間主要花費在排序上,對應的時間復雜度為O(nlog2n)。正確性證明:略。5/197.4.2帶懲罰的調(diào)度問題帶懲罰的調(diào)度問題中,通常假設n個作業(yè)加工時間均為一個時間單位,時間用0~maxd的連續(xù)整數(shù)表示,每個作業(yè)有一個截止時間(deadline用時間整數(shù)表示),當一個作業(yè)在其截止時間之后完成,對應有一個懲罰值(punish)。該問題的最優(yōu)解是最小總懲罰值。6/19貪心策略:選擇當前懲罰值最大的作業(yè)優(yōu)先加工,按懲罰值遞減排序,并且盡可能選擇作業(yè)截止時間之前最晚的時間加工。按排序后的順序依次加工。作業(yè)編號no截止時間di懲罰值pi0470126024503340413054206610days[i]表示時間i是否在加工,初始均為F選時間4,days[4]=T,不懲罰,ans=0選時間2,days[2]=T,不懲罰,ans=0選時間3,days[3]=T,不懲罰,ans=0選時間1,days[1]=T,不懲罰,ans=0時間1已占,不能加工,懲罰,ans=30時間1~4已占,不能加工,懲罰,ans=30+20=50選時間6,days[6]=T,不懲罰
ans=507/191 defgreedly(a): #貪心算法2 n=len(a)3 maxd=04 foriinrange(0,n):maxd=max(maxd,a[i][0])5 days=[False]*(maxd+1)6 a.sort(key=itemgetter(1),reverse=True)#按懲罰值遞減排序7 ans=08/198 foriinrange(0,n):9 j=a[i][0]10 whilej>0: #查找截止日期之前的空時間11 ifnotdays[j]:
#找到空時間12 days[j]=True13 print("作業(yè)[%d,%d]在第%d天完成"%(a[i][0],a[i][1],j))14 break15 j-=116 ifj==0: #沒有找到空時間17 ans+=a[i][1] #累計懲罰值18 print("不能完成作業(yè)[%d,%d],懲罰%d" %(a[i][0],a[i][1],a[i][1]))19 returnans【算法分析】上述算法有兩重循環(huán),對應的時間復雜度為O(n2)。9/197.5哈夫曼編碼7.5.1哈夫曼樹和哈夫曼編碼問題描述:設需要編碼的字符集為{d0,d1,…,dn-1},它們出現(xiàn)的頻率為{w0,w1,…,wn-1},應用哈夫曼樹構造最優(yōu)的不等長的由0、1構成的編碼方案(哈夫曼編碼)。10/19構造一棵哈夫曼樹由給定的n個權值{w0,w1,…,wn-1}構造n棵只有一個葉子結點的二叉樹,從而得到一個二叉樹的集合F={T0,T1,…,Tn-1}。在F中選取根結點的權值最小和次小的兩棵二叉樹作為左、右子樹構造一棵新的二叉樹,這棵新的二叉樹根結點的權值為其左、右子樹根結點權值之和。即合并兩棵二叉樹為一棵二叉樹。重復步驟②,當F中只剩下一棵二叉樹時,這棵二叉樹便是所要建立的哈夫曼樹。11/19利用哈夫曼樹構造的用于通信的二進制編碼稱為哈夫曼編碼。哈夫曼樹中從根到每個葉子都有一條路徑,對路徑上的各分支約定指向左子樹根的分支表示“0”碼,指向右子樹的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為和各個葉子對應的字符的編碼,這就是哈夫曼編碼。構造哈夫曼編碼12/19證明算法的正確性,也就是證明如下兩個命題是成立的。命題7.4兩個最小權值字符對應的結點x和y必須是哈夫曼樹中最深的兩個結點且它們互為兄弟。命題7.5設T是字符集C對應的一棵哈夫曼樹,結點x和y是兄弟,它們的雙親為z,顯然有wz=wx+wy,現(xiàn)刪除結點x和y,讓z變?yōu)槿~子結點,那么這棵新樹T1一定是字符集C1=C-{x,y}∪{z}的最優(yōu)樹。13/19abcde71423(a)初始cb321(b)第1次合并cbe32136(c)第2次合并a4cbe3213610(d)第3次合并a4cbe3213610d717(e)第4次合并14/19哈夫曼編碼a:10b:1111c:1110d:0e:110WPL=(1+2)×4+3×3+4×2+7×1=3600001111a4cbe3213610d71715/19問題描述:有n(1≤n≤30)塊石頭,每塊石頭的重量都是正整數(shù)(重量為1~1000)。每一回合從中選出兩塊最重的石頭,然后將它們一起粉碎。假設石頭的重量分別為x和y,且x≥y。那么粉碎的可能結果如下:如果
x=y,那么兩塊石頭都會被完全粉碎。如果
x≠y,那么重量為y的石頭將會完全粉碎,而重量為x的石頭新重量為x-y。最后最多只會剩下一塊石頭,求此石頭的重量,如果沒有石頭剩下結果為0。7.5.2實戰(zhàn)—最后一塊石頭的重量(LeetCode1046)16/19選石頭的過程與構造哈夫曼樹的過程類似,只是這里選的是兩塊最重的石頭。用優(yōu)先隊列(大根堆)求解,每次出隊兩塊最重的石頭x和y,然后將x-y進隊,直到僅有一塊石頭為止。由于heapq默認為小根堆,為此將進隊的整數(shù)加上負號,在出隊時再加上負號進行恢復,從而變?yōu)榇蟾?。?7/191 class
Solution:2
def
lastStoneWeight(self,
stones:
List[int])
->
int:3
maxpq=[]
#大根堆4
for
i
in
range(0,len(stones)):5
heapq.heappush(maxpq,-stones[i])
#所有石頭進隊6
x,y=0,07
while
maxpq:8
x=-heapq.heappop(maxpq)9
if
not
max
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司借款合同書集錦
- 勞動合同法第四條
- 國際貿(mào)易貨物買賣合同
- 交通安全統(tǒng)籌服務合同
- 醫(yī)院聘用醫(yī)師協(xié)議書
- 2025年漯河貨運資格證考試答案
- 借貸擔保合同協(xié)議5篇
- 農(nóng)場整體出租合同范本
- 買賣礦居間合同范本
- 農(nóng)村豬種出售合同范本
- 供應商開發(fā)流程及質(zhì)量要求
- 2024年技術監(jiān)督質(zhì)檢職業(yè)技能考試-電力技術監(jiān)督上崗員(中國華能)筆試歷年真題薈萃含答案
- 反假幣測試附有答案
- 怎樣調(diào)動員工積極性
- 2024年內(nèi)科護理學(第七版)期末考試復習題庫(含答案)
- 【上市公司的財務風險的分析和防范:以三只松鼠為例10000字(論文)】
- 急診科培訓急診科與其他科室的協(xié)作與溝通
- JCT414-2017 硅藻土的標準
- 肌肉注射評分標準
- 鋼結構主要技術標準和要求
- 臘八粥 第一課時自學導學單
評論
0/150
提交評論