當前位置:首頁 » 操作系統 » 分治演算法幾個經典例子

分治演算法幾個經典例子

發布時間: 2024-07-15 08:29:54

『壹』 程序員都應該精通的六種演算法,你會了嗎

對於一名優秀的程序員來說,面對一個項目的需求的時候,一定會在腦海里浮現出最適合解決這個問題的方法是什麼,選對了演算法,就會起到事半功倍的效果,反之,則可能會使程序運行效率低下,還容易出bug。因此,熟悉掌握常用的演算法,是對於一個優秀程序員最基本的要求。


那麼,常用的演算法都有哪些呢?一般來講,在我們日常工作中涉及到的演算法,通常分為以下幾個類型:分治、貪心、迭代、枚舉、回溯、動態規劃。下面我們來一一介紹這幾種演算法。


一、分治演算法


分治演算法,顧名思義,是將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。


分治演算法一般分為三個部分:分解問題、解決問題、合並解。

分治演算法適用於那些問題的規模縮小到一定程度就可以解決、並且各子問題之間相互獨立,求出來的解可以合並為該問題的解的情況。


典型例子比如求解一個無序數組中的最大值,即可以採用分治演算法,示例如下:


def pidAndConquer(arr,leftIndex,rightIndex):

if(rightIndex==leftIndex+1 || rightIndex==leftIndex){

return Math.max(arr[leftIndex],arr[rightIndex]);

}

int mid=(leftIndex+rightIndex)/2;

int leftMax=pidAndConquer(arr,leftIndex,mid);

int rightMax=pidAndConquer(arr,mid,rightIndex);

return Math.max(leftMax,rightMax);


二、貪心演算法


貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。


貪心演算法的基本思路是把問題分成若干個子問題,然後對每個子問題求解,得到子問題的局部最優解,最後再把子問題的最優解合並成原問題的一個解。這里要注意一點就是貪心演算法得到的不一定是全局最優解。這一缺陷導致了貪心演算法的適用范圍較少,更大的用途在於平衡演算法效率和最終結果應用,類似於:反正就走這么多步,肯定給你一個值,至於是不是最優的,那我就管不了了。就好像去菜市場買幾樣菜,可以經過反復比價之後再買,或者是看到有賣的不管三七二十一先買了,總之最終結果是菜能買回來,但搞不好多花了幾塊錢。


典型例子比如部分背包問題:有n個物體,第i個物體的重量為Wi,價值為Vi,在總重量不超過C的情況下讓總價值盡量高。每一個物體可以只取走一部分,價值和重量按比例計算。

貪心策略就是,每次都先拿性價比高的,判斷不超過C。


三、迭代演算法


迭代法也稱輾轉法,是一種不斷用變數的舊值遞推新值的過程。迭代演算法是用計算機解決問題的一種基本方法,它利用計算機運算速度快、適合做重復性操作的特點,讓計算機對一組指令(或一定步驟)進行重復執行,在每次執行這組指令(或這些步驟)時,都從變數的原值推出它的一個新值。最終得到問題的結果。


迭代演算法適用於那些每步輸入參數變數一定,前值可以作為下一步輸入參數的問題。


典型例子比如說,用迭代演算法計算斐波那契數列。


四、枚舉演算法


枚舉演算法是我們在日常中使用到的最多的一個演算法,它的核心思想就是:枚舉所有的可能。枚舉法的本質就是從所有候選答案中去搜索正確地解。

枚舉演算法適用於候選答案數量一定的情況。


典型例子包括雞錢問題,有公雞5,母雞3,三小雞1,求m錢n雞的所有可能解。可以採用一個三重循環將所有情況枚舉出來。代碼如下:



五、回溯演算法


回溯演算法是一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。

許多復雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。


典型例子是8皇後演算法。在8 8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問一共有多少種擺法。


回溯法是求解皇後問題最經典的方法。演算法的思想在於如果一個皇後選定了位置,那麼下一個皇後的位置便被限制住了,下一個皇後需要一直找直到找到安全位置,如果沒有找到,那麼便要回溯到上一個皇後,那麼上一個皇後的位置就要改變,這樣一直遞歸直到所有的情況都被舉出。


六、動態規劃演算法


動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。


動態規劃演算法適用於當某階段狀態給定以後,在這階段以後的過程的發展不受這段以前各段狀態的影響,即無後效性的問題。


典型例子比如說背包問題,給定背包容量及物品重量和價值,要求背包裝的物品價值最大。


『貳』 闃愯堪涓涓鐢熸椿涓鎮ㄦ墍浜嗚В鐨勭敤鍒嗘不娉曡В鍐抽棶棰樼殑妗堜緥銆

