算法-连续项的最大和问题(最大子数组问题)三种不同解法
生活随笔
收集整理的這篇文章主要介紹了
算法-连续项的最大和问题(最大子数组问题)三种不同解法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
連續項的最大和問題
(1)暴力求解 時間復雜度 O(n^2)
(2)分治求解 時間復雜度 O(nlogn)
(3) 線性求解 時間復雜度 O(n)
C#代碼
using System; using System.Collections.Generic;namespace dataLearn {class Program{static void Main(string[] args){List<int> list1 = new List<int> { -2, 4, -1, 3, 5, -6, 1, 2 };List<int> list2 = new List<int> { 4, 1, -3, 7, -1, -5, 3, -2 };List<int> list3 = new List<int> { -1, 6, 3, -4, -5, 8, -1, 7 };var max1 = MaxSumViolence(list1, 0, list1.Count - 1);Console.WriteLine(max1.start + " " + max1.end + " " + max1.value);var max2 = MaxSumViolence(list2, 0, list2.Count - 1);Console.WriteLine(max2.start + " " + max2.end + " " + max2.value);var max3 = MaxSumViolence(list3, 0, list3.Count - 1);Console.WriteLine(max3.start + " " + max3.end + " " + max3.value);var max4 = MaxSum(list1, 0, list1.Count - 1);Console.WriteLine(max4.start + " " + max4.end + " " + max4.value);var max5 = MaxSum(list2, 0, list2.Count - 1);Console.WriteLine(max5.start + " " + max5.end + " " + max5.value);var max6 = MaxSum(list3, 0, list3.Count - 1);Console.WriteLine(max6.start + " " + max6.end + " " + max6.value);}static (int start,int end,float value) MaxSumViolence(List<int> list ,int start,int end){int s = start, e = end;int max = list[start];for(int i=start;i<end+1;i++){int total = list[i];for(int j=i+1;j<end+1;j++){total += list[j];if(total>max){max = total;s = i;e = j;}}}return (s, e, max);}static (int start,int end,float value) MaxSum(List<int> list,int start,int end){if (start != end){int middle = (start + end) / 2;var leftMax = MaxSum(list, start, middle);var rightMax = MaxSum(list, middle + 1, end);var max = leftMax.value > rightMax.value ? leftMax : rightMax;int l = middle, r = middle + 1;float lvalue = list[middle];float rvalue = list[middle + 1];float temp = lvalue;for (int i = middle - 1; i >= start; i--){temp += list[i];if (temp > lvalue){l = i;lvalue = temp;}}temp = rvalue;for (int i = middle + 2; i <= end; i++){temp += list[i];if (temp > rvalue){r = end;rvalue = temp;}}if (max.value < lvalue + rvalue){return (l, r, lvalue + rvalue);}else return max;}elsereturn (start, start, list[start]);}} }c++ 代碼
數據結構
暴力求解法:時間復雜的O(n^2)
SubarrayResult brute_force_find_maximum_subarray(int *arr,int start,int end) {int max_sum = INT_MIN;int sum = 0;int low = 0;int high = 0;for (int i = start; i < end+1; ++i) {sum = 0;for (int j = i; j < end+1 ; ++j) {sum += arr[j];if(sum>max_sum){max_sum = sum;low = i;high = j;}}}return SubarrayResult(max_sum,low,high); }分治遞歸求解法:
T(n)=2T(n/2)+θ(n)
時間復雜度(nlgn)
線性求解法:
時間復雜度O(n)
總結
以上是生活随笔為你收集整理的算法-连续项的最大和问题(最大子数组问题)三种不同解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法-二分搜索-找出最大值和次大值
- 下一篇: 算法-排序-插入排序