贪心策略--16经典问题总结!
貪心算法
編號 | 題目 |
1貨郎擔 | 問題: 貨郎擔問題:假定有五個城市,已知費用矩陣如下,分別從五個城市出發,然后選取一條費用最小的線路,驗證這種算法不能得到最優解。 貪心選擇:每次選擇之前沒有走過的費用最少的路 關鍵: 1)?每次選擇費用最小的路徑走,到達后再次做出選擇,相當于一個規模小一點的TSP子問題。 2)?每次做出選擇的時候并沒有考慮以后的情況,即并沒有考慮最優子結構問題。 時間復雜度:O(n^2) 空間復雜度:O(n^2) 算法: |
2背包 | 求如下背包問題的最優解:n=7,M=15價值P={10,5,15,7,6,18,3}重量為w={2,3,5,7,1,4,1} 最優子結構:每次選取物品ti,最優取法為Sn ={t1,t2,…,tn},子問題的最優解是: Sn={t2,t3,…,tn} 貪心選擇: 當前總價值為Vm,選取重量為m,當前單位價值最大Pm的物品后,Vm+1 = Vm + m*Pm。假設選取的是重量為m,單位價值為Pm’的物品可以達到最優解,則Vm+1=Vm + m*Pm’,且使得總價值最大V’m+1 > Vm,但由于Pm >= Pm’,所以實際V’m+1<=Vm,這與假設矛盾。 時間復雜度:快排O(n^2),裝包O(n),整體O(n^2) 空間復雜度:O(n) 算法: 1.???????計算單位重量價值p1,p2,…,pm 2.???????對單位重量價值排序 3.???????初始化背包剩余載重 4.???????如果能夠完全放入,總價值?+=?當前物品重量*單位重量價值 如果只能部分放入,總價值?+=背包剩余載重*單位重量價值 5.???????如果背包剩余載重為空,算法結束 |
3 dijkstra求單源最短路徑 | 問題: 用迪杰斯特拉算法求下圖的單源最短路徑問題 貪心策略:從V-S中選擇具有最短路徑的頂點 貪心選擇: 假設存在從源點V到U長度小于D[U]的路徑,不妨設經過的點XV-S 則D[x] <= d(v,x) <d(v,x) + d(x,u) = d(v,u) <D[u],與D[u]是V-S中只經過S中 的頂點到u的最短路徑相矛盾 最優子結構: 最優子結構: 假設出現從V經老S中的其他頂點到達u,再從u到達j的新路,則D[u] + d(u,j) <D[j],這是正確的。 假設出現從V經u再到老S中其他頂點x,再到j的最短路徑,則D[u] + d(u,x) + d(x,j) < D[j],又因為D[x] <= D[u],所以D[x] + d(x,j) < D[u] + d(u,x) + d(x,j) < D[j],與D[j]是加入u后新生成的最短路徑相矛盾。 所以如果加入u后新生成的一條從源點到j的新路徑,這條新路徑是從v到j的最短路徑。 算法: 時間復雜度:優先級隊列,O(VlogV + ElogV) 空間復雜度:鄰接矩陣O(n^2),鄰接表為O(2*m+n),m為邊數 |
4prim求最小生成樹 | 用普里姆算法求下圖的最小花費生成樹,畫出生成過程。 貪心策略: 要記錄到S中的下一條邊(u,v)是一條不在S中,且使得SU{u,v}的權值之和也是最小的邊 貪心選擇: 最優解包含了權值最小的邊e1,假設不是這樣,將e1加入,則會形成環,去掉環中任意比e1大的邊,就構造了更優解,與題目矛盾。假設e2,e3,…,ek也是按照同樣方式選擇出來的邊,同樣按照該方法,可以證明ek+1也能構造出最優解 最優子結構: 設Prim算法生成的最小生成樹為T,圖G的最小生成樹是T*。 假設邊e加入到T之前,G’是G的最小生成樹的子樹,把e加入T中,G’無回路且連通,G’是G的最小生成樹,當eT*,結論成立。 假設e!T*,T*U{e}包含回路,回路中存在邊e’,令T**=T*U{e}-{e’},則T**的權<=T*的權,與T*是最小生成樹矛盾,所以T=T* 時間復雜度:O(n^2) 空間復雜度:O(n^2) ? |
5kruskal求無向帶權圖的最小生成樹 | 問題: 貪心策略: 選取屬于不同聯通分量且構成權值最小且不形成回路的兩個頂點組成的邊、 貪心選擇: 證法同第4題的貪心選擇證明 最優子結構: 算法: ? |
6dijstra求單源最短路徑 | 問題: 求圖1中所示網絡中各點距離A點的最短路徑問題。 貪心選擇: 下一條最短路徑總是由已產生的最短路徑加上一條邊形成 最優子結構: 假設P(I,j)={Vi,..,Vk,…,Vs,…,Vj}是從i到j的最短路徑,則P(I,j)=P(I,k) + P(k,s) + P(s,j),假設P(k,..,s)不是最短路徑,則存在P’(k,…,s)使得P’(I,j)=P(I,k) + P’(k,s) + P(s,j) < P(I,j),與P(I,j)是從i到j的最短路徑矛盾 算法參見第3題 |
7prim求最小生成樹 | 問題: 利用Prim算法求出圖1的最小花費生成樹,畫出生成過程 證明,算法參見第4題 ? |
8ruskal求節點網絡的最小生成樹 | 用克魯斯卡爾算法求下圖的最小花費生成樹,畫出生成過程。 證明,算法參見第5題 |
9磁帶存放 | 問題: 貪心策略: 讀取序列按照長度從小到大排列 貪心選擇: 設最優解S={l1,l2,…,li,lj,….,ln} 假設存在更優的解:S*={l1,l2,..,lj,li,…,ln} ts? = l1 + [(n-1)/n] * l2 + … + [(n-i+1)/n] * li + [(n-j+1)/n] * lj +…+(1/n) * ln ts* = l1 + [(n-1)/n] * l2 + … + [(n-i+1)/n] * lj + [(n-j+1)/n] * li +…+(1/n) * ln ts* - ts = [(j-i)/n] * lj? + [(i-j)/n] * li = [(j-i)/n] * (lj - li)? >= 0 , 即?ts* >= ts?與ts*是最優解矛盾 最優子結構: 假設已經擺放了l1,那么剩余需要擺放的磁帶為{l2,…,ln},這是原問題T的一個字問題T*,假設此時該子問題存在另一個最優解T** < T*,則T**U{l1} < T*U{l1} = T,與T是最優解矛盾 算法: 時間復雜度:O(n^2) 空間復雜度:O(n) |
10頂點覆蓋 | 問題: 令G=(V, E)是一個無向圖,G的頂點覆蓋集S是G的一個子集,使得S?V,并且E中的每一條邊至少和S中的一個頂點關聯??紤]下面尋找G的頂點覆蓋算法: 首先,按頂點度的遞減順序排序V中的頂點;接著執行下面步驟,直到所有的邊全被覆蓋;挑選度數最高的頂點,且至少和余圖中的一條邊相關聯,把這個頂點加入到頂點覆蓋集中,并刪去和這個頂點相關聯的所有邊。 設計這個算法,說明這個算法不總能得到最小頂點覆蓋集。 貪心選擇: 每次選擇把度數最高的頂點加入到覆蓋集中,刪除與該頂點相關聯的邊,更新度數。但該問題并不具有貪心選擇性質 反證法: 算法: 時間復雜度:O(n^2) 空間復雜度:O(n^2) ? |
11最大團 | 問題: 團:完全子圖 貪心策略:選擇不相鄰接的頂點中度數最小的頂點刪除。 不滿足貪心選擇: 與其他頂點不相鄰接且度數最小的頂點可能有多個,應用局部選擇不一定能得出全局最優解。 不滿足最優子結構性質: 可能刪除最優解中的點而導致全局最優解中不含有局部最優解 算法: 1初始化,令C=G 2?判斷C是否為最大團,若是,算法結束;否則轉步驟3 3?從C中刪除與其他頂點不相鄰接且度數最小的點 4?更新C,轉步驟2 時間復雜度:O(n^2) ? ? |
12無向圖著色 | 問題: 令G=(V,E)是一個無向圖,圖的著色問題是:給V中的每一個頂點賦予一種顏色,使得每一對鄰接頂點不會具有相同顏色。G的著色問題是確定為G著色所需要的最少顏色數。考慮下面的方法,令顏色為1,2,3,…,首先用顏色1為盡可能多的頂點著色,然后用顏色2為盡可能多的頂點著色,如此等等,設計這個算法,說明這個方法不總能用最少的顏色數為圖著色。 證明不能用貪心: ? 算法: 1設定頂點集合中頂點編號i,i=0 2 i++,若i<=|V|,轉3;否則,算法結束 3?令顏色編號j=0,顏色集合為CL 4 j++ 5若當前節點的所有鄰居節點都沒有使用顏色clj,則為當前頂點賦予顏色clj。轉步驟2;否則轉4 ? ? ? |
13?區間相交 | 問題: 給定x軸上n個閉區間。去掉盡可能少的閉區間,使剩下的閉區間都不相交。 最小刪除區間數量=區間數量-最大相容區間數量。 貪心策略: 每次選取右端點最小的區間做相容性判斷 貪心選擇: 設區間集為I={I1,I2,…,Ik},設最大相容區間集為R,R中第一個區間為Ik。假設k>1,那么R’=R-{Ik}U{I1},則R’也相容,也是最大相容區間集。 最優子結構: 選擇I1后,原問題變為輸入區間集為I*=I – {I1}的最大相容區間集為R’=R-{I1}的子問題,假設I’存在最優解R**,即|R**| < |R*| ,則|R**U{I1}| < |R*U{I1}| = |R|,與R是最優解矛盾 算法: 時間復雜度:O(nlogn),快排 空間復雜度:O(nlogn) ? ? |
14 | 問題: 設x1,x2,…,xn是實直線上的n個點。用固定長度的閉區間覆蓋這n個點,至少需要多少個這樣的固定長度閉區間?設計解此問題的有效算法,并證明算法的正確性。 貪心策略: 閉區間從最左向右開始覆蓋 貪心選擇: 設閉區間集合為L={l1,l2,…,lm},點序列集合為S={S1,S2,…,Sn}。選擇S1覆蓋k個節點,剩下的問題轉化為如何從L’=L-{l1}中選取最少的區間去覆蓋S’=S-{S1,S2,…,Sk} 最優子結構: 問題最優解為L={l1,l2,…,lm},子問題的最優解為Ln-k={l2,..,lm},則有Ln-kU{l1}=L 算法: 時間復雜度:O(nlogn) 空間復雜度:O(n) |
15最短服務時間 | 問題: 此問題與磁帶存放問題其實是同一個問題,證明,算法,參見第9題。 ? |
16石子合并 | 問題: 在一個操場的四周擺放著n堆石子?,F要將石子有次序地合并成一堆。規定每次至少選2堆最多選k堆石子合并成新的一堆,合并的費用為新的一堆石子數。試設計一個算法,計算出將n堆石子合并成一堆的最大總費用和最小總費用。 分析是:本質Huffman問題。 貪心選擇: 設b,c為T的最深且相鄰葉子結點,x,y是權值最小的兩個葉節點。交換b與x得T’,交換b與x,c與Y得T’’ WPL(T) – WPL(T’)=WT(b)*LT(b) + WT(x)*LT(x) – WT’(b)*LT’(b) – WT’(x)*LT’(x) ????????????? =WT(b)*LT(b) + WT(x)*LT(x) – WT(b)*LT(x) – WT(x)*LT(b) ????????????? =[WT(b)-WT(x)]*LT(b) + [WT(x) – WT(b)]*LT(x) ????????????? =[WT(b)-WT(x)]*[LT(b) – LT(x)] 因為WT(b)>=WT(x),LT(b) > LT(x),則WPL(T) – WPL(T’) >= 0,即WPL(T’) <= WPL(T) 同理可證WPL(T’’) <= WPL(T),又因為T是哈夫曼樹,所以WPL(T) <= WPL(T’’), 綜上所述WPL(T)=WPL(T’’) 最優子結構: 設T是NodeSet最大帶權路徑的二叉樹,設x,y為葉子并且互為兄弟,z是x,y的父節點,NodeSet’=T-{x,y}U{z},T’是NodeSet’的Huffman樹。 算法: 時間復雜度O(nlogn) 空間復雜度:O(n) |
總結 | ? |
轉自:https://blog.csdn.net/qingyuanluofeng/article/details/47776263
總結
以上是生活随笔為你收集整理的贪心策略--16经典问题总结!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Python编程:从入门到实践》速查表
- 下一篇: 信息服务器为什么选择在贵州,为啥云服务器