最大子列和問題的四種不同時間複雜度的演算法實現

2021-07-27 23:44:30 字數 2408 閱讀 5066

最近在學習計算機專業課,資料結構課程。在中國大學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

}

分而治之的思想:就是將乙個列分成左右兩個部分,左右子列,分別求左右兩個子列的最大和數,再求跨越兩個子列的最大列和數,最後求三者中的最大值就是 所要求的的最大列和數。注意:這個演算法是利用遞迴的思想,考慮演算法的空間複雜度,如果輸入的資料量太大,可能造成演算法無法執行出正確結果。

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...