分治演算法(一)

2022-04-05 16:32:53 字數 1470 閱讀 7181

當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治策略的基本思想。

(1)分解,將要解決的問題劃分成若干規模較小的同類問題;

(2)求解,當子問題劃分得足夠小時,用較簡單的方法解決;

(3)合併,按原問題的要求,將子問題的解逐層合併構成原問題的解。

1)二分法:利用分治策略求解時,所需時間取決於分解後子問題的個數、子問題的規模大小等因素,而二分法,由於其劃分的簡單和均勻的特點,是經常採用的一種有效的方法,例如二分法檢索。

#include #include 

using

namespace

std;

bool erfen(int a,int low,int high,int

x);int

main()

//輸入為1,2,3

scanf("

%d",&x);//

要找的數,3

if(erfen(a,0,n-1

,x))

else

return0;

}bool erfen(int a,int low,int high,int

x)

else

if(xelse

if(x==a[mid])

}return

false

;}

2)找出偽幣:

給你乙個裝有1 6個硬幣的袋子。1 6個硬幣中有乙個是偽造的,並且那個偽造的硬幣比真的硬幣要輕一些。你的任務是找出這個偽造的硬幣。為了幫助你完成這一任務,將提供一台可用來比較兩組硬幣重量的儀器,利用這台儀器,可以知道兩組硬幣的重量是否相同。比較硬幣1與硬幣2的重量。假如硬幣1比硬幣2輕,則硬幣1是偽造的;假如硬幣2比硬幣1輕,則硬幣2是偽造的。這樣就完成了任務。假如兩硬幣重量相等,則比較硬幣3和硬幣4。同樣,假如有乙個硬幣輕一些,則尋找偽幣的任務完成。假如兩硬幣重量相等,則繼續比較硬幣5和硬幣6。

如果像上面說的一樣,兩個硬幣兩個硬幣地比的話,最壞的情況要比8次。如果用分治的思想來解決會好一些,先把16個硬幣分成a組8個的硬幣,b組8個硬幣,即將問題劃分成規模小的同類問題;如果a組輕,則偽幣在a組裡,則將a組分成a1組4個b1組四個,如果a1組輕,則將a1組分成a2組兩個和b2組兩個,如果a2組輕,則稱a2組的兩個硬幣就能得到假幣,即子問題已經足夠小,可以輕易的解決問題;前面寫的幾個如果,即子問題解,逐層合併就得到了問題的解。比了四次就得到了解,顯然比兩個兩個的比硬幣好的多。

3)棋牌覆蓋

這位博主寫的挺好,圖很形象! 

4)歸併排序和快速排序見分治演算法(二)

演算法 分治演算法

分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...

演算法 分治演算法

leetcode 169.多數元素 應用舉例 通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中 卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。相關概念 一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序...

演算法複習 分治演算法

先來看乙個經典的二分查詢例子。int binarysearch vector nums,int target return 1 時間複雜度是 o logn 我們看到,二分查詢貫徹了分治的思想。當我們要解決乙個輸入規模較大 不妨設為 n 的問題時,可以將這個問題分解成 k 個不同的子集,如果能得到 k...