演算法學習 一 分治演算法

2021-07-24 02:41:02 字數 1425 閱讀 6287

演算法學習(一)分治演算法

1.1 引言

當我們在處理一些問題時,由於這些問題要處理的資料很多,或者求解的過程很複雜,這時如果直接求解將會在時間上花費很長時間,或者根本沒辦法求出,對於這一類的問題,我們可以先把它分解為幾個子問題,找到並求出這些子問題的相應的解,然後再用適當的方法將他們組合成整個問題的解,這種問題處理的方式,我們就把它叫做分治法。

1.2 演算法思路

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

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

(3)合併:按求解問題的要求,將子問題的解進行逐層合併,即可構成最終的解;

1.3 例項:桌球比賽賽程安排

設有n=2的k次方個運動員要進行網球迴圈賽。現要設計乙個滿足以上要求的比賽日程表:

(1)每個選手必須與其他n-1個選手各賽一次;

(2)每個選手一天只能賽一次;

(3)迴圈賽一共進行n-1天;

按照分治策略,可以將所有選手對分為兩半,n個選手的比賽日程表就可以通過為n/2個選手設計的比賽日程表來決定。遞迴的用這種一分為二的策略對選手進行分隔,直到剩下兩個選手時,比賽日程表的制定就變得簡單了,這時只讓這兩個選手進行比賽就可以了。

(由於樓主不會發圖上傳,請各位看官們包涵辣)

對於8個選手的比賽日程表,其中左上角的與左下角的兩小塊分別為選手1至選手4和選手5至選手8前三天的比賽日程。據此,將左上角小塊中的所有數字按其相對位置抄到右下角,將左下角小塊的所有數字按其相對位置抄到右上角,這樣就分別安排好了選手從1到選手4和選手5到選手8在後四天的比賽日程!(最重要的就是這個步驟的實現)

下面附上**:

#include #include #define maxn 64 //表示最多可安排64位選手來參加比賽 

int a[maxn+1][maxn+1]=;

//定義的時候為最大數加一,表示不安排第0號元素參與運算

void gamecal(int k,int n)//處理編號k開始的n個選手的日程

else

gamecal(1,m);

printf("\n編號 ");

for(i=2;i<=m;i++)

printf("%2d天",i-1);

printf("\n");

for(i=1;i<=m;i++)

getch();

return 0;

}

在這裡,因為分治演算法還涉及到棋盤覆蓋類似於這種的一些問題,樓主有時間會對此進行修改,並將相關問題附錄上去,不對的話歡迎拍磚~

複習一 分治演算法

臨近期末,把之前做過的題目 有部分是未做過的 重新做一遍,整合到一起,為了省時間,就不貼 了,只分析思路。分治演算法題目 1 search a 2d matrix ii 在乙個每行每列都有序的矩陣中搜尋某一數字。2 kth largest element in an array 找到陣列裡第k大元素...

五大常用演算法之一 分治演算法

一 基本概念 在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利...

五大常用演算法之一 分治演算法

一 基本概念 在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利...