收藏 分享(赏)

合并排序演算法(续).ppt

上传人:天天快乐 文档编号:1207565 上传时间:2018-06-18 格式:PPT 页数:103 大小:4.39MB
下载 相关 举报
合并排序演算法(续).ppt_第1页
第1页 / 共103页
合并排序演算法(续).ppt_第2页
第2页 / 共103页
合并排序演算法(续).ppt_第3页
第3页 / 共103页
合并排序演算法(续).ppt_第4页
第4页 / 共103页
合并排序演算法(续).ppt_第5页
第5页 / 共103页
点击查看更多>>
资源描述

1、分治演算法與刪尋演算法,各個擊破與化整為零,2.1 分治演算法基本概念,2,分治解題策略,分治(divide and conquer)演算法使用分治解題策略解決問題。分治是很好的解題策略,可以很有效率的解決問題,又稱為分割再征服策略或各個擊破策略。一般而言,分治演算法具有三個階段:分割階段:如果問題規模很小,就直接解決此問題;否則,將原本的問題分割(divide)成2個或多個子問題(subproblem)。克服階段:用相同的演算法遞迴地(recirsively)解決或克服(conquer)所有的子問題。合併階段:合併(merge)所有子問題的解答成為原本問題的解答。,3,使用分治解題策略的演算

2、法,合併排序演算法快速排序演算法缺陷棋盤填滿演算法二維求秩演算法二維極大點演算法最近二維點對演算法,4,2.2 合併排序演算法,5,合併排序演算法,在本單元中,我們介紹使用分治解題策略的合併排序(merge sort) 演算法。合併排序演算法由現代電腦之父,內儲程式(stored program)電腦架構發明之人之一的紐曼博士, 在西元1945 年發明。,約翰馮紐曼(John von Neumann,1903年12月28日1957年2月8日),出生於匈牙利的美國籍猶太人數學家,現代電腦創始人之一。他在電腦科學、經濟、物理學中的量子力學及幾乎所有數學領域都作過重大貢獻。(圖及說明摘自維基百科),

3、6,合併排序演算法(續),假設我們要使用合併排序演算法來將陣列A 中的n 個元素或資料(索引為0,.,n1) 依照其值以由小而大的次序排列分割: 若陣列A 只有一個元素,代表陣列已排序完成;否則將陣列分割成兩個大小相等的子陣列。克服: 遞迴地排序兩個子陣列。合併: 最後合併兩個已完成排序的子陣列,即可完成原來陣列的排序。合併排序演算法如Algorithm 6 (MergeSort)所示,而在此演算法中另外使用到如Algorithm 7所示的Merge演算法以合併二個子陣列。,7,合併排序演算法(續),8,合併排序演算法(續),9,合併排序演算法(續),我們以下頁圖中的實例來看合併排序演算法的運

4、作過程:假設有一個陣列具有8 個元素85、24、63、50、17、31、96、50,索引(index) 為0,.,7,其中50 與50二個元素的值都是50,但是為了區別起見,我們將之標示為50 與50。,10,合併排序演算法(續),11,合併排序演算法(續),在整個合併排序演算法的執行過程中,50 與50的相對位置一直保持不變,因此如同氣泡排序與插入排序演算法一樣,合併排序演算法也是一個穩定(stable) 排序演算法。合併排序演算法需要額外的與原來陣列大小相同的記憶體空間來輔助排序的進行,因此合併排序演算法不是就地(in place) 演算法,它的空間複雜度為O(n),n 為需要排序陣列的元

5、素個數。,12,合併排序演算法(續),以下我們分析合併排序演算法的時間複雜度。假設合併排序演算法將一個具有n 個元素的陣列排序完畢的時間複雜度為T(n),則我們可以得到以下的式子:T(n)=2T(n/2)+n這是因為合併排序演算法直接將陣列分割為二個大小相同或幾乎相同的陣列(大小為或約為原來陣列大小1/2) ,並分別遞迴地以相同的演算法將二個子陣列加以排序(因此有2T(n/2) 項目),最後,再使用n 次比較操作將二個子陣列合併。,13,合併排序演算法(續),我們遞迴地將T(n)=2T(n/2)+n中的n取代為n/2, n/4, .,則我們可以得到:T(n) = 2T(n/2) + n = 2

