第4章 貪心算法_第1頁
第4章 貪心算法_第2頁
第4章 貪心算法_第3頁
第4章 貪心算法_第4頁
第4章 貪心算法_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第4章 貪心算法12貪心方法是一種改進了的分級處貪心方法是一種改進了的分級處理方法,它可以解決這樣的一類理方法,它可以解決這樣的一類問題:此問題有問題:此問題有n個輸入,而它個輸入,而它的解就由這的解就由這n個輸入的某個子集個輸入的某個子集組成,只是這個子集必須滿足某組成,只是這個子集必須滿足某些事先給定的條件。些事先給定的條件。 找零錢找零錢: 假如售貨員需要找給小孩假如售貨員需要找給小孩67美分的零錢?,F(xiàn)美分的零錢?,F(xiàn)在,售貨員手中只有在,售貨員手中只有25美分、美分、10美分、美分、5美分和美分和1美美分的硬幣。在小孩的催促下,售貨員想盡快將錢找分的硬幣。在小孩的催促下,售貨員想盡快將錢

2、找給小孩。她的做法是:先找不大于給小孩。她的做法是:先找不大于67美分的最大硬美分的最大硬幣幣25美分硬幣,再找不大于美分硬幣,再找不大于672542美分的最美分的最大硬幣大硬幣25美分硬幣,再找不大于美分硬幣,再找不大于422517美分的美分的最大硬幣最大硬幣10美分硬幣,再找不大于美分硬幣,再找不大于17107美分美分的最大硬幣的最大硬幣5美分硬幣,最后售貨員再找出兩個美分硬幣,最后售貨員再找出兩個1美美分的硬幣。至此,售貨員共找給小孩分的硬幣。至此,售貨員共找給小孩6枚硬幣。售貨枚硬幣。售貨員的原則是拿盡可能少的硬幣個數(shù)找給小孩。從另員的原則是拿盡可能少的硬幣個數(shù)找給小孩。從另一個角度看

3、,如果售貨員將撿出的硬幣逐一放在手一個角度看,如果售貨員將撿出的硬幣逐一放在手中,最后一起交給小孩,那么售貨員想使自己手中中,最后一起交給小孩,那么售貨員想使自己手中的錢數(shù)增加的盡量快些,所以每一次都盡可能地撿的錢數(shù)增加的盡量快些,所以每一次都盡可能地撿面額大的硬幣。面額大的硬幣。3第4章 貪心算法 顧顧名思義,貪心算法總是作出在當前看來最名思義,貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上的慮,它所作出的選擇只是在某種意義上的局部最局部最優(yōu)優(yōu)選擇。當然,希望貪心算法得到的最終結果也選擇。當然

4、,希望貪心算法得到的最終結果也是整體最優(yōu)的。雖然貪心算法不能對所有問題都是整體最優(yōu)的。雖然貪心算法不能對所有問題都得到整體最優(yōu)解,但對許多問題它能產生整體最得到整體最優(yōu)解,但對許多問題它能產生整體最優(yōu)解。如單源最短路經問題,最小生成樹問題等。優(yōu)解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優(yōu)在一些情況下,即使貪心算法不能得到整體最優(yōu)解,其最終結果卻是最優(yōu)解的很好近似。解,其最終結果卻是最優(yōu)解的很好近似。4第4章 貪心算法本章主要知識點: 4.1 活動安排問題 4.2 貪心算法的基本要素 4.3 最優(yōu)裝載 4.4 哈夫曼編碼 4.5 單源最短路徑 4.6 最小

5、生成樹 4.7 多機調度問題 4.8 貪心算法的理論基礎54.1 活動安排問題 活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心算法提供了一個簡單、漂亮的方法使得盡可能多的活動能兼容地使用公共資源。64.1 活動安排問題7 設有n個活動的集合E=1,2,n,其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si fi 。如果選擇了活動i,則它在半開時間區(qū)間si, fi)內占用資源。若區(qū)間

