分治法解決最大子陣列問題

2021-08-17 23:23:07 字數 830 閱讀 2812

演算法導論中一道很有趣的演算法入門題目,問題是解決最大子陣列的問題,給你乙個陣列,要求你求出其中和最大的連續子陣列,最簡單的思考方式就是暴力求解,對所有的情況都進行組合然後得出最大值,但是這個複雜度是n²,為了減少複雜度,演算法導論提供了一種思路,就是用分治法解決最大子陣列的問題

。我們首先將要求的陣列從中間分開,這就意味著最大子陣列的求解會分為三種情況:

一:完全位於子陣列【low,mid】中。則low≤i≤j≤mid。

二:完全位於子陣列【mid+1,high】中。則mid+1≤i

≤j≤high

三:跨越了中點。則low≤i≤mid<j≤high。

最大子陣列必然屬於這三種情況,先是第三種情況,跨越了中點,這意味著子陣列必然包括中點,我們只需從中點向兩邊擴散即可求出最大和。

//find_max_crossing_subarray

public int fmcs(int a,int low,int high)

}//求出左邊部分的最大和

sum = 0;

for(int j = mid+1;j<= high;j++)

}//求出右邊部分的最大和

return leftsum+rightsum;

}

接著就是分治求出最大和的問題

//find_maximum_subarray

public static int fms(int a,int low,int high)

}

分治法的複雜度是nlgn,但是我寫的這部分有乙個缺陷,我這個程式僅僅能求出最大和,但是不能求出子陣列的起始位置和結束位置。

分治法解決最大子陣列問題

利用分治法解決最大子陣列問題 對給定的陣列得到該陣列中具有最大和的子陣列 對於給定的整數陣列a,求出陣列中具有最大和的子陣列,最大和以及左右下標 思路 採用分治的方法,將陣列分為兩部分,則有最大和的子陣列共有三種情況 在陣列左邊,在陣列右邊,跨越陣列中點 include using namespac...

分治法解決最大子陣列問題

問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...

分治法解決最大子陣列問題

問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...