演算法導論 分治法

2021-06-22 04:50:24 字數 1536 閱讀 3574

分治法的思想:

分--將問題分解為規模更小的子問題;

治--將這些規模更小的子問題逐個擊破;

合--將已解決的子問題合併,最終得出「母」問題的解;

例如:將乙個陣列a,從小到到大排序。

分治思想:我們可以將陣列a分成2個陣列,即a[0....a.length/2] 、a[a.length/2+1,a.length]。分別將它們進行從小到大的排序,然後在將2個陣列          組合到一起,進行排序。有人要問了,為什麼要這樣呢?直接將他們直接進行排序不就行了嗎?幹嘛還要多此一舉!

分析:如果直接將他們進行排序:例如,使用插入排序,那他的時間複雜度為o(n^2)。

如果使用分治思想進行排序,則它的時間複雜度為o(nlgn);所需時間將更少!那麼nlgn這個時間複雜度是怎麼計算出來的呢?其實這個倒是很簡單        n>1,t(n)=2t(n/2)+0(n) ,如果每層時間複雜度是n,那他又幾層呢?這是乙個簡單的等比數列,a1=1;sn=n;q=2;算出來n=

2^(x+1);當n足夠大的時

候,n=2^x;所以,x=lgn. 所以總的時間複雜度為o(nlgn);

public class merge ;  

print(data);

mergesort(data);

system.out.println("排序後的陣列:");

print(data);

} public static void mergesort(int data)

public static void sort(int data, int left, int right)

/**

* 將兩個陣列進行歸併,歸併前面2個陣列已有序,歸併後依然有序

* * @param data

* 陣列物件

* @param left

* 左陣列的第乙個元素的索引

* @param center

* 左陣列的最後乙個元素的索引,center+1是右陣列第乙個元素的索引

* @param right

* 右陣列最後乙個元素的索引

*/

public static void merge(int data, int left, int center, int right) else

} // 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中乙個)

while (mid <= right)

while (left <= center)

// 將臨時陣列中的內容拷貝回原陣列中

// (原left-right範圍的內容被複製回原陣列)

while (tmp <= right)

} public static void print(int data)

system.out.println();

} }

《演算法導論》 2 3 1分治法

分治法 有很多演算法在結構上是遞迴的 為了解決乙個給定的問題,演算法要一次或多次地遞迴地呼叫其自身來解決相關的問題。這些演算法通常採用分治策略 將原問題劃分為n個規模較小而結構與原問題相似的子總是 遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。分治模式在每一層遞迴上都有三個步驟 分解 d...

演算法導論 分治法 最大子陣列

題目描述 給定義陣列a,長度為n,找出陣列a中的最大子陣列,例如陣列a 則最大子陣列為。使用分治策略的求解方法 假定我們要尋找子陣列a low.high 的最大子陣列,使用分治法意味著我們要將子陣列劃分為兩個規模盡可能相等的子陣列。也就是說,找到子陣列的 位置,比如mid,然後求解兩個子陣列a lo...

演算法導論 分治策略

最大非空陣列問題 1.分解 將問題劃分為規模更小的自問題。2.解決 遞迴的地解出子問題。3.合併 將子問題的解組合成原問題的解。1.代入法 2.遞迴樹法 3.主方法找出陣列的最大連續非空子陣列複雜度 n 2 偽 max subarry a max infinity for i 0 to a.leng...