6、si, fi)與區(qū)間sj, fj)不相交,則稱活動i與活動j是相容的。也就是說,當sifj或sjfi時,活動i與活動j相容。 解決這個問題的基本思路是在安排時應該解決這個問題的基本思路是在安排時應該將結束時間早的活動盡量往前安排,好給將結束時間早的活動盡量往前安排,好給后面的活動留出更多的空間,從而達到安后面的活動留出更多的空間,從而達到安排最多活動的目標。排最多活動的目標。 在貪心算法中,將各項活動的開始時間和在貪心算法中,將各項活動的開始時間和結束時間分別用兩個數(shù)組結束時間分別用兩個數(shù)組s和和f存儲,并使得存儲,并使得數(shù)組中元素的順序按結束時間非減排列:數(shù)組中元素的順序按結束時間非減排列:

7、f1 f2 fn。84.1 活動安排問題在下面所給出的解活動安排問題的貪心算法greedySelectorgreedySelector :9各活動的起始時間和結各活動的起始時間和結束時間存儲于數(shù)組束時間存儲于數(shù)組s s和和f f中且按結束時間的非減中且按結束時間的非減序排列序排列 templatevoid GreedySelector(int n, Type s, Type f, bool A) A1=true; int j=1; for (int i=2;i=fj) Ai=true; j=i; else Ai=false; 4.1 活動安排問題 由于輸入的活動以其完成時間的非減序非減序排列,

8、所以算法greedySelectorgreedySelector每次總是選擇具有最早具有最早完成時間完成時間的相容活動加入集合A中。直觀上,按這種方法選擇相容活動為未安排活動留下盡可能多的時間。也就是說,該算法的貪心選擇的意義是使剩使剩余的可安排時間段極大化余的可安排時間段極大化,以便安排盡可能多的相容活動。 算法greedySelectorgreedySelector的效率極高。當輸入的活動已按結束時間的非減序排列,算法只需O(n)O(n)的時間安排n個活動,使最多的活動能相容地使用公共資源。如果所給出的活動未按非減序排列,可以用O(nlogn)O(nlogn)的時間重排。 10 例子 設待

9、安排的11個活動的開始時間和結束時間按結束時間的非減次序排列如下: 11k1234567891011s2fk4567891011121314 解集合為 1,4,8,11.容易證明算法 greedySelector所得到的解是最優(yōu)解。4.1 活動安排問題 算算法法greedySelector greedySelector 的計算過程的計算過程如左圖所示。圖中每行相應于算法的一次迭代。陰影長條表示的活動是已選入集合A的活動,而空白長條表示的活動是當前正在檢查相容性的活動。 若被檢查的活動i的開始時間Si小于最近選擇的活動j的結束時間fi,則不選擇活動i,否則選擇活動i加入

10、集合A中。 124.1 活動安排問題 貪心算法并不總能求得問題的整整體最優(yōu)解體最優(yōu)解。但對于活動安排問題,貪心算法greedySelector卻總能求得的整體最優(yōu)解,即它最終所確定的相容活動集合A的規(guī)模最大。這個結論可以用數(shù)學歸納法證明。134.2 貪心算法的基本要素 本節(jié)著重討論可以用貪心算法求解的問題的一般特征。 對于一個具體的問題,怎么知道是否可用貪心算法解此問題,以及能否得到問題的最優(yōu)解呢?這個問題很難給予肯定的回答。 但是,從許多可以用貪心算法求解的問題中看到這類問題一般具有2個重要的性質:貪心選擇貪心選擇性質性質和最優(yōu)子結構性質最優(yōu)子結構性質。 144.2 貪心算法的基本要素1.1

11、.貪心選擇性質貪心選擇性質 所謂貪心選擇性質貪心選擇性質是指所求問題的整體最優(yōu)解整體最優(yōu)解可以通過一系列局部最優(yōu)局部最優(yōu)的選擇,即貪心選擇來達到。這是貪心算法可行的第一個基本要素,也是貪心算法與動態(tài)規(guī)劃算法的主要區(qū)別。 動態(tài)規(guī)劃算法通常以自底向上自底向上的方式解各子問題,而貪心算法則通常以自頂向下自頂向下的方式進行,以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化為規(guī)模更小的子問題。 對于一個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終導致問題的整體最優(yōu)解。154.2 貪心算法的基本要素2.2.最優(yōu)子結構性質最優(yōu)子結構性質 當一個問題的最優(yōu)解包含其子

