c語言演算法

來源:互聯網
上載者:User

君主和殖民者們所成功運用的分而治之策略也可以運用到高效率的電腦演算法的設計過程中。本章將首先介紹怎樣在演算法設計領域應用這一古老的策略,然後將利用這一策略解決如下問題:最小最大問題、矩陣乘法、殘缺棋盤、排序、選擇和計算一個幾何問題——找出二維空間中距離最近的兩個點。

本章給出了用來分析分而治之演算法複雜性的數學方法,並通過推導最小最大問題和排序問題的複雜性下限來證明分而治之演算法對於求解這兩種問題是最優的(因為演算法的複雜性與下限一致)。

2.1 演算法思想

分而治之方法與軟體設計的模組化方法非常相似。為瞭解決一個大的問題,可以:1)把它分成兩個或多個更小的問題; 2)分別解決每個小問題; 3)把各小問題的解答組合起來,即可得到原問題的解答。小問題通常與原問題相似,可以遞迴地使用分而治之策略來解決。

例2-1 [找出偽幣] 給你一個裝有1 6個硬幣的袋子。1 6個硬幣中有一個是偽造的,並且那個偽造的硬幣比真的硬幣要輕一些。你的任務是找出這個偽造的硬幣。為了協助你完成這一任務,將提供一台可用來比較兩組硬幣重量的儀器,利用這台儀器,可以知道兩組硬幣的重量是否相同。比較硬幣1與硬幣2的重量。假如硬幣1比硬幣2輕,則硬幣1是偽造的;假如硬幣2比硬幣1輕,則硬幣2是偽造的。這樣就完成了任務。假如兩硬幣重量相等,則比較硬幣3和硬幣4。同樣,假如有一個硬幣輕一些,則尋找偽幣的任務完成。假如兩硬幣重量相等,則繼續比較硬幣5和硬幣6。按照這種方式,可以最多通過8次比較來判斷偽幣的存在並找出這一偽幣。

另外一種方法就是利用分而治之方法。假如把1 6硬幣的例子看成一個大的問題。第一步,把這一問題分成兩個小問題。隨機播放8個硬幣作為第一組稱為A組,剩下的8個硬幣作為第二組稱為B組。這樣,就把1 6個硬幣的問題分成兩個8硬幣的問題來解決。第二步,判斷A和B組中是否有偽幣。可以利用儀器來比較A組硬幣和B組硬幣的重量。假如兩組硬幣重量相等,則可以判斷偽幣不存在。假如兩組硬幣重量不相等,則存在偽幣,並且可以判斷它位於較輕的那一組硬幣中。最後,在第三步中,用第二步的結果得出原先1 6個硬幣問題的答案。若僅僅判斷硬幣是否存在,則第三步非常簡單。無論A組還是B組中有偽幣,都可以推斷這1 6個硬幣中存在偽幣。因此,僅僅通過一次重量的比較,就可以判斷偽幣是否存在。

現在假設需要識別出這一偽幣。把兩個或三個硬幣的情況作為不可再分的小問題。注意如果只有一個硬幣,那麼不能判斷出它是否就是偽幣。在一個小問題中,通過將一個硬幣分別與其他兩個硬幣比較,最多比較兩次就可以找到偽幣。這樣,1 6硬幣的問題就被分為兩個8硬幣(A組和B組)的問題。通過比較這兩組硬幣的重量,可以判斷偽幣是否存在。如果沒有偽幣,則演算法終止。否則,繼續劃分這兩組硬幣來尋找偽幣。假設B是輕的那一組,因此再把它分成兩組,每組有4個硬幣。稱其中一組為B1,另一組為B2。比較這兩組,肯定有一組輕一些。如果B1輕,則偽幣在B1中,再將B1又分成兩組,每組有兩個硬幣,稱其中一組為B1a,另一組為B1b。比較這兩組,可以得到一個較輕的組。由於這個組只有兩個硬幣,因此不必再細分。比較組中兩個硬幣的重量,可以立即知道哪一個硬幣輕一些。較輕的硬幣就是所要找的偽幣。

例2-2 [金塊問題] 有一個老闆有一袋金塊。每個月將有兩名僱員會因其優異的表現分別被獎勵一個金塊。按規矩,排名第一的僱員將得到袋中最重的金塊,排名第二的僱員將得到袋中最輕的金塊。根據這種方式,除非有新的金塊加入袋中,否則第一名僱員所得到的金塊總是比第二名僱員所得到的金塊重。如果有新的金塊周期性的加入袋中,則每個月都必須找出最輕和最重的金塊。假設有一台比較重量的儀器,我們希望用最少的比較次數找出最輕和最重的金塊。

假設袋中有n個金塊。可以用函數M a x(程式1 - 3 1)通過n-1次比較找到最重的金塊。找到最重的金塊後,可以從餘下的n-1個金塊中用類似的方法通過n-2次比較找出最輕的金塊。這樣,比較的總次數為2n-3。程式2 - 2 6和2 - 2 7是另外兩種方法,前者需要進行2n-2次比較,後者最多需要進行2n-2次比較。

下面用分而治之方法對這個問題進行求解。當n很小時,比如說, n≤2,識別出最重和最輕的金塊,一次比較就足夠了。當n 較大時(n>2),第一步,把這袋金塊平分成兩個小袋A和B。第二步,分別找出在A和B中最重和最輕的金塊。設A中最重和最輕的金塊分別為HA 與LA,以此類推,B中最重和最輕的金塊分別為HB和LB。第三步,通過比較HA和HB,可以找到所有金塊中最重的;通過比較LA和LB,可以找到所有金塊中最輕的。在第二步中,若n>2,則遞迴地應用分而治之方法。

假設n= 8。這個袋子被平分為各有4個金塊的兩個袋子A和B。為了在A中找出最重和最輕的金塊,A中的4個金塊被分成兩組A1和A2。每一組有兩個金塊,可以用一次比較在A中找出較重的金塊HA1和較輕的金塊LA1。經過另外一次比較,又能找出HA 2和LA 2。現在通過比較HA1和HA2,能找出HA;通過LA 1和LA2的比較找出LA。這樣,通過4次比較可以找到HA和LA。同樣需要另外4次比較來確定HB和LB。通過比較HA和HB(LA和LB),就能找出所有金塊中最重和最輕的。因此,當n= 8時,這種分而治之的方法需要1 0次比較。如果使用程式1 - 3 1,則需要1 3次比較。如果使用程式2 - 2 6和2 - 2 7,則最多需要1 4次比較。設c(n)為使用分而治之方法所需要的比較次數。為了簡便,假設n是2的冪。當n= 2時,c(n)= 1。對於較大的n,c(n)= 2c(n/2)+ 2。當n是2的冪時,使用迭代方法(見例2 - 2 0)可知

c(n)= 3n/2 - 2。在本例中,使用分而治之方法比逐個比較的方法少用了2 5%的比較次數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.