資料結構 演算法效率與最大子列和問題

2021-08-28 03:47:02 字數 2203 閱讀 4757

計算機執行**時會根據輸入資料的大小和演算法效率來消耗一定的處理器資源。高效執行的程式需要考慮演算法的效率。演算法效率主要由以下兩個複雜度來評估:

時間複雜度t(n):根據演算法的程式執行時耗費時間的長度。

空間複雜度s(n):根據演算法執行時占用儲存單元的長度。

演算法效率往往存在極值,即極大值和極小值,但是這些極大資料經常不貼近實際情況,沒有實際意義。我們用o(x)時往往表示最小的上界(最優值, 最好的情況),ω(x)表示最大的下界(最差值,最壞的情況)。

下列是各種模型的複雜度:

時間複雜度分析:

1)兩段演算法相加,複雜度等於其中最大值;

2)兩端演算法相乘,複雜度等於兩複雜度相乘;

3)for迴圈的時間複雜度等於迴圈次數乘迴圈體**的複雜度;

4)if-else結構:取每段**中結構複雜度的最大值;

應用例項——最大子列和問題:

1、最直接、最暴力的方法就是算出所有的子列和,找其中的最大值;

int maxsubseqsum1( int a, int n )  

/* j迴圈結束 */

} /* i迴圈結束 */

return maxsum;

}

可知該**的時間複雜度是o(n^3),時間成本明顯很大,不是很理想;資料量n很大時很恐怖。資料量大的關鍵問題在於: j每加一次,thissum就清零重新求和,增加了額外的計算負擔。

2、基於上述問題的簡化:

int maxsubseqsum1( int a, int n )  

/* j迴圈結束 */

} /* i迴圈結束 */

return maxsum;

}

可知,以上**的執行效率是o(n^2);

3、進一步簡化執行效率——分而治之:

把大問題切成小塊分別解決,然後再把結果合併:

思路是:先分別在左右找最大值,最終比較得出最大值;

但是,這一定是最大值嗎?萬一有跨越中界限的最大子列和存在呢?

所以,最大值應該存在於這三個結果裡面。跨越中線的值的情況我們採用從中線向兩邊掃瞄的方法來尋找最大子列。貼**:

int max3( int a, int b, int c )

int divideandconquer( int list, int left, int right )

/* 下面是"分"的過程 */

center = ( left + right ) / 2; /* 找到中分點 */

/* 遞迴求得兩邊子列的最大和 */

maxleftsum = divideandconquer( list, left, center );

maxrightsum = divideandconquer( list, center+1, right );

/* 下面求跨分界線的最大子列和 */

maxleftbordersum = 0; leftbordersum = 0;

for( i=center; i>=left; i-- )

/* 左邊掃瞄結束 */

maxrightbordersum = 0; rightbordersum = 0;

for( i=center+1; i<=right; i++ )

/* 右邊掃瞄結束 */

/* 下面返回"治"的結果 */

return max3( maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum );

}int maxsubseqsum3( int list, int n )

int maxsubseqsum4( int a, int n )  

return maxsum;

}

演算法描述只有乙個for迴圈和常數級的if-else,演算法複雜度為o(n);

資料結構與演算法 最大子列和問題

問題 給定n個整數序列,求該序列中存在的最大的連續n個整數和。分析 方法1 最自然的方法是設定子列和的左端索引i和右端索引j,然後通過遍歷的方法找出最大的子列和,其中最簡單的陣列求和也是遍歷相加,因此將會有三層迴圈,計算複雜度為o n 3 為 int maxsum1 int a,int n int ...

資料結構與演算法題目集(中文)7 1 最大子列和問題

題目鏈結 7 1 最大子列和問題 輸入樣例 6 2 11 413 5 2 輸出樣例 20解題思路dp入門題 做完這道題可以去看一下洛谷上的傳送門 p1115 最大子段和,跟這道題一模一樣 附上 include define int long long define lowbit x x x usin...

資料結構 最大子列和問題

最大子列和問題 20 分 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點...