12、問題的最優(yōu)解時,稱此問題具有最優(yōu)子結構性質最優(yōu)子結構性質。問題的最優(yōu)子結構性質是該問題可用動態(tài)規(guī)劃算法或貪心算法求解的關鍵特征。 164.2 貪心算法的基本要素3.3.貪心算法與動態(tài)規(guī)劃算法的差異貪心算法與動態(tài)規(guī)劃算法的差異 貪心算法和動態(tài)規(guī)劃算法都要求問題具有最優(yōu)子結構性質,這是2類算法的一個共同點。但是,對于具有最優(yōu)子結構最優(yōu)子結構的問題應該選用貪心算法還是動態(tài)規(guī)劃算法求解?是否能用動態(tài)規(guī)劃算法求解的問題也能用貪心算法求解?下面研究2個經典的組合優(yōu)化問題組合優(yōu)化問題,并以此說明貪心算法與動態(tài)規(guī)劃算法的主要差別。174.2 貪心算法的基本要素0-10-1背包問題:背包問題: 給定n種物品和一

13、個背包。物品i的重量是Wi,其價值為Vi,背包的容量為C。應如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?18 在選擇裝入背包的物品時,對每種物品在選擇裝入背包的物品時,對每種物品i i只有只有2 2種選擇,即裝入背包或不裝入背包。不種選擇,即裝入背包或不裝入背包。不能將物品能將物品i i裝入背包多次,也不能只裝入部分裝入背包多次,也不能只裝入部分的物品的物品i i。4.2 貪心算法的基本要素 背包問題:背包問題: 與0-1背包問題類似,所不同的是在選擇物品i裝入背包時,可以選擇物品可以選擇物品i i的一部分的一部分,而不一定要全部裝入背包,1in。19 這2類問題都具有最優(yōu)子結構最

14、優(yōu)子結構性質,極為相似,但背包問題可以用貪心算法求解,而0-1背包問題卻不能用貪心算法求解。 背包問題: 已知容量為M的背包和n件物品。第i件物品的重量為wi,價值是vi。因而將物品i的一部分xi放進背包即獲得vixi的價值。問題是:怎樣裝包使所獲得的價值最大。即是如下的優(yōu)化問題:20niiix1vmaxniwxMxwiiiniii1, 0, 0v, 101 采用貪心方法,有幾種原則可循: a.每次撿最輕的物品裝每次撿最輕的物品裝; b.每次撿價值最大的裝每次撿價值最大的裝; c.每次裝包時既考慮物品的重量又考慮物品的價值,每次裝包時既考慮物品的重量又考慮物品的價值,也就是說每次撿單位價值最大

15、的裝。也就是說每次撿單位價值最大的裝。 按原則a來裝只考慮到多裝些物品,但由于單位價值未必高,總價值不能達到最大;按原則b來裝,每次選擇的價值最大,但同時也可能占用了較大的空間,裝的物品少,未必能夠達到總價值最大。比較合理的原則是c。事實上,按照原則c來裝,確實能夠達到總價值最大。 21對于一個給定的問題,初看起來,往往有若干種貪心準則可選,但在實際上,其中的多數(shù)都不能使貪心算法達到問題的最優(yōu)解。如背包問題下面的實例:n=3, M=20, v=(25, 24, 15), w=(18,15,10)考察以上的三種貪心準則。2223如果以價值最大為貪心準則,則貪心算法的執(zhí)如果以價值最大為貪心準則,則

16、貪心算法的執(zhí)行過程是:行過程是:首先考慮將物品1裝包,此時獲得效益值25,包的剩余容量是2。然后考慮將物品2裝包,但物品2的重量15超出包的剩余容量,只能裝入該種物品的2/15,效益值242/153.2。此時獲得的總效益值為25+3.2=28.2。這樣得到的可行解(1,2/15,0)并不是最優(yōu)解。24如果以物品的重量為貪心準則:如果以物品的重量為貪心準則:首先考慮將物品3裝包,此時獲得效益15,包的剩余重量為201010,此時考慮將物品2裝包,因為物品2重量1510,所以只能將物品2的2/3裝入,此時效益242/316,因此總效益值為151631,按此過程得解(0,2/3,1) 首首先考慮單位

