逐步优化求解最大子序列和
生活随笔
收集整理的這篇文章主要介紹了
逐步优化求解最大子序列和
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
求解最大子序列和
tag: 數(shù)據(jù)結(jié)構(gòu)與算法
最大子序列和問(wèn)題:
給定序列A1, A2,... AN, 求最大的子序列和。
例如 :
對(duì)于序列4, -3, 5, -2, -1, 2, 6, -2, 最大序列和為11(4 -3 + 5 - 2 - 1 + 2 + 6)
算法一:
利用兩個(gè)循環(huán),第一個(gè)循環(huán)把序列遍歷一遍,第二個(gè)循環(huán)則從Ai累加到AN,每加一次判斷一下是否大于之前的最大子序列和:
int maxSubsequenceSum1 (const int arr[], int n) {int maxSum = 0;int temp;for (int i = 0; i < n; i++) {temp = 0;for (int j = i; j < n; j++) {temp += arr[j];if (temp > maxSum)maxSum = temp;}}return maxSum; }時(shí)間復(fù)雜度:O(n2)
算法二:
首先把序列從中間一分為二, 則最大子序列和的存在有三種情況:
對(duì)于第一和第二種情況,只需要遞歸調(diào)用求解函數(shù),對(duì)于第三種情況則要分別求出從中間出發(fā),向左邊和向右邊各自的最大子序列和。
時(shí)間復(fù)雜度:O(nlogn)
算法三:
累加序列,若發(fā)現(xiàn)當(dāng)前序列和大于之前最大序列和,則替換.若發(fā)現(xiàn)當(dāng)前序列和小于0,則將當(dāng)前序列和置換成0,相當(dāng)于把前面的序列都舍棄掉.
int maxSubsequenceSum3(int arr[], int n) {int tempSum = 0, maxSum = 0;for (int i = 0; i < n; i++) {tempSum += arr[i];if (tempSum < 0)tempSum = 0;if (tempSum > maxSum)maxSum = tempSum;}return maxSum; }時(shí)間復(fù)雜度:O(n)
轉(zhuǎn)載于:https://www.cnblogs.com/bgmind/p/3959193.html
總結(jié)
以上是生活随笔為你收集整理的逐步优化求解最大子序列和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ubuntu 12.10使用apt安装O
- 下一篇: EditText 空指针问题