最近在學習計算機專業課,資料結構課程。在中國大學mooc網上選修了浙大的《資料結構》課程。最近課程講到了最大子串行和的問題,結合課程內容、網上的資料借鑑和自己的理解,將解決這個問題的四種不同的演算法進行實現和總結。整個工程的**已經上傳。
問題描述:
主函式**如下:
#include#includeusing namespace std;
#define num_sum 10
int a[num_sum] = ;
int maxsubseqsum1(int a, int n);
int maxsubseqsum2(int a, int n);
int maxsubseqsum3(int a, int n);
int maxsubseqsum4(int a, int n);
int getbordersubseqsum(int a, int left, int right);
int main()
演算法一:暴力求解,時間複雜度:n*n*n。**實現如下:
//暴力求解
//時間複雜度為: n*n*n
int maxsubseqsum1(int a, int n)
} return maxsum;
}
複雜度浪費在第三個for迴圈。
演算法二:時間複雜度:n*n*。**實現如下:
//複雜度為n*n的演算法
int maxsubseqsum2(int a, int n)
} return maxsum;
}
思想:左邊的起始端每變化一次將thisnum置0一次,左邊起始端定了,在左邊起始端到最右邊分別有n-i個不同的子列,但是這些子列起始端都是i的位置,每次左邊起始端定了,在後面的n-i個子列中求取和最大的那個值,然後在改變左邊的起始端。
演算法三:分而治之演算法,時間複雜度n*logn。**實現如下:
/分為治之的思想
//時間複雜度為n*logn
int maxsubseqsum4(int a, int n)
return getbordersubseqsum(a, left, right);
}//將乙個小的子列塊求其最大列和
//該函式是乙個遞迴呼叫的函式
int getbordersubseqsum(int a, int left, int right)
//獲取邊界
int mid = (left+right)/2;
int nbordermaxsum = 0; //左右最大列和值
//獲取左右兩快中最大和數
int nmaxleftnum = getbordersubseqsum(a, left, mid);
int nmaxrightnum = getbordersubseqsum(a, mid+1, right);
//考慮中間這一一種情況
//1向左檢索
int ntempmaxleftsum =0; //左邊檢索的最大和值
int nleftsum=0;
for(int i=mid;i>=left;i--)
//2、向右檢索
int ntempmaxrightsum =0; //右邊檢索的最大和值
int nrightsum=0;
for(int i=mid+1;i<=right;i++)
nbordermaxsum = ntempmaxleftsum+ntempmaxrightsum;
//對nbordermaxsum、nmaxleftnum、nmaxrightnum三者取最大的
if(nmaxleftnum>=nmaxrightnum)
else
}
分而治之的思想:就是將乙個列分成左右兩個部分,左右子列,分別求左右兩個子列的最大和數,再求跨越兩個子列的最大列和數,最後求三者中的最大值就是 所要求的的最大列和數。注意:這個演算法是利用遞迴的思想,考慮演算法的空間複雜度,如果輸入的資料量太大,可能造成演算法無法執行出正確結果。![](https://pic.w3help.cc/99d/7067751e091e4fe265eb77f34e072.jpeg)
int maxsubseqsum3(int a, int n)
return maxsum;
}
最大子列和問題的四種演算法
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 與樣例等價,...
求最大子列和的四種演算法
問題描述 有乙個陣列有正有負,問起最大的連續子列的和是多少。求最大子列和 a1,a2,a3.an 方法1,暴力搜尋 int maxsubseqsum1 int a,int n return max int maxsubseqsum2 int a,int n return max 分治法 int ma...
求最大子列和的四種方法
includeint maxsubseqsum2 int a,int n return maxsum int main int i,n scanf d n for i 0 i int max3 int a,int b,int c int divideandconquer int list,int l...