分治法求解最大数组
来源:互联网 发布:自学编程 知乎 编辑:程序博客网 时间:2024/05/17 04:52
分治法求解最大数组
假如我们要寻找Array[LOW...high]的最大数组,使用分治法意味着我们要将数组划分成两个规模尽量相等的子数组,
也就是找到中央位置mid,然后求解Array[low,mid] 和Array[mid,high] ,Array[low...high] 的连续子数组Array[i..j]所处的位置必然只有三种情况:
--完全位于左侧数组
--完全位于右侧数组
--跨过中点
左右两侧又分别是最大子数组问题,只是规模更小,因此,剩下的全部工作就是寻找跨越中点的最大子数组
注意:跨过中点的情况每次都进行判断计算
- subArray_Data Find_Cross_Max_SubArray(int32_t array[],
- int32_t low, int32_t mid, int32_t high)
- {//查找跨越中点的最大数组
- int32_t left_sum = -2147483648;
- int32_t sum = 0;
- int32_t max_left = 0;
- for (int32_t _i = mid; _i >= low; _i--) {
- sum += array[_i];
- if (sum > left_sum)
- { left_sum = sum; max_left = _i;}
- }
- int32_t right_sum = -2147483648;
- sum = 0;
- int32_t max_right = 0;
- for (int32_t _i = mid + 1; _i <= high; _i++) {
- sum += array[_i];
- if (sum > right_sum)
- { right_sum = sum; max_right = _i; }
- }
- subArray_Data cross_Max_SubArray;
- cross_Max_SubArray.low = max_left;
- cross_Max_SubArray.high = max_right;
- cross_Max_SubArray.sum = left_sum + right_sum;
- return cross_Max_SubArray;
- }
- subArray_Data Find_Max_SubArray(int32_t array[],
- int32_t low, int32_t high)
- {//查找最大数组
- if (low == high) {
- subArray_Data Max_SubArray;
- Max_SubArray.low = low;
- Max_SubArray.high = high;
- Max_SubArray.sum = array[low];
- return Max_SubArray;
- }
- else
- {
- int32_t mid = (low + high) / 2;
- subArray_Data Left_Max_SubArray =
- Find_Max_SubArray(array,low,mid);
- subArray_Data Right_Max_SubArray =
- Find_Max_SubArray(array, mid + 1, high);
- subArray_Data Cross_Max_SubArray =
- Find_Cross_Max_SubArray(array, low, mid, high);
- if (Left_Max_SubArray.sum >= Right_Max_SubArray.sum &&
- Left_Max_SubArray.sum >= Cross_Max_SubArray.sum)
- return Left_Max_SubArray;
- else if (Right_Max_SubArray.sum >= Left_Max_SubArray.sum &&
- Right_Max_SubArray.sum >= Cross_Max_SubArray.sum)
- return Right_Max_SubArray;
- else return Cross_Max_SubArray;
- }
- }
0 0
- 分治法求解最大数组
- 分治法求解最大子数组问题
- 分治法求解最大子数组问题
- 【算法学习】最大子数组问题的分治法求解
- 算法基础-分治法求解最大子数组(Java)
- 分治策略求解最大子数组问题
- 分治求解最大最小值
- 运用分治法和动态规划方法求解最大子数组问题
- 分治策略求解子数组最大和并输出下标
- 最大子数组问题的分治求解算法
- 算法导论--分治策略求解最大子数组问题
- 分治法--最大子数组
- 分治法-最大子数组
- 最大子序列求解 分治法和动态规划
- 分治法查找数组最大最小值
- DC分治法求数组最大最小值
- [算法导论]分治法---最大子数组
- 利用分治法求最大子数组
- MSP430数码管的使用Ⅱ
- 模拟struts拦截器
- python学习笔记1
- 程序员面试金典: 9.13 C和C++ 13.9编写对齐的malloc和free函数。
- 392. Is Subsequence
- 分治法求解最大数组
- LTE的小区搜索和PBCH接收
- 分布式MySQL集群方案的探索与思考
- Builder构建者模式 通用模板
- 看日志
- 异常类型_异常变量的生命周期
- VI的虚拟编辑-Visual(3)
- js常见问题汇总(不定期更新)
- Android学习-传感器的使用