6、(2T(n/4)+(n/2) + n = 4T(n/4) + n + n= 4(2T(n/8)+(n/4) + 2n= 8T(n/8) + 3n = . = 2k T(n/2k) + kn當陣列只有一個元素時,合併排序演算法不會再進行遞迴呼叫,會直接回轉(return),因此我們可得T(1) = 1。,14,合併排序演算法(續),假設n = 2k,則k = log2 n。請注意,未來若我們不特別指定log函數的基底,則代表基底為2。代入k = log n,我們可得:T(n) = n log n + 2k = n log n + n = O(n log n)對所有的狀況(最佳、最差與平均狀況)

7、而言,合併排序演算法的時間複雜度都是O(n log n)。,15,2.3 快速排序演算法,16,快速排序演算法,以下我們首先介紹快速排序(quick sort)演算法。此演算法由獲得計算機領域最高榮譽圖靈獎(Turing Award)的Hoare博士於1962年發表。如其名稱所示,此排序演算法的排序速度相當快,因此使用相當廣泛。,查爾斯安東尼理察霍爾爵士(Charles Antony Richard Hoare,縮寫為 C. A. R. Hoare,1934年1月11日 ),生於斯里蘭卡可倫坡,英國計算機科學家,圖靈獎得主。他設計了可快速進行排序程序的快速排序(quick sort)演算法,提

8、出可驗證程式正確性的霍爾邏輯(Hoare logic) 、以及提出可訂定並時程序(concurrent process)的交互作用(如哲學家用餐問題(dining philosophers problem)的交談循序程續(CSP, Communicating Sequential Processes)架構 。 (圖及說明摘自維基百科),17,快速排序演算法(續),快速排序演算法使用分治解題策略,其做法如下所述:分割: 選一個元素p當作中樞(pivot)元素將陣列分割為2部份:SP及LP,其中SP (smaller part)包含所有小於或等於p的元素;而LP(larger part)則包含所有

9、大於p的元素。克服:完成陣列分割(partition)之後,快速排序演算法持續遞迴地(recursively)進行SP部份與LP部份的元素排序。合併: 最後再將SP、p及LP合併即可完成排序。,18,快速排序演算法(續),Algorithm 8為快速排序演算法,此演算法使用二個指標(左指標l 與右指標r) 將陣列中索引在左界lb 及右界rb 範圍內的元素分割為二部份。,19,快速排序演算法(續),20,快速排序演算法(續),以下我們舉實例來看快速排序演算法的運作過程。假設有一個陣列具有8個元素85、24、63、50、17、50、96、58 ,索引(index)為0,.,7,其中50與50二個元

10、素的值都是50,但是為了區別起見,我們將之標示為50與50。下圖展示快速排序演算法第一次將陣列分割為二個部份的過程。,21,快速排序演算法(續),22,快速排序演算法(續),在整個快速排序演算法的執行過程中,50與50的相對位置產生變化,因此快速排序演算法不是一個穩定(stable)排序演算法。 快速排序演算法不需要額外的記憶體空間來輔助排序的進行,因此快速排序演算法是就地(in place)演算法,它的空間複雜度為O(1)。,23,快速排序演算法(續),以下我們分析快速排序演算法的時間複雜度。在最佳狀況下,快速排序演算法每次都將陣列分割為二個大小相同或幾乎相同的子陣列(我們可以將分割後的二個

11、子陣列都視為是原陣列的1/2大小) 。假設利用快速排序演算法針對具有n 個元素的陣列(也就是說輸入規模為n) 進行排序的時間複雜度為T(n),針對最佳狀況,我們可以得到以下的式子:T(n)=n+2T(n/2) 這是因為當指標l 持續往右移,而同時指標r 持續往左移而交叉時(也就是說l r 時),代表陣列分割完成。指標每次移動一個位置需要一次的數值比較操作,因此要完成陣列分割需要執行n 次數值比較操作。而陣列分割完成之後,快速排序演算法就利用遞迴的方式分別完成二個大小相同的(均為n/2) 子陣列排序。如合併排序演算法的分析一樣,我們可得 T(n)=O(n log n),24,快速排序演算法(續)

12、,以下我們分析快速排序演算法的最差狀況時間複雜度。當陣列的n 個元素已經依由小而大的方式排列的情況下會產生最差狀況。在此情況下,快速排序演算法首先在經過n 次數值比較操作之後,將陣列分割為單一一個所有元素都比中樞元素小,具有n 1 個元素的子陣列。經過遞迴呼叫,快速排序演算法再利用n 1 次數值比較操作將陣列分割為單一一個所有元素都比新中樞元素小,具有n 2 個元素的子陣列。如此不斷遞迴執行,直到陣列分割出僅包含一個元素的子陣列為止。同樣假設快速排序演算法的時間複雜度為T(n),針對最差狀況,我們可以得到以下的式子:T(n) = n + (n 1) + (n 2) + . + 1 =n(n 1

13、)/2= O(n2),25,快速排序演算法(續),26,快速排序演算法(續),27,快速排序演算法(續),n-1, n-2,1,28,快速排序演算法(續),29,排序演算法比較,30,2.4 缺陷棋盤填滿演算法,31,缺陷棋盤填滿演算法使用分治策略解決缺陷棋盤填滿問題,使用三格骨牌填滿缺陷棋盤以下我們先定義甚麼是棋盤、缺陷棋盤及三格骨牌然後我們定義缺陷棋盤填滿問題最後我們介紹缺陷棋盤填滿演算法,缺陷棋盤填滿演算法說明,32,棋盤的定義,一個棋盤是一個 n x n方格(grid),具有n2個單格(cell),其中n2而且n是2的幂(a power a 2),33,缺陷棋盤是有一單格(cell)無

14、法使用的棋盤。,缺陷棋盤的定義,34,三格骨牌的定義,三格骨牌(Triomino)為一L型骨牌,可填滿一棋盤上的3個單格。三格骨牌有4種方向。,35,缺陷棋盤填滿問題,放置(n2 - 1)/3 個三格骨牌在n x n缺陷棋盤上,使得全部(n2 1)個非缺陷單格都被填滿。,36,Algorithm 缺陷棋盤填滿演算法Input: n x n缺陷棋盤, n2而且n是2的幂Output: 以三格骨牌填滿的n x n缺陷棋盤步驟1: 若n=2,則旋轉一個三格骨牌直接填滿缺陷棋盤,回傳此2 x 2缺陷棋盤並結束。步驟2: 將缺陷棋盤分為3個(n/2) x (n/2)棋盤及1個(n/2) x (n/2)缺

15、陷棋盤,旋轉一個三格骨牌填滿3個棋盤中相鄰的單格,可使3個棋盤成為缺陷棋盤,我們可得4個(n/2) x (n/2)缺陷棋盤。步驟3: 遞迴地使用缺陷棋盤填滿演算法以三格骨牌填滿步驟2的4個(n/2) x (n/2)缺陷棋盤,回傳原始n x n缺陷棋盤並結束。,缺陷棋盤填滿演算法,37,缺陷棋盤填滿演算法實例,將8 x 8缺陷棋盤分割成4個更小的 4 x 4 棋盤。,其中1個為4 x 4缺陷棋盤,其他3個為一般 4 x 4 棋盤。,38,放置1個三格骨牌在3個4 x 4正常棋盤的相鄰單格,讓他們也變成缺陷棋盤。,再以遞迴方式填滿4個缺陷4 x 4棋盤。,缺陷棋盤填滿演算法實例(續),39,缺陷棋

16、盤填滿演算法實例(續),以遞迴方式填滿右上角之缺陷4 x 4棋盤。,以遞迴方式填滿左上角之缺陷4 x 4棋盤.。,40,2.5 二維求秩演算法,41,二維求秩演算法說明,二維求秩(2D rank finding)演算法使用分治策略解決二維求秩問題以下我們先定義支配(dominate)及秩(rank)然後我們定義二維求秩問題最後我們介紹二維求秩演算法,42,支配及秩的定義,令A = (ax, ay), B = (bx, by)為二維XY平面上的點,則我們說A支配(dominate)B(記為AB)若且唯若 ax bx 且 ay by。給定一個由二維平面點所構成的集合S,點A之秩(rank)定義為集

17、合S中有多少個點被A所支配。,E.G.: BA, CA, DC, EA,E.G.: rank(A)=0, rank(B)=1, rank(C)=1, rank(D)=2, rank(E)=2,43,二維求秩問題,給定一個由n個二維平面點所構成的集合S,求出S中所有點的秩。可以用窮舉(exhaustive)演算法,比較所有的可能成對點,時間複雜度為O(n2)。,44,Algorithm 二維求秩演算法Input: n個二維平面點所構成的集合S,n1Output: 集合S中所有點的秩(rank)步驟1: 若n=1,則回傳S中唯一一個點的秩為0並結束。步驟2: 找出所有點的X軸中位數(median)

18、畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟3: 遞迴地使用二維求秩演算法分別求出SL與SR中所有點的秩。步驟4: 根據Y軸值排序所有在S(S=SLSR)中的點,依序掃描所有點且求出每一個在SR的點i排在多少在SL的點的後面(記為updatei),並將點i的秩加上updatei;最後回傳S中所有點的秩並結束。,二維求秩演算法,45,二維求秩演算法範例,假定給定平面上10個點,依其X軸中位數(median)畫出直線L將之分為二個集合SL與SR。下圖顯示SR中所有點的秩的更新。,46,二維求秩演算法時間複雜度分析,步驟時間複雜度:步驟2: c1n log n (排序)步驟4: c

19、2n log n (排序)總時間複雜度:T(n) = 2T(n/2) + c1n log n + c2n log n= 2T(n/2) + cn log n= 2(2T(n/4)+c(n/2) log (n/2)+ cn log n = 4T(n/4) + cn log (n/2) + cn log n= nT(1) + cn(log n + log (n/2)+ log (n/4) + log 2) nT(1) + cn (log n (log n+ log 2)/2 (其中T(1)=1)= O(n log2n),Algorithm 二維求秩演算法Input: n個二維平面點所構成的集合S,

20、n1Output: 集合S中所有點的秩(rank)步驟1: 若n=1,則回傳S中唯一一個點的秩為0並結束。步驟2: 找出所有點的X軸中位數(median)畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟3: 遞迴地使用二維求秩演算法分別求出SL與SR中所有點的秩。步驟4: 根據Y軸值排序所有在S(S=SLSR)中的點,依序掃描所有點且求出每一個在SR的點i排在多少在SL的點的後面(記為updatei),並將點i的秩加上updatei;最後回傳S中所有點的秩並結束。,47,2.6 二維極大點演算法,48,二維極大點演算法說明,二維極大點(2D maxima finding)演算法使

21、用分治策略解決二維極大點問題以下我們先定義支配(dominate)及極大點(maxima)然後我們定義二維極大點問題最後我們介紹二維極大點演算法,49,支配及極大點的定義,令A = (ax, ay), B = (bx, by)為二維XY平面上的點,則我們說A支配(dominate)B(記為AB)若且唯若 ax bx 且 ax by。如果一個點不被任何其他點所支配,我們就稱此點不被支配(non-dominated),或稱此點為極大點(maxima)。極大點不只一個。,50,二維極大點問題,給定一個由n個二維平面點所構成的集合S,求出S中的極大點(maxima)。可以用窮舉(exhaustive)

22、演算法,比較所有的可能成對點,其時間複雜度為O(n2)。,51,Algorithm 二維極大點演算法Input: n個二維平面點所構成的集合S,n1Output: 集合S中所有的極大點(maxima)步驟1: 若n=1,則回傳S中唯一一個點為極大點並結束。步驟2: 找出所有點的X軸中位數(median)畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟3: 遞迴地使用二維極大點演算法分別求出SL與SR中所有的極大點。步驟4: 在SR的極大點中找出最大的Y軸值y*。 對每個在SL中的極大點,如果該點的Y軸值小於y*,則標示該點為不是極大點。回傳SR中的極大點和SL中未被標示的極大點。

23、,二維極大點演算法,52,二維極大點演算法範例,假定給定平面上10個點,依其X軸中位數(median)畫出直線L將之分為二個集合SL與SR。下圖顯示SL中極大點的更新。,53,二維極大點演算法時間複雜度分析,步驟時間複雜度:步驟2: c1n log n (排序)步驟4: c2n (依序檢查)總時間複雜度:T(n) = 2T(n/2) + c1n log n + c2n= 2T(n/2) + cn log n= 2(2T(n/4)+c(n/2) log (n/2)+ cn log n = 4T(n/4) + cn log (n/2) + cn log n= nT(1) + cn(log n +

24、log (n/2)+ log (n/4) + log 2)= nT(1) + cn (log n (log n+ log 2)/2 (其中T(1)=1)= O(n log2n),Algorithm 二維極大點演算法Input: n個二維平面點所構成的集合S,n1Output: 集合S中所有的極大點(maxima)步驟1: 若n=1,則回傳S中唯一一個點為極大點並結束。步驟2: 找出所有點的X軸中位數(median)畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟3: 遞迴地使用二維極大點演算法分別求出SL與SR中所有的極大點。步驟4: 在SR的極大點中找出最大的Y軸值y*。 對每

25、個在SL中的極大點,如果該點的Y軸值小於y*,則標示該點為不是極大點。回傳SR中的極大點和SL中未被標示的極大點。,54,二維極大點演算法時間複雜度分析(續),步驟時間複雜度:步驟2: c1n (以刪尋演算法求中位數)步驟4: c2n (依序檢查)總時間複雜度:T(n) = 2T(n/2) + c1n + c2n= 2T(n/2) + cn = 2(2T(n/4)+c(n/2)+ cn = 4T(n/4) + cn + cn= nT(1) + cn+cn+cn (其中總共log n個cn)= nT(1) + cn log n (其中T(1)=1)= O(n log n),Algorithm 二

26、維極大點演算法Input: n個二維平面點所構成的集合S,n1Output: 集合S中所有的極大點(maxima)步驟1: 若n=1,則回傳S中唯一一個點為極大點並結束。步驟2: 找出所有點的X軸中位數(median)畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟3: 遞迴地使用二維極大點演算法分別求出SL與SR中所有的極大點。步驟4: 在SR的極大點中找出最大的Y軸值y*。 對每個在SL中的極大點,如果該點的Y軸值小於y*,則標示該點為不是極大點。回傳SR中的極大點和SL中未被標示的極大點。,55,2.7 最近二維點對演算法,56,最近二維點對演算法說明,最近二維點對(clo

27、sest pair of 2D points) 演算法使用分治策略解決最近二維點對問題以下我們先定義最近二維點對問題然後我們介紹最近二維點對演算法,57,最近二維點對問題,給定n個二維平面點,找出其中距離最近的二個點的距離。可以用窮舉(exhaustive)演算法,比較所有的成對點,其時間複雜度為O(n2)。,58,Algorithm 最近二維點對演算法Input: n個二維平面點所構成的集合S,n2Output: 集合S中距離最近的二個點的距離d步驟1: 根據X軸值與Y軸值來事先排序S中的點。步驟2: 若n=2,則回傳S中二點的距離d並結束。步驟3: 找出所有點的X軸中位數(median)m

28、畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟4: 遞迴地使用二維點對演算法分別求出SL與SR中最近二維點對的距離dL與dR,且令 d = min(dL, dR)。,最近二維點對演算法,59,步驟5: 將X軸值介於m-d與m+d的所有點的Y軸值投射至直線L上。針對於每個X軸值落在範圍介於m-d與m之間的點p,以yp記錄其Y軸值,並尋找所有X軸值落在範圍介於m與m+d之間,且Y軸值介於yP+d 與 yP-d之間的所有點,若存在一點與p之距離為小於d的d,則令d=d。回傳d並結束執行。,最近二維點對演算法(續),60,最近二維點對演算法執行說明,61,最近二維點對演算法時間複雜度分

29、析,步驟時間複雜度:步驟 1: c1n log n (事先排序)步驟 25: T(n) = c2n log n總時間複雜度:T(n) = c1n log n + c2n log n = O(n log n),Algorithm 最近二維點對演算法Input: n個二維平面點所構成的集合S,n2Output: 集合S中距離最近的二個點的距離d步驟1: 根據X軸值與Y軸值來事先排序S中的點。步驟2: 若n=2,則回傳S中二點的距離d並結束。步驟3: 找出所有點的X軸中位數(median)m畫出垂直於X軸的直線L,將S中的點分為二個集合SL與SR。步驟4: 遞迴地使用二維點對演算法分別求出SL與SR

30、中最近二維點對的距離dL與dR,且令 d = min(dL, dR)。 步驟5: 將X軸值介於m-d與m+d的所有點的Y軸值投射至直線L上。針對於每個X軸值落在範圍介於m-d與m之間的點p,以yp記錄其Y軸值,並尋找所有X軸值落在範圍介於m與m+d之間,且Y軸值介於yP+d 與 yP-d之間的所有點,若存在一點與p之距離為小於d的d,則令d=d。回傳d並結束執行。,62,2.8 刪尋演算法基本概念,63,刪尋解題策略,刪尋(prune-and-search)解題策略使用多次迭代(iteration)解決問題。在每次迭代都刪除(prune)輸入資料的一部份(假設為f部份, 0f1),而後採用相同

31、的演算法遞迴地(recursively)從剩餘資料中搜尋(search)出解答。而經過幾次迭代後,輸入資料的規模將會小到足以讓問題使用常數時間複雜度直接解決。,64,使用刪尋解題策略的演算法,二元搜尋演算法選取與中位數演算法限制的一圓心演算法簡化的二變數線性規劃演算法,65,一般刪尋演算法時間複雜度,假設輸入規模為n,而刪尋演算法每次迭代都刪除(prune)輸入資料的f 部份(00,則在最差狀況下刪尋演算法的時間複雜度T(n)為: T(n) = T(1-f ) n) + cnk,66,一般刪尋演算法時間複雜度(續),等比級數公式,67,迭代p次,假定(1-f)p+1n 1 (1-f)pn,2.

32、9 二元搜尋演算法,68,二元搜尋演算法,給定一個已依由小到大順序排列的數值陣列A,假設我們要在索引 l 與 索引 r 之間找出目標數值t的索引,則我們可以使用二元搜尋(binary search)演算法採用刪尋策略來有效率地進行這項工作。,69,二元搜尋演算法(續),70,已排序好的陣列A: (搜尋 43)索引: -1 0 1 2 34 5 6數值: 2 8 1127 38 43 52(搜尋43)迭代1 l m r迭代2l m r (傳回索引5)(搜尋1)迭代1 lm r迭代2 l m r迭代3 l,r,m 迭代4 r l (因r k ,代表第k小的元素在S1中,我們可刪除S2和S3。否則,

33、若 |S1| + |S2| k,則 p 就是 S 中第 k 小的元素。否則,代表第 k 小的元素是S3中第(k - |S1| - |S2|)小的元素,我們可刪除S1和S2。,76,Q: 如何選擇 p?A: 中位數的中位數How: 將n個元素分割成n/5個大小為5的子集合,找出每個子集合的中位數,然後再找出這些中位數的中位數。問題: 為什麼選擇子集合的大小為5?3可以嗎?4可以嗎?6可以嗎?,p,S中至少有1/4的元素小於或等於p (S1至少有1/4的元素),針對每一個大小為5的子集合,直接將其元素由小到大排列並找出其中位數。,S中至少有1/4的元素大於或等於p(S3至少有1/4的元素),以刪尋

34、策略解決選取問題(續),再找出中位數的中位數p,77,刪尋選取演算法,Algorithm 刪尋選取演算法Input: 一個有n個元素的集合S,以及整數k。Output: 集合S內第k小的元素。步驟1: 將S分割為n/5個大小為5的子集合。若n不能被5整除的話則在最後一個子集合內增加值為的元素,使其補滿5個元素。步驟2: 直接排序每個子集合內的元素。步驟3: 從每個子集合內找出中位數,再遞迴地從找出的中位數中找出中位數(也就是找出所有子集合中位數的中位數),令其為p。,78,刪尋選取演算法(續),步驟4: 將S分成 S1, S2, S3三個子集合,每個子集合分別包含小於、等於、大於p的元素。步驟

35、5: 若 |S1| k, 則捨棄 S2 與 S3 並且在下一次迭代中從S1 內找出第k小的元素為輸出(令S=S1;跳回步驟1);否則,若|S1| + |S2| k 則輸出p為S內第K小的元素; 否則,令 k = k - |S1| - |S2|,在下一次的迭代中從S3 找出第 k 小的元素為輸出(令S=S3;k=k;跳回步驟1) 。,79,刪尋選取演算法時間複雜度分析,一次的迭代至少可以刪除n/4個元素,剩餘的3n/4個元素,可以在步驟5遞迴地處理。步驟3以遞迴的方式找出n/5個中位數的中位數。步驟時間複雜度:步驟1: O(n)步驟2: O(n)步驟3: T(n/5)步驟4: O(n)步驟5:

36、T(3n/4)總時間複雜度: T(n) = T(3n/4)+T(n/5)+cn,80,令 T(n) = a0 + a1n + a2n2 + , a1 0T(3n/4) = a0 + (3/4)a1n + (9/16)a2n2 + T(n/5) = a0 + (1/5)a1n + (1/25)a2n2 + T(3n/4 + n/5) = T(19n/20) = a0 + (19/20)a1n + (361/400)a2n2 + T(3n/4) + T(n/5) a0 + T(19n/20) T(n) cn + T(19n/20) cn + (19/20)cn +T(19/20)2n) cn +

37、(19/20)cn + (19/20)2cn + +(19/20)pcn + T(19/20)p+1n) , (19/20)p+1n 1 (19/20)pn T(n) = 20 cn + c = O(n),等比級數公式,81,刪尋選取演算法時間複雜度分析(續),2.11 限制的一圓心演算法,82,一圓心問題,一圓心問題(1-center problem):給定n個平面點,找出一個最小可覆蓋此n個點的圓。,83,一圓心問題(續),基本暴力(brute force)法: 列出每一個可能的候選圓並檢查其是否能夠覆蓋所有的點:任取三點做圓: 時間複雜度O(n3)任取二點為直徑做圓: 時間時間複雜度O(

38、n2)針對一個候選圓檢查是否能夠覆蓋所有的點: O(n)總時間複雜度: O(n4),84,限制的一圓心問題,限制的一圓心問題(constrained 1-center problem):給定n個平面點,找出一個最小可覆蓋此n個點的圓,但是限制圓心r必須座落在y=c(例如y=0)的直線上。,85,限制的一圓心演算法,Algorithm 限制的一圓心演算法Input: n個平面點p1, p2, , pn與直線y = cOutput: 圓心在y=c上可覆蓋p1, p2, , pn的最小圓步驟1: 若n2,則直接找出圓。步驟2: 若n為偶數,則形成n/2個點對(p1, p2), ,(pn-1, pn)

39、;反之,若n為奇數,則形成n/2個點對(p1, p2), , (pn-2, pn-1), (pn, p1)。步驟3: 對於每一點對(pi, pi+1),做出其中垂線Lij,交於直線y=c,以找出一個在直線y=c上的等距點qi,i+1,使得d(pi, qi,i+1)= d(pi+1, qi,i+1),其中d(p, q)代表點p與點q的距離。,86,步驟4: 找出所有等距點的X座標值的中位數xm,令對應的等距點為qm=(xm, c)。步驟5: 以qm來評估最佳解圓心q*在y=c的位置: 計算每個pi與點qm的距離,並令pj為距qm最遠的點。令qj表示pj 在直線 y=c上的投影點,若 qj 落在q

40、m左側(右側),則最佳解圓心q* 亦必定會落在qm的左側(右側)。步驟6: 若q*落在qm的左側,則針對每個X軸值大於xm的等距點qi,i+1,刪除其對應點pi與pi+1中靠qm較近的點;反之,若q*落在qm的右側,則針對每個X軸值小於xm的等距點qi,i+1,刪除其對應點pi與pi+1中靠qm較近的點。步驟7: 跳到步驟1繼續執行。,87,限制的一圓心演算法(續),y = c,Lij,pi,pi+1,qi,i+1,q*,pj,限制的一圓心演算法執行展示,88,qm=(xm, c),步驟4: 找出所有等距點的X座標值的中位數xm,令對應的等距點為qm=(xm, c)。步驟5: 以qm來評估最佳

41、解圓心q*在y=c的位置: 計算每個pi與點qm的距離,並令pj為距qm最遠的點。令qj表示pj 在直線 y=c上的投影點,若 qj 落在qm左側(右側),則最佳解圓心q* 亦必定會落在qm的左側(右側)。步驟6: 若q*落在qm的左側,則針對每個X軸值大於xm的等距點qi,i+1,刪除其對應點pi與pi+1中靠qm較近的點;反之,若q*落在qm的右側,則針對每個X軸值小於xm的等距點qi,i+1,刪除其對應點pi與pi+1中靠qm較近的點。,qj,限制的一圓心演算法使用刪尋策略解決問題,在每個迭代均刪除一部份輸入資料。由於每個迭代均有n/4個等距點在qm的左方(或右方),故演算法每次迭代均可

42、刪除n/4個點。由於步驟2-6的時間複雜度均為O(n),根據前述一般刪尋演算法時間複雜度的說明,限制的一圓心演算法的時間複雜度為T(n)=T(3n/4)+cn=O(n),限制的一圓心演算法時間複雜度分析,89,2.12 簡化的二變數線性規劃演算法,90,線性規劃或線性最佳化問題,限制條件(限制式)為:,欲最大化或最小化目標函數:,91,線性規劃(linear programming)或線性最佳化(linear optimization)問題:,二變數線性規劃範例,92,線性規劃 (linear programming, LP)問題: 目標函數(objective function)和限制條件(

43、constraints)都是線性(變數都是一次方)的最佳化(optimization)問題。是多項式時間複雜度(polynomial time complexity)問題。要求所有變數都限定為整數的線性規劃問題叫做整數線性規劃(integer linear programming, ILP)或整數規劃(integer programming, IP)問題。是NP困難(NP-hard)問題。0/1 整數規劃(0/1 integer linear programming, 0/1 ILP)是整數線性規劃的特殊情況,要求所有的變數都要是0或1。是NP困難(NP-hard)問題。,線性規劃或線性最佳化

44、(續),93,著名的線性規劃演算法,1947: 單形演算法(simplex alg.): George Dantzig, O(2n), n為限制式的個數 1975: 諾貝爾經濟獎: L. V. Kantorovich 和 T. C. Koopmans (基於線性規劃的資源最佳分配理論)1979: 橢球演算法(ellipsoid alg.): Leonid Khachiyan, 第一個最差狀況時間複雜度為多項式的線性規劃演算法, O(n6L2 log L log log L), L為輸入的位元數。但是這個演算法實際使用時效能並不好。1984: 投射演算法(projective alg.): N.

45、 Karmarkar, O(n3.5L2 log L log log L),94,以上資料參考維基百科: http:/en.wikipedia.org/wiki/Linear_programming,簡化的二變數線性規劃問題,簡化的二變數線性規劃(simplified two-variable linear programming)問題:給定n個限制條件,其中第i個限制條件為: y kix + ti, i = 1, 2, , n (ki為斜率,ti為y截距)欲最小化目標函數y,95,簡化的二變數線性規劃問題範例,96,給定n(n=6)個限制條件,欲最小化目標函數y可行解區域之邊界(boundary)函數B(x): B(x) =最佳解(x*, y*): y*=B(x*) = B(x),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报