17、價值大的物品裝包,即將物品先考慮單位價值大的物品裝包,即將物品2 2裝裝包,此時獲得效益值包,此時獲得效益值2424,背包的剩余容量是,背包的剩余容量是5 5。 然然后考慮裝物品后考慮裝物品3 3,只能裝入該物品,只能裝入該物品5/15/10 0=1/2=1/2, , 所得的總的效益值為所得的總的效益值為24+15/2=31.524+15/2=31.5。按此過程得解。按此過程得解(0 0,1 1,1/21/2)比前面的裝法的效益值大。)比前面的裝法的效益值大。實踐證明,實踐證明,選擇能產生最優(yōu)解的貪心準則是設計貪心算法的核心選擇能產生最優(yōu)解的貪心準則是設計貪心算法的核心問題。問題。25 如如果

18、以單位價值最大為貪心準則,則貪果以單位價值最大為貪心準則,則貪心算法的執(zhí)行過程是心算法的執(zhí)行過程是: 先先計算出各個物品的單位價值計算出各個物品的單位價值(25/18, 24/15, 15/10)=(1.389, 1.6, 1.5)。4.2 貪心算法的基本要素用貪心算法解背包問題的基本步驟:用貪心算法解背包問題的基本步驟: 首先計算每種物品單位重量的價值Vi/Wi,然后,依貪心選擇策略,將盡可能多的單位重量價值單位重量價值最高最高的物品裝入背包。若將這種物品全部裝入背包后,背包內的物品總重量未超過C,則選擇單位重量價值次高的物品并盡可能多地裝入背包。依此策略一直地進行下去,直到背包裝滿為止。

19、具體算法可描述如下頁: 2627 算法算法knapsackknapsack的主要計算時間在的主要計算時間在于將各種物品依其于將各種物品依其單位重量的價值從單位重量的價值從大到小排序。因此,大到小排序。因此,算法的計算時間上算法的計算時間上界為界為O O(nlognnlogn)。當然,)。當然,為了證明算法的正為了證明算法的正確性,還必須證明確性,還必須證明背包問題具有貪心背包問題具有貪心選擇性質選擇性質。float Knapsack(int n,float M,float v,float w,float x) Sort(n,v,w); int i; for (i=1;i=n;i+) xi=0;

20、 float c=M,opt=0; for (i=1;ic) break; xi=1; opt+=vi; c-=wi; if (i=n) xi=c/wi; opt+=xi*vi; return opt;4.2 貪心算法的基本要素 對于0-10-1背包問題背包問題,貪心選擇之所以不能得到最優(yōu)解是因為在這種情況下,它無法保證最終能將背包裝滿,部分閑置的背包空間使每公斤背包空間的價值降低了。事實上,在考慮0-1背包問題時,應比較選擇該物品和不選擇該物品所導致的最終方案,然后再作出最好選擇。由此就導出許多互相重疊的子問題。這正是該問題可用動態(tài)動態(tài)規(guī)劃算法規(guī)劃算法求解的另一重要特征。 實際上也是如此,動

21、態(tài)規(guī)劃算法的確可以有效地解0-1背包問題。 284.3 最優(yōu)裝載 有一批集裝箱要裝上一艘載重量為c的輪船。其中集裝箱i的重量為Wi。最優(yōu)裝載問題要求確定在裝載體積不受限制的情況下,將盡可能多的集裝箱裝上輪船。1.1.算法描述算法描述最優(yōu)裝載問題可用貪心算法求解。采用重量最輕者先裝的貪心選擇策略,可產生最優(yōu)裝載問題的最優(yōu)解。具體算法描述如下頁。 2930templatevoid Loading(int x, Type w, Type c, int n) int *t = new int n+1; Sort(w, t, n); for (int i = 1; i = n; i+) xi = 0;

22、for (int i = 1; i = n & wti = c; i+) xti = 1; c -= wti;4.3 最優(yōu)裝載2.2.貪心選擇性質貪心選擇性質 可以證明最優(yōu)裝載問題具有貪心選擇性質。 3.3.最優(yōu)子結構性質最優(yōu)子結構性質最優(yōu)裝載問題具有最優(yōu)子結構性質。由最優(yōu)裝載問題的貪心選擇性質和最優(yōu)子結構性質,容易證明算法loadingloading的正確性。算法loadingloading的主要計算量在于將集裝箱依其重量從小到大排序,故算法所需的計算時間為 O(nlogn)O(nlogn)。 314.4 哈夫曼編碼哈夫曼編碼哈夫曼編碼是廣泛地用于數(shù)據文件壓縮的十分有效的編碼方法。其壓縮率通

