最大子列和的四种算法比较
2016-11-23 20:46
453 查看
本文将会介绍最大子列和的四种不同复杂度算法。
算法一:暴力枚举法,算法复杂度为O(N三次方)
算法二:算法一的改进,减少一个for循环,复杂度为O(N平方)
算法三:分而治之。算法复杂度为O(NlogN)
算法四:在线处理算法,代码最简单,且复杂度最低,为O(N)
主程序如下
以上即为求最大子列和的四种算法。
算法一:暴力枚举法,算法复杂度为O(N三次方)
int maxsequence1(int A[], int N) { int ThisSum , MaxSum=0; int i, j, k; for (i = 0; i <= N; i++) { for (j = i; j <= N; j++) { ThisSum = 0; for (k = i; k <= j; k++) ThisSum += A[k]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }
算法二:算法一的改进,减少一个for循环,复杂度为O(N平方)
int maxsequence2(int A[], int N) { int ThisSum, MaxSum = 0; int i, j; for (i = 0; i <= N; i++) { ThisSum = 0; for (j = i; j <= N; j++) { ThisSum += A[j]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }
算法三:分而治之。算法复杂度为O(NlogN)
int Max(int A, int B, int C) { /*return A > B ? A > C ? A :C: B > C ? B : C;*/ if (A > B) { if (A > C) return A; else return C; } else if (B > C) return B; else return C; } int DivideAndConquer(int List[], int left, int right) { int MaxLeftSum, MaxRightSum; int MaxLeftBoardSum, MaxRightBoardSum; int LeftBoardSum, RightBoardSum; int center,i; /*递归终止条件*/ if (left == right) { if (List[left] > 0) return List[left]; else return 0; } center = (right + left) / 2; MaxLeftSum = DivideAndConquer(List, left, center); MaxRightSum= DivideAndConquer(List, center+1, right); MaxLeftBoardSum = 0; LeftBoardSum = 0; for (i = center;i >= left; i--) LeftBoardSum += List[i]; if (LeftBoardSum > MaxLeftBoardSum) MaxLeftBoardSum = LeftBoardSum; MaxRightBoardSum = 0; RightBoardSum = 0; for (i = center + 1; i <= right; i++) RightBoardSum += List[i]; if (RightBoardSum > MaxRightBoardSum) MaxRightBoardSum = RightBoardSum; return Max(MaxLeftSum, MaxRightSum, MaxRightBoardSum + MaxLeftBoardSum); } int maxsequence3(int A[], int N) { return DivideAndConquer(A, 0, N-1); }
算法四:在线处理算法,代码最简单,且复杂度最低,为O(N)
int maxsequence4(int A[], int N) { int ThisSum,MaxSum ; int i; ThisSum = MaxSum = 0; for (i = 0; i <= N; i++) { ThisSum += A[i]; if (ThisSum > MaxSum) MaxSum = ThisSum; else if (ThisSum < 0) ThisSum = 0; } return MaxSum; }
主程序如下
#include <stdio.h> int maxsequence1(int A[], int N); int maxsequence2(int A[], int N); int maxsequence3(int A[], int N); int maxsequence4(int A[], int N); int main(void) { int K,j=0; int a,max; int num[100000]; printf("请输入数字个数:\n"); scanf("%d", &K); printf("请输入%d个数字\n", K); for (a = 0; a < K; a++) { scanf("%d", &num[a]); if (num[a] < 0) j++; } if (j == K) printf("0\n"); else { /*用哪个选哪个*/ max = maxsequence1(num, K); max = maxsequence2(num, K); max = maxsequence3(num, K); max = maxsequence4(num, K); printf("最大子列和为:%d\n", max); } }
以上即为求最大子列和的四种算法。
相关文章推荐
- 求最大子列和的四种算法
- 求最大子列和问题两种算法比较
- 最大子序列和的四种求解算法及其时间比较
- 求最大连续子列和的算法和时间复杂度的分析(包含四种不同时间复杂度的算法)
- 最大子列和问题的四种不同时间复杂度的算法实现
- 最大子列和 四种算法
- 最大子列和的几种算法比较
- 最大子列和的四种算法总结
- 求解最大子列和问题的四种算法
- 【算法学习笔记】19.算法设计初步 最大子列和问题的三种方法
- 两种数据库,四种分页算法的效率比较
- 四种寻路算法并比较
- HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】
- 四种寻路算法计算步骤比较
- 【测试】两种数据库,四种分页算法的效率比较
- 基础算法之最大子列求和问题
- hdu 1087 Super Jumping! Jumping! Jumping!(DP 两个for循环,比较最靠近小于它的的子列最大值)
- 最大流最小割算法; BFS搜索增广路径; 算法简单,打印结果也比较清晰;
- 求序列中连续相邻元素之和最大值的四种算法
- 文本比较算法Ⅵ——用线性空间计算最大公共子序列(翻译贴)