最大子串和问题

question:
     Given an array that has positive and negative numbers, try to find a maximum subarray whose sum is the best.


暴力解法:    复杂度(N^2)
pseudo-code:

    FIND-MAXIMUM-SUBARRAY(A, low, high)
  1. sum = INT_MIN
  2. for i = low to high - 1
  3.     tmp_sum = A[i]
  4.     for j = i + 1 to high
  5.         tmp_sum = tmp_sum + A[j]
  6.         if tmp_sum > sum
  7.             sum = tmp_sum
  8.             left = i
  9.             right = j
  10. return (left, right, sum)
typedef struct
{
       int low ;
       int high ;
       int sum ;
} Array_Info;

Array_Info Find_Maximum_Subarray_Force (int A[], int low , int high )
{
       Array_Info result ;
       int i , j ;
       int sum ;

       result .sum = INT_MIN ;

       for ( i = low; i < high ; i ++)
       {
             sum = A[ i ];
             for ( j = i + 1 ; j <= high ; j ++)
             {
                   sum += A[ j ];
                   if ( sum > result. sum )
                   {
                         result .low = i ;
                         result .high = j ;
                         result .sum = sum ;
                   }
             }
       }
       return result ;
}
// can not to solve the array that all the numbers are negitive



分治法:    复杂度(NlogN)

pseudo-code:

    FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high)
  1. left-sum = INT_MIN
  2. sum = 0
  3. for i = mid downto low
  4.     sum = sum + A[i]
  5.     if sum > left-sum
  6.         left-sum = sum
  7.         max-left = i
  8. right-sum = INT_MIN
  9. sum = 0
  10. for j = mind + 1 to high
  11.     sum = sum + A[j]
  12.     if sum > right-sum
  13.         left-sum = sum
  14.         max-right = j
  15. return(max-left, max-right, left-sum + right-sum)
    FIND-MAXIMUM-SUBARRAY(A, low, high)
  1. if low = high
  2.     return (low, high, A[low])
  3. else    mid = (low + high) / 2
  4.     (left-low, left-high, left-sum) =
  5.         FIND-MAXIMUM-SUBARRAY(A, low, mid)
  6.     (right-low, right-high, right-sum) =
  7.         FIND-MAXIMUM-SUBARRAY(A, mid + 1, high)
  8.     (cross-low, cross-high, cross-sum) =
  9.         FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high)
  10.     if left-sum >= right-sum and left-sum >= cross-sum
  11.         return (left-low, left-high, left-sum)
  12.     elseif right-sum >= left-sum and right-sum >= cross-sum
  13.         return (right-low, right-high, right-sum)
  14.     else return (cross-low, cross-high, cross-sum)
C语言实现:

typedef struct
{
       int low ;
       int high ;
       int sum ;
} Array_Info;

Array_Info Find_Max_Crossing_Subarray (int A[], int low , int mid , int high )
{
       int i , j ;
       int max_left , max_right ;
       int left_sum = INT_MIN ;
       int sum = 0 ;
       Array_Info cross ;

       for ( i = mid; i >= 0 ; i --)
       {
             sum += A[ i ];
             if ( sum > left_sum)
             {
                   left_sum = sum;
                   max_left = i;
             }
       }
       int right_sum = INT_MIN ;
       sum = 0;
       for ( j = mid + 1 ; j <= high ; j ++)
       {
             sum += A[ j ];
             if ( sum > right_sum)
             {
                   right_sum = sum;
                   max_right = j;
             }
       }

       cross .low = max_left ;
       cross .high = max_right ;
       cross .sum = left_sum + right_sum;
       return cross ;
}

Array_Info Find_Maximum_Subarray( int A [], int low, int high )
{
       Array_Info base , left , right , cross ;

       if ( low == high)
       {
             base .low = low ;
             base .high = high ;
             base .sum = A [low ];
             return base ;
       }

       int mid = ( low + high ) / 2;
       left = Find_Maximum_Subarray( A , low , mid );
       right = Find_Maximum_Subarray( A , mid + 1, high);
       cross = Find_Max_Crossing_Subarray (A , low , mid , high );

       if ( left .sum >= right .sum && left .sum >= cross .sum )
             return left ;
       else if (right . sum >= left . sum && right . sum >= cross . sum)
             return right ;
       else
             return cross ;
}



线性解法:复杂度(N)

<1>Analyse

     从数组左边界开始,从左到右处理,记录到目前为止最大子数组的。若已知A[1....j]的最大子数组,基于如下性质将解扩展为A[1....j + 1]的最大子数组:
          A[1....j + 1]的最大子数组为 A[1....j] 的最大子数组或A[i....j + 1] (1 <= i <= j + 1)。
     性质分析:
          若A[j + 1] >= 0, 并且最大子数组为 A[i....j], 那么A[1....j + 1]最大子数组为A[i....j + 1];
          若A[j + 1] >= 0,若最大子数组为A[m....n] (1 <= m < n, n < j),那么 A[1....j + 1]最大子数组为A[1.....j]中最大子数组或A[i....j + 1], A[i...j + 1]满足不存在k (j > k > i)使A[i]+ A[i + 1]..+A[k] < 0
          若A[j + 1] < 0, 并且最大子数组为 A[m....n] (1 <=m < n, n <= j),那么A[1...j + 1]中最大子数组为A[m...n];

pseudo-code:

    FIND-MAXIMUM-SUBARRAY(A, low, high)
  1. sum = INT_MIN
  2. max = INT_MIN
  3. for i = low to high
  4.     if max < 0
  5.         max = A[i]
  6.     else max = max + A[i]
  7.     if sum < max
  8.         sum = max
  9. return sum
c语言实现:

int Find_Maximum_Subarray ( int A [], int low , int high)
{
       int sum = INT_MIN ;
       int max = INT_MIN ;

       for ( int i = low ; i <= high; i++)
       {
             if ( max < 0)
                  max = A[ i ];
             else
                  max += A[ i ];

             if ( sum < max)
                   sum = max;
       }
       return sum ;
}




备注:
     When all the numbers are negative, the function will return the minimun number of the array;
内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频AI算法,符合汽车电子AEC-Q100 Grade 2ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性应用场景,如智能汽车、智能家居工业控制;②掌握基于EAM2011芯片的开发板芯片的硬件资源接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值