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

2022-04-21 21:46:20 字數 1799 閱讀 3424

頂著期末複習的壓力,還是在今天過完之前看完了乙個演算法——最大子陣列問題。

《演算法導論》中引入這個問題是通過**的購買與**,經過問題轉換**換的過程比較簡單,但是不好想),將前一天的當天的**差價重新表示出來,即轉為了乙個最大子陣列的問題 ,具體內容是:

13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7   找到這連續的16個數裡面的連續和最大的子陣列;

書中差不多是這個意思:假定我們要尋找子陣列a[low..high]的最大子陣列,使用分治法意味著我們要將子陣列劃分為兩個規模盡可能相等的子陣列。也就是說,找到子陣列的**位置,比如mid,然後求解兩個子陣列a[low..mid]和a[mid + 1..high]。所以,a[low..high]的任何連續子陣列a[i..j]所處的位置必然是三種情況之一:   1.完全位於子陣列a[low..mid]中, 因此low<=i<=j<=mid;   2.完全位於子陣列a[mid + 1..high]中,因此mid<=i<=j<=high;   3.跨越了中點,因此low<=i<=mid   因此,a[low..high]的乙個最大子陣列所處的位置必然是這三種情況之一。實際上,a[low..high]的乙個最大子陣列必然是完全位於a[low..mid]中、完全位於a[mid + 1..high]中或者跨越中點的所有子陣列中和最大者。

參看原問題的話可以看一下這個部落格(大神寫的比我好多啦qaq):

所以又是乙個二分的遞迴,複雜度nlgn。(看了網上有一些動態規劃n複雜度的以後有空在學學)

根據這個分治法的話,如果我想知道整個陣列的最大子陣列,只需要知道前半部分的最大子陣列,後半部分的最大子陣列,還有跨越中間的最大子陣列。

怎麼知道前半部分的最大子陣列?遞迴。

怎麼知道後半部分的最大子陣列?遞迴。

怎麼知道跨越中間的最大子陣列?有乙個線性複雜度的演算法。因為有限制,必須跨越中間。所以假定做乙個函式

int maxcrossarray(int *a,int l,int mid,int r,int *ll,int *rr);  //用來找跨越mid的最大子陣列

只需要從mid向左找,記錄下最大值k1,從mid向右找,記錄下最大值k2,返回k1+k2即可。int *ll,int *rr是用來記錄路徑的。

這樣就遞迴的把問題解決了。

下面是**:

#includeint maxcrossarray(int *a,int l,int mid,int r,int *ll,int *rr)

}sum=0

;

int rmax=-100000

;

for (i=mid+1;i<=r;i++)

}*ll=li;

*rr=ri;

return (lmax+rmax);

}int maxsonarray(int *a,int l,int r,int *ll,int *rr)

else

if (k2>k1 && k2>k3)

*ll=l3;

*rr=r3;

return

k3; }

}int

main()

;

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

intl,r;

int ans=maxsonarray(a,1,n,&l,&r);

printf(

"%d\n%d %d

",ans,l,r);

return0;

}

說實話這個**是照搬偽**,細節上還不夠嚴謹,還有待修改。

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

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

演算法導論 最大子陣列

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

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

最大子陣列是陣列a的和最大的非空連續子陣列。只有當陣列中包含負數時,最大子陣列問題才有意義。注意將實際問題轉化為數學問題!使用分治策略的求解方法 為尋找a low.high 的最大子陣列,其 位置記為mid,然後考慮求解兩個子陣列a low.mid 和a mid 1.high a low.high ...