鐢熸椿涓鐢ㄥ垎娌繪硶瑙e喅闂棰樼殑妗堜緥濡備笅錛

鎵懼嚭浼甯

緇欎綘涓涓瑁呮湁16涓紜甯佺殑琚嬪瓙銆16涓紜甯佷腑鏈変竴涓鏄浼閫犵殑錛屽苟涓旈偅涓浼閫犵殑紜甯佹瘮鐪熺殑紜甯佽佽交涓浜涖備綘鐨勪換鍔℃槸鎵懼嚭榪欎釜浼閫犵殑紜甯併備負浜嗗府鍔╀綘瀹屾垚榪欎竴浠誨姟錛屽皢鎻愪緵涓鍙板彲鐢ㄦ潵姣旇緝涓ょ粍紜甯侀噸閲忕殑浠鍣錛屽埄鐢ㄨ繖鍙頒華鍣錛屽彲浠ョ煡閬撲袱緇勭‖甯佺殑閲嶉噺鏄鍚︾浉鍚屻

姣旇緝紜甯1涓庣‖甯2鐨勯噸閲忋傚亣濡傜‖甯1姣旂‖甯2杞伙紝鍒欑‖甯1鏄浼閫犵殑錛涘亣濡傜‖甯2姣旂‖甯1杞伙紝鍒欑‖甯2鏄浼閫犵殑銆傝繖鏍峰氨瀹屾垚浜嗕換鍔°傚亣濡備袱紜甯侀噸閲忕浉絳夛紝鍒欐瘮杈冪‖甯3鍜岀‖甯4銆傚悓鏍鳳紝鍋囧傛湁涓涓紜甯佽交涓浜涳紝鍒欏繪壘浼甯佺殑浠誨姟瀹屾垚銆

鍋囧備袱紜甯侀噸閲忕浉絳夛紝鍒欑戶緇姣旇緝紜甯5鍜岀‖甯6銆傛寜鐓ц繖縐嶆柟寮忥紝鍙浠ユ渶澶氶氳繃8嬈℃瘮杈冩潵鍒ゆ柇浼甯佺殑瀛樺湪騫舵壘鍑鴻繖涓浼甯併

鍙﹀栦竴縐嶆柟娉灝辨槸鍒╃敤鍒嗚屾不涔嬫柟娉曘傚亣濡傛妸16涓紜甯佺殑渚嬪瓙鐪嬫垚涓涓澶х殑闂棰樸

絎涓姝ワ紝鎶婅繖涓闂棰樺垎鎴愪袱涓灝忛棶棰樸傞殢鏈洪夋嫨8涓紜甯佷綔涓虹涓緇勭О涓篈緇勶紝鍓╀笅鐨8涓紜甯佷綔涓虹浜岀粍縐頒負B緇勩傝繖鏍鳳紝灝辨妸16涓紜甯佺殑闂棰樺垎鎴愪袱涓8紜甯佺殑闂棰樻潵瑙e喅銆

絎浜屾ワ紝鍒ゆ柇A鍜孊緇勪腑鏄鍚︽湁浼甯併傚彲浠ュ埄鐢ㄤ華鍣ㄦ潵姣旇緝A緇勭‖甯佸拰B緇勭‖甯佺殑閲嶉噺銆傚亣濡備袱緇勭‖甯侀噸閲忕浉絳夛紝鍒欏彲浠ュ垽鏂浼甯佷笉瀛樺湪銆傚亣濡備袱緇勭‖甯侀噸閲忎笉鐩哥瓑錛屽垯瀛樺湪浼甯侊紝騫朵笖鍙浠ュ垽鏂瀹冧綅浜庤緝杞葷殑閭d竴緇勭‖甯佷腑銆

鏈鍚庯紝鍦ㄧ涓夋ヤ腑錛岀敤絎浜屾ョ殑緇撴灉寰楀嚭鍘熷厛1 6涓紜甯侀棶棰樼殑絳旀堛傝嫢浠呬粎鍒ゆ柇紜甯佹槸鍚﹀瓨鍦錛屽垯絎涓夋ラ潪甯哥畝鍗曘傛棤璁篈緇勮繕鏄疊緇勪腑鏈変吉甯侊紝閮藉彲浠ユ帹鏂榪1 6涓紜甯佷腑瀛樺湪浼甯併傚洜姝わ紝浠呬粎閫氳繃涓嬈¢噸閲忕殑姣旇緝錛屽氨鍙浠ュ垽鏂浼甯佹槸鍚﹀瓨鍦ㄣ

