最大子列和問題

將一個問題的算法複雜度O(n^3)幹道O(n^2)到O(nlog2n)到O(n)的過程是多麼的feel at easy。

算法的魅力,解決同一大數量級問題的快與慢,明顯體現,請擼碼體驗

測試源碼:https://github.com/linrenyao/Algorithm/blob/master/MaxSumSubList.cpp

 //窮舉 O(n^3) 
  int algorithm1(int list[],int n) {
      int MaxSum = 0,TempSum = 0;
      for (int i = 0; i < n; i++) {
          for (int j = i; j < n; j++) {
              TempSum = 0;
              for (int k = j; k < n; k++) {
                  TempSum += list[k];
                  if (TempSum > MaxSum) MaxSum = TempSum;
              }
          }
      }
      return MaxSum;
  }
  //優化後的窮舉,去除不必要的重複累加 O(n^2)
  int algorithm2(int list[], int n) {
      int MaxSum = 0, TempSum = 0;
      for (int i = 0; i < n; i++) {
          TempSum = 0;
          for (int j = i; j < n; j++) {
              TempSum += list[j];
              if (TempSum > MaxSum) MaxSum = TempSum;
          }
      }
      return MaxSum;
  }

 

  //分治算法(分兒治之,先分後治)    0(nlog2n)
  int algorithm3(int *list,int start,int end) {
      int mid = (end + start) / 2;
      int num = (end - start) / 2;
      if (num >= 1) {
          int leftMaxSubListSum, RightMaxSubListSum;
          //遞歸左半部
          leftMaxSubListSum = algorithm3(list, start, mid);
          //遞歸右半部
          RightMaxSubListSum = algorithm3(list, mid, end);
          //求左右兩部分的最大子序列和
          int MaxSubListSum = 0, TempSubListSum = 0;
          int i = 0;
          while (num--) {
              TempSubListSum += list[mid-1-i];
              if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
              TempSubListSum += list[mid+i];
              if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
              i++;
          }
          //比較三個序列和
          int maxSum = max(leftMaxSubListSum, RightMaxSubListSum) > MaxSubListSum ? max(leftMaxSubListSum, RightMaxSubListSum) : MaxSubListSum;
          return maxSum;
      }
      else{
          //當序列中只有一個元素則返回,當前序列的唯一和,startindx 和endindx 差1
          int MaxSubListSum = 0, TempSubListSum = 0;
          for (int i = start; i < end; i++) {
              TempSubListSum += list[i];
              if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
          }
          return MaxSubListSum;
      }
  }

在線算法:選擇當前相對解。 

  //在線處理算法 O(n)
  int algorithm4(int list[], int n) {
      int MaxSum = 0, TempSum = 0;
      for (int i = 0; i < n; i++) {
          TempSum += list[i];
          if (TempSum > MaxSum) MaxSum = TempSum;
          else if(TempSum < 0) TempSum = 0;
      }
      return MaxSum;
  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章