數據結構和算法-子序列和最大值問題(分治策略)


問題描述:存在序列A[1...n],序列中元素的值域為整數。求解序列A中子序列A[p,...,q]的元素和為最大值子序列?

解決思路 : 設m為↓[(1+n)/2]向下取整的即中點,則A最大值子序列在是下面序列中最大值子序列中之一

A[1,...,m](中點左側 包括中點)   

A[i,...,j] 其中1 <= i <= m < j <= n (橫跨中點)  

A[m+1,n](中點右側 不包括中點) 

這樣將求A最大值子序列問題轉移求A[1,...,m]、A[i,...,j] 其中1 <= i <= m < j <= n 、A[m+1,n]三者中最大值子序列的問題,獲取三者種最大一個;

1 先來獲取A[i,...,j] 其中1 <= i <= m < j <= n中最大子序列(橫跨中點)

偽代碼如下:

序列

FIX-MAX-CROSSING-SUBARRAY(A , low , mid , high) {

        // 先求A[low , mid]這端子序列最大值,因為要包括mid所以從mid開始

        left-sum = -∞;

        sum = 0;

        max-left;

        for (i = mid; i >= low; i++) {

           sum = sum + A[i];

           if(sum > letf-sum)  {

                left-sum = sum;

               max-left = i;

          }

       }

       // 再求A[mid+1, high]這端子序列最大值

       right-sum = -∞;

       sum = 0;

       max-right;

       for(i = mid+1; i <= high; i++) {

             sum = sum + A[i];       

            if(sum > right-sum)  {

                 right-sum = sum;

                 max-right = i;

          }

       }

       return (max-left , max-right , left-sum+right-sum);

}

這樣就可以獲取A[i,...,j] 其中1 <= i <= m < j <= n中最大子序列(橫跨中點)

2 A[1,...,m](中點左側 包括中點)   和  A[i,...,j] 其中1 <= i <= m < j <= n (橫跨中點) ,倆個序列 像針對A序列一樣進行分解,

直到分解成序列中元素只有1位,並且每次分解都需要調用 FIX-MAX-CROSSING-SUBARRAY(A , low , mid , high)  獲取橫跨中點序列的最大值;

偽代碼如下 :

FIND-MAXIMUM-SUBARRAY(A , low , high) {

    if (low == high) {

        // 分解序列元素為1停止

        return (low , high , A[low])

   } else {

        // 每次分解序列工作

        mid = ↓[(low+high)/2];

       // 分解中點左右倆端序列

       (left-low , left-high , left-sum) = FIND-MAXIMUM-SUBARRAY(A , low , mid);

       (right-low , right-high , right-sum) = FIND-MAXIMUM-SUBARRAY(A , mid+1 , high);

       // 求出包含中點元素的序列的最大子序列

       (cross-low , cross-high , cross-sum) = FIX-MAX-CROSSING-SUBARRAY(A , low , mid , high)

       // 獲取三個子序列中最大值最大那個

       if(left-sum >= right-sum and left-sum >= cross-sum) {

              return (left-low , left-high , left-sum)

       } else if(right-sum >= left-sum and right-sum >= cross-sum) {

             return (right-low , right-high , right-sum)

      } else {

            return (cross-low , cross-high , cross-sum)

     }

   }

}

 

通過遞歸調用可以求出序列A子序列和最大值問題

時間復雜度影響因素 : 序列項數

時間復雜度 : Θ(nlgn)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM