分治法思想
分解:子陣列一定被原陣列左邊或者右邊包含,或者跨越原陣列mid下標。
解決:前兩種完全包含的情況形成子問題遞迴求解,並且縮小了問題規模,後一種是我們要解決的問題。
合併:剩餘的問題是求跨越mid的最大子陣列,並且從三種情況中選出和最大的。
另外 算導中偽**返回的是三元組,這裡實現的話用結構體返回座標和值。
#include
#include
typedef struct node node;
//找到包含mid下標的最大和陣列
node find_max_cross(int arr, int left, int right, int mid)
}leftsum = max;
max = int_min;
int rightsum = 0;
int rightpos = mid;
for (i = mid+1; i <= right; i++)
}rightsum = max;
node tmp = ;
return tmp;
}node find_max_subarr(int arr, int left, int right)
//三種情況,完全包含於左/右,跨越中點
int mid = left + ((right - left) >> 1);
node leftnode = find_max_subarr(arr, left, mid);
node rightnode = find_max_subarr(arr, mid+1, right);
//合併子問題
node cross = find_max_cross(arr, left, right, mid);
if (leftnode.sum > cross.sum && leftnode.sum > rightnode.sum)
else
if (rightnode.sum > cross.sum && rightnode.sum > leftnode.sum)
else
}int main()
; int
length = sizeof(arr) / sizeof(arr[0]);
node ret = find_max_subarr(arr, 0, length - 1);
}
演算法導論 最大子陣列
之前都在準備考試,寒假還是繼續學習。除了家裡打掃衛生,似乎也確實沒什麼事。多看書,多寫 總能提高的。堅持。這次學到了函式返回值可以是乙個結構體,當我們要返回多個值的時候,就可以返回結構體。還有就是對分治法有了更深的認識。include typedef struct op op findmaxcros...
演算法導論之三最大子陣列問題
最大子陣列是陣列a的和最大的非空連續子陣列。只有當陣列中包含負數時,最大子陣列問題才有意義。注意將實際問題轉化為數學問題!使用分治策略的求解方法 為尋找a low.high 的最大子陣列,其 位置記為mid,然後考慮求解兩個子陣列a low.mid 和a mid 1.high a low.high ...
演算法導論3 最大子陣列問題 2016 1 3
頂著期末複習的壓力,還是在今天過完之前看完了乙個演算法 最大子陣列問題。演算法導論 中引入這個問題是通過 的購買與 經過問題轉換 換的過程比較簡單,但是不好想 將前一天的當天的 差價重新表示出來,即轉為了乙個最大子陣列的問題 具體內容是 13,3,25,20,3,16,23,18,20,7,12,5...