23、常在20%90%之間。哈夫曼編碼算法用字符在文件中出現(xiàn)的頻率表來建立一個用0,1串表示各字符的最優(yōu)表示方式。 給出現(xiàn)頻率高的字符較短的編碼,出現(xiàn)頻率較低的字符以較長的編碼,可以大大縮短總碼長。1.1.前綴碼前綴碼對每一個字符規(guī)定一個0,1串作為其代碼,并要求任一字符的代碼都不是其他字符代碼的前綴。這種編碼稱為前綴碼前綴碼。324.4 哈夫曼編碼 編碼的前綴性質可以使譯碼方法非常簡單。 表示最優(yōu)前綴碼最優(yōu)前綴碼的二叉樹總是一棵完全二叉樹完全二叉樹,即樹中任一結點都有2個兒子結點。平均碼長平均碼長定義為:使平均碼長達到最小的前綴碼編碼方案稱為給定編碼字符集C的最優(yōu)前綴碼最優(yōu)前綴碼。33)()()(

24、cdcfTBTCc 八種字符,其頻率分別為:0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11字符頻率字符頻率編碼編碼0.050.0501100.290.29100.070.0711100.080.0811110.140.141100.230.23000.030.0301110.110.1101034532311178291400000001111114.4 哈夫曼編碼2.2.構造哈夫曼編碼構造哈夫曼編碼哈夫曼提出構造最優(yōu)前綴碼的貪心算法,由此產生的編碼方案稱為哈夫曼編碼哈夫曼編碼。哈夫曼算法以自底向上的方式構造表示最優(yōu)前綴碼的二叉樹T。算法以|C|個葉結點開始,執(zhí)

25、行|C|1次的“合并”運算后產生最終所要求的樹T。 354.4 哈夫曼編碼 在書上給出的算法huffmanTree中,編碼字符集中每一字符c的頻率是f(c)。以以f f為鍵值的優(yōu)先隊為鍵值的優(yōu)先隊列列Q Q用在貪心選擇貪心選擇時有效地確定算法當前要合并的2棵具有最小頻率的樹。一旦2棵具有最小頻率的樹合并后,產生一棵新的樹,其頻率為合并的2棵樹的頻率之和,并將新樹插入優(yōu)先隊列Q。經過n1次的合并后,優(yōu)先隊列中只剩下一棵樹,即所要求的樹T。算法huffmanTree用最小堆實現(xiàn)優(yōu)先隊列Q。初始化優(yōu)先隊列需要O(n)計算時間,由于最小堆的removeMin和put運算均需O(logn)時間,n1次的

26、合并總共需要O(nlogn)計算時間。因此,關于n個字符的哈夫曼算法的計算時間計算時間為O(nlogn) 。364.4 哈夫曼編碼3.3.哈夫曼算法的正確性哈夫曼算法的正確性要證明哈夫曼算法的正確性,只要證明最優(yōu)前綴碼問題具有貪心選擇性質貪心選擇性質和最優(yōu)子結構性質最優(yōu)子結構性質。(1)貪心選擇性質(2)最優(yōu)子結構性質374.5 單源最短路徑給定帶權有向圖G =(V,E),其中每條邊的權是非負實數(shù)。另外,還給定V中的一個頂點,稱為源源?,F(xiàn)在要計算從源到所有其他各頂點的最短路長度最短路長度。這里路的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題單源最短路徑問題。1.1.算法基本思想算法

27、基本思想Dijkstra算法是解單源最短路徑問題的貪心算法。384.5 單源最短路徑其基本思想基本思想是,設置頂點集合S并不斷地作貪心選擇貪心選擇來擴充這個集合。一個頂點屬于集合S當且僅當從源到該頂點的最短路徑長度已知。初始時,S中僅含有源。設u是G的某一個頂點,把從源到u且中間只經過S中頂點的路稱為從源到u的特殊路徑,并用數(shù)組dist記錄當前每個頂點所對應的最短特殊路徑長度。Dijkstra算法每次從V-S中取出具有最短特殊路長度的頂點u,將u添加到S中,同時對數(shù)組dist作必要的修改。一旦S包含了所有V中頂點,dist就記錄了從源到所有其他頂點之間的最短路徑長度。394.5 單源最短路徑例

28、如例如,對右圖中的有向圖,應用Dijkstra算法計算從源頂點1到其他頂點間最短路徑的過程列在下頁的表中。404.5 單源最短路徑迭代迭代S Su udist2dist2 dist3dist3 dist4dist4 dist5dist5初始初始1-10maxint301001 11,221060301002 21,2,44105030903 31,2,4,33105030604 41,2,4,3,551050306041Dijkstra算法的迭代過程: 4.5 單源最短路徑2.2.算法的正確性和計算復雜性算法的正確性和計算復雜性(1)貪心選擇性質(2)最優(yōu)子結構性質(3)計算復雜性對于具有n個

29、頂點和e條邊的帶權有向圖,如果用帶權鄰接矩陣表示這個圖,那么Dijkstra算法的主循環(huán)體需要 時間。這個循環(huán)需要執(zhí)行n-1次,所以完成循環(huán)需要 時間。算法的其余部分所需要時間不超過 。42)(nO)(2nO)(2nO4.6 最小生成樹 設G =(V,E)是無向連通帶權圖,即一個網絡網絡。E中每條邊(v,w)的權為cvw。如果G的子圖G是一棵包含G的所有頂點的樹,則稱G為G的生成樹。生成樹上各邊權的總和稱為該生成樹的耗費耗費。在G的所有生成樹中,耗費最小的生成樹稱為G的最小生成樹最小生成樹。網絡的最小生成樹在實際中有廣泛應用。例如例如,在設計通信網絡時,用圖的頂點表示城市,用邊(v,w)的權c

30、vw表示建立城市v和城市w之間的通信線路所需的費用,則最小生成樹就給出了建立通信網絡的最經濟的方案。 434.6 最小生成樹1.1.最小生成樹性質最小生成樹性質用貪心算法設計策略可以設計出構造最小生成樹的有效算法。本節(jié)介紹的構造最小生成樹的PrimPrim算法算法和KruskalKruskal算法算法都可以看作是應用貪心算法設計策略的例子。盡管這2個算法做貪心選擇的方式不同,它們都利用了下面的最小生成樹性質最小生成樹性質:設G=(V,E)是連通帶權圖,U是V的真子集。如果(u,v)E,且uU,vV-U,且在所有這樣的邊中,(u,v)的權cuv最小,那么一定存在G的一棵最小生成樹,它以(u,v)

31、為其中一條邊。這個性質有時也稱為MSTMST性質性質。 444.6 最小生成樹2.Prim2.Prim算法算法 設G=(V,E)是連通帶權圖,V=1,2,n。構造G的最小生成樹的Prim算法的基本思想基本思想是:首先置S=1,然后,只要S是V的真子集,就作如下的貪心選貪心選擇擇:選取滿足條件iS,jV-S,且cij最小的邊,將頂點j添加到S中。這個過程一直進行到S=V時為止。在這個過程中選取到的所有邊恰好構成G的一棵最小最小生成樹生成樹。 454.6 最小生成樹利用最小生成樹性質和數(shù)學歸納法容易證明,上述算法中的邊集合邊集合T T始終始終包含包含G G的某棵最小生成樹中的某棵最小生成樹中的邊的

32、邊。因此,在算法結束時,T中的所有邊構成G的一棵最小生成樹。 例如例如,對于右圖中的帶權圖,按PrimPrim算法算法選取邊的過程如下頁圖所示。464.6 最小生成樹474.6 最小生成樹在上述Prim算法中,還應當考慮如何有效地找出滿如何有效地找出滿足條件足條件i i S,jS,j V-SV-S,且權,且權cijcij最小的邊最小的邊(i,j)(i,j)。實現(xiàn)這個目的的較簡單的辦法是設置2個數(shù)組closest和lowcost。在Prim算法執(zhí)行過程中,先找出V-S中使lowcost值最小的頂點j,然后根據數(shù)組closest選取邊(j,closestj),最后將j添加到S中,并對closest和lowcost作必要的修改。用這個辦法實現(xiàn)的Prim算法所需的計算時間計算時間為 48)(2nO4.6 最小生成樹3.Kruskal3.Kruskal算法算法Kruskal算法構造G的最小生成樹的基本思想基本思想是,首先將G

溫馨提示

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

評論

0/150

提交評論