鍋囪鵑渶瑕佽瘑鍒鍑鴻繖涓浼甯併傛妸涓や釜鎴栦笁涓紜甯佺殑鎯呭喌浣滀負涓嶅彲鍐嶅垎鐨勫皬闂棰樸傛敞鎰忓傛灉鍙鏈変竴涓紜甯侊紝閭d箞涓嶈兘鍒ゆ柇鍑哄畠鏄鍚﹀氨鏄浼甯併傚湪涓涓灝忛棶棰樹腑錛岄氳繃灝嗕竴涓紜甯佸垎鍒涓庡叾浠栦袱涓紜甯佹瘮杈冿紝鏈澶氭瘮杈冧袱嬈″氨鍙浠ユ壘鍒頒吉甯併

榪欐牱16紜甯佺殑闂棰樺氨琚鍒嗕負涓や釜8紜甯侊紙A緇勫拰B緇勶級鐨勯棶棰樸傞氳繃姣旇緝榪欎袱緇勭‖甯佺殑閲嶉噺錛屽彲浠ュ垽鏂浼甯佹槸鍚﹀瓨鍦ㄣ傚傛灉娌℃湁浼甯侊紝鍒欑畻娉曠粓姝銆傚惁鍒欑戶緇鍒掑垎榪欎袱緇勭‖甯佹潵瀵繪壘浼甯併傚亣璁綛鏄杞葷殑閭d竴緇勶紝鍥犳ゅ啀鎶婂畠鍒嗘垚涓ょ粍錛屾瘡緇勬湁4涓紜甯併

縐板叾涓涓緇勪負B1錛屽彟涓緇勪負B2銆傛瘮杈冭繖涓ょ粍錛岃偗瀹氭湁涓緇勮交涓浜涖傚傛灉B1杞伙紝鍒欎吉甯佸湪B1涓錛屽啀灝咮1鍙堝垎鎴愪袱緇勶紝姣忕粍鏈変袱涓紜甯侊紝縐板叾涓涓緇勪負B1a錛屽彟涓緇勪負B1b銆傛瘮杈冭繖涓ょ粍錛屽彲浠ュ緱鍒頒竴涓杈冭交鐨勭粍銆

鐢變簬榪欎釜緇勫彧鏈変袱涓紜甯侊紝鍥犳や笉蹇呭啀緇嗗垎銆傛瘮杈冪粍涓涓や釜紜甯佺殑閲嶉噺錛屽彲浠ョ珛鍗崇煡閬撳摢涓涓紜甯佽交涓浜涖傝緝杞葷殑紜甯佸氨鏄鎵瑕佹壘鐨勪吉甯併



鎵╁睍璧勬枡錛

瑙i樻ラ

鍒嗘不娉曡В棰樼殑涓鑸姝ラわ細

錛1錛夊垎瑙o紝灝嗚佽В鍐崇殑闂棰樺垝鍒嗘垚鑻ュ共瑙勬ā杈冨皬鐨勫悓綾婚棶棰橈紱

錛2錛夋眰瑙o紝褰撳瓙闂棰樺垝鍒嗗緱瓚沖熷皬鏃訛紝鐢ㄨ緝綆鍗曠殑鏂規硶瑙e喅錛

錛3錛夊悎騫訛紝鎸夊師闂棰樼殑瑕佹眰錛屽皢瀛愰棶棰樼殑瑙i愬眰鍚堝苟鏋勬垚鍘熼棶棰樼殑瑙c

鍙傝冭祫鏂欐潵婧愶細鐧懼害鐧劇-鍒嗘不綆楁硶

『叄』 幾種經典演算法回顧

