演算法導論2 最大子陣列

2021-06-20 08:45:22 字數 1729 閱讀 5674

最大子陣列問題

假設陣列a[low..high],求存在於陣列a中的連續子陣列之和(或陣列中連續元素之和)最大的子陣列,例如a[4]=的最大子陣列為a[0->2]和最大為3+(-2)+1=2。

如果採用暴力求解的演算法則問題也可以很簡單的求解出來,不過這種方法的時間複雜度為ω(n²),所以寫一下更好的方法。

使用分治策略的求解方法

直接引用書上的語言(我認為書上總結的比我好),假定我們要尋找子陣列a[low..high]的最大子陣列。使用分治技術意味著我們要將子陣列劃分為兩個規模盡量相等的組陣列,也就是說,找到子陣列的**位置,比如mid,然後考慮求解兩個子陣列a[low..mid]和a[mid+1..high]。a[low..high]的任何連續子陣列a[i..j]所處的位置必然是一下三種情況。

完全位於陣列a[low..mid]中,因此low<=i<=j<=mid。

完全位於陣列a[mid+1..high]中,因此mid跨越了中點,因此 low<=i<=mid<=j<=high。

因此a[low..high]的乙個最大子陣列所處的位置必然是這三種情況之一。

自己寫的**如下歡迎指正

/*

程式中low為陣列下界,high為上界,mid為中間,sum為和

*/#include //定義結構體包含子陣列的上界,下界,和

//為了接收返回子陣列的上界,下界與陣列和這三個引數,我採用了結構體的方法解決了c中return只能返回乙個引數的問題。

typedef structsubarry;

subarry find_max_crossing_subarry(int*a,int low,int mid,int high);//求解跨越了中點的

subarry find_maximum_subarry(int*a,int low,int high);//完全位左右子陣列中

int main ()

;//測試資料

subarry result;

int length=sizeof(a)/sizeof(int);

result=find_maximum_subarry(a,0,length-1);

//列印原陣列

printf("原陣列為:");

for(int i=0;i%d\n",result.sum,result.low,result.high);

return 0;

}//完全位左右子陣列中

subarry find_maximum_subarry(int*a,int low,int high)

else

else if(subarryright.sum > subarryleft.sum && subarryright.sum > subarrycross.sum)

else

}}//求解跨越了中點的

subarry find_max_crossing_subarry(int*a,int low,int mid,int high)

} int right_sum = -1000;

sum = 0;

max_right=mid+1;

for(i=mid+1;i<=high;i++) }

//返回值

cross.low=max_left;

cross.high=max_right;

cross.sum=right_sum+left_sum;

return cross;

}

演算法導論 最大子陣列

之前都在準備考試,寒假還是繼續學習。除了家裡打掃衛生,似乎也確實沒什麼事。多看書,多寫 總能提高的。堅持。這次學到了函式返回值可以是乙個結構體,當我們要返回多個值的時候,就可以返回結構體。還有就是對分治法有了更深的認識。include typedef struct op op findmaxcros...

演算法導論 尋找最大子陣列

求最大子陣列 include using namespace std struct result structure result structure mid array sum int a,int low,int mid,int high sum 0 result.high index mid 1...

最大子陣列問題 演算法導論

分治法思想 分解 子陣列一定被原陣列左邊或者右邊包含,或者跨越原陣列mid下標。解決 前兩種完全包含的情況形成子問題遞迴求解,並且縮小了問題規模,後一種是我們要解決的問題。合併 剩餘的問題是求跨越mid的最大子陣列,並且從三種情況中選出和最大的。另外 算導中偽 返回的是三元組,這裡實現的話用結構體返...