分治法求解最大数组

来源:互联网 发布:自学编程 知乎 编辑:程序博客网 时间:2024/05/17 04:52

分治法求解最大数组

假如我们要寻找Array[LOW...high]的最大数组,使用分治法意味着我们要将数组划分成两个规模尽量相等的子数组,

也就是找到中央位置mid,然后求解Array[low,mid] 和Array[mid,high] ,Array[low...high] 的连续子数组Array[i..j]所处的位置必然只有三种情况:


--完全位于左侧数组

--完全位于右侧数

--跨过中点


左右两侧又分别是最大子数组问题,只是规模更小,因此,剩下的全部工作就是寻找跨越中点的最大子数组

注意:跨过中点的情况每次都进行判断计算


  1. subArray_Data Find_Cross_Max_SubArray(int32_t array[],  
  2.     int32_t low, int32_t mid, int32_t high)  
  3. {//查找跨越中点的最大数组  
  4.     int32_t left_sum = -2147483648;  
  5.     int32_t sum = 0;  
  6.     int32_t max_left = 0;  
  7.     for (int32_t _i = mid; _i >= low; _i--) {  
  8.         sum += array[_i];  
  9.         if (sum > left_sum)   
  10.         { left_sum = sum; max_left = _i;}  
  11.     }  
  12.   
  13.     int32_t right_sum = -2147483648;  
  14.     sum = 0;  
  15.     int32_t max_right = 0;  
  16.     for (int32_t _i = mid + 1; _i <= high; _i++) {  
  17.         sum += array[_i];  
  18.         if (sum > right_sum)  
  19.         { right_sum = sum; max_right = _i; }  
  20.     }  
  21.     subArray_Data cross_Max_SubArray;  
  22.     cross_Max_SubArray.low = max_left;  
  23.     cross_Max_SubArray.high = max_right;  
  24.     cross_Max_SubArray.sum = left_sum + right_sum;  
  25.     return cross_Max_SubArray;  
  26. }  
  27.   
  28. subArray_Data Find_Max_SubArray(int32_t array[],  
  29.     int32_t low, int32_t high)  
  30. {//查找最大数组  
  31.   
  32.     if (low == high) {  
  33.         subArray_Data Max_SubArray;  
  34.         Max_SubArray.low = low;  
  35.         Max_SubArray.high = high;  
  36.         Max_SubArray.sum = array[low];  
  37.         return Max_SubArray;  
  38.     }  
  39.     else   
  40.     {  
  41.         int32_t mid = (low + high) / 2;  
  42.   
  43.         subArray_Data Left_Max_SubArray =   
  44.             Find_Max_SubArray(array,low,mid);  
  45.         subArray_Data Right_Max_SubArray =  
  46.             Find_Max_SubArray(array, mid + 1, high);  
  47.         subArray_Data Cross_Max_SubArray =  
  48.             Find_Cross_Max_SubArray(array, low, mid, high);  
  49.   
  50.         if (Left_Max_SubArray.sum >= Right_Max_SubArray.sum &&  
  51.             Left_Max_SubArray.sum >= Cross_Max_SubArray.sum)  
  52.             return Left_Max_SubArray;  
  53.         else if (Right_Max_SubArray.sum >= Left_Max_SubArray.sum &&  
  54.             Right_Max_SubArray.sum >= Cross_Max_SubArray.sum)  
  55.             return Right_Max_SubArray;  
  56.         else return Cross_Max_SubArray;  
  57.     }  
  58.   
  59. }  

0 0