今天無意中從箱子里發現了大學時學演算法的教材《演算法設計與分析》,雖然工作這么幾年沒在什麼地方用過演算法,但演算法的思想還是影響深刻的,可以在系統設計時提供一些思路。大致翻了翻,重溫了一下幾種幾種經典的演算法,做一下小結。分治法動態規劃貪心演算法回溯法分支限界法分治法1)基本思想將一個問題分解為多個規模較小的子問題,這些子問題互相獨立並與原問題解決方法相同。遞歸解這些子問題,然後將這各子問題的解合並得到原問題的解。2)適用問題的特徵該問題的規模縮小到一定的程度就可以容易地解決該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題3)關鍵如何將問題分解為規模較小並且解決方法相同的問題分解的粒度4)步驟分解->遞歸求解->合並 divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解決小規模的問題 divide P into smaller subinstances P1,P2,...,Pk;//分解問題 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //遞歸的解各子問題 return merge(y1,...,yk); //將各子問題的解合並為原問題的解 }google的核心演算法MapRece其實就是分治法的衍生5)分治法例子:合並排序規約過程:動態規劃1)基本思想將待求解問題分解成若干個子問題,但是經分解得到的子問題往往不是互相獨立的,如果能夠保存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重復計算2)適用問題的特徵最優子結構在遞歸計算中,許多子問題被重復計算多次3)步驟找出最優解的性質,並刻劃其結構特徵。遞歸地定義最優值。以自底向上的方式計算出最優值。根據計算最優值時得到的信息,構造最優解。貪心演算法1)基本思想貪心演算法總是作出在當前看來最好的選擇。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇2)適用問題的特徵貪心選擇性質,即所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇來達到。最優子結構性質3)步驟:不斷尋找局部最優解4)例子:找硬幣,哈夫曼編碼,單源最短路徑,最小生成樹(Prim和Kruskal) 最小生成樹圖示:回溯法1)基本思想在問題的解空間樹中,按深度優先策略,從根結點出發搜索解空間樹。演算法搜索至解空間樹的任意一點時,先判斷該結點是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的搜索,逐層向其祖先結點回溯;否則,進入該子樹,繼續按深度優先策略搜索2)適用問題的特徵:容易構建所解問題的解空間3)步驟定義問題的解空間 確定易於搜索的解空間結構以深度優先方式搜索解空間,並在搜索過程中用剪枝函數避免無效搜索 4)回溯法例子:N皇後問題分支限界法1)基本思想分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜索問題的解空間樹。 在分支限界法中,每一個活結點只有一次機會成為擴展結點。活結點一旦成為擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優解的兒子結點被舍棄,其餘兒子結點被加入活結點表中。此後,從活結點表中取下一結點成為當前擴展結點,並重復上述結點擴展過程。這個過程一直持續到找到所需的解或活結點表為空時為止。2)分支限界法例子:單源最短路徑問題問題描述:在下圖所給的有向圖G中,每一邊都有一個非負邊權。

『肆』 分治演算法幾個經典例子

分治法,字面意思是「分而治之」,就是把一個復雜的1問題分成兩個或多個相同或相似的子問題,再把子問題分成更小的子問題直到最後子問題可以簡單地直接求解,原問題的解即子問題的解的合並,這個思想是很多高效演算法的基礎。

圖二

大整數乘法

Strassen矩陣乘法

棋盤覆蓋

合並排序

快速排序

線性時間選擇

最接近點對問題

循環賽日程表

漢諾塔

『伍』 什麼叫演算法演算法有哪幾種表示方法

演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。計算機科學家往往將「演算法」一詞的含義限定為此類「符號演算法」。「演算法」概念的初步定義:一個演算法是解決一個問題的進程。而並不需要每次都發明一個解決方案。

已知的演算法有很多,例如「分治法」、「枚舉測試法」、「貪心演算法」、「隨機演算法」等。

(5)分治演算法幾個經典例子擴展閱讀

演算法中的「分治法」

「分治法」是把一個復雜的問題拆分成兩個較為簡單的子問題,進而兩個子問題又可以分別拆分成另外兩個更簡單的子問題,以此類推。問題不斷被層層拆解。然後,子問題的解被逐層整合,構成了原問題的解。

高德納曾用過一個郵局分發信件的例子對「分治法」進行了解釋:信件根據不同城市區域被分進不同的袋子里;每個郵遞員負責投遞一個區域的信件,對應每棟樓,將自己負責的信件分裝進更小的袋子;每個大樓管理員再將小袋子里的信件分發給對應的公寓。

熱點內容
普通人電腦什麼配置 發布:2024-11-26 00:53:14 瀏覽:728
安卓版路路通蘋果版是什麼 發布:2024-11-26 00:53:07 瀏覽:350
復甦室護士怎麼配置 發布:2024-11-26 00:51:24 瀏覽:396
預演算法探析 發布:2024-11-26 00:51:23 瀏覽:70
通過ftp傳文件公司能發現嗎 發布:2024-11-26 00:50:46 瀏覽:460
資料庫oracle面試 發布:2024-11-26 00:47:02 瀏覽:201
網易資料庫 發布:2024-11-26 00:39:49 瀏覽:810
舊電腦用什麼安卓模擬器 發布:2024-11-26 00:34:41 瀏覽:533
印度編程員 發布:2024-11-26 00:34:29 瀏覽:486
mac下php編譯器 發布:2024-11-26 00:25:18 瀏覽:863