最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积

本文详细介绍了四种不同时间复杂度的子序列算法实现,包括穷举法(O(N^3))、改进后的穷举法(O(N^2))、分治算法(O(NlogN))以及最优的联机算法(O(N))。此外,还提供了最小子序列和、最小正子序列和及最大子序列乘积的算法实现。
摘要由CSDN通过智能技术生成

来自:【数据结构与算法分析——C语言描述】练习2.12

有关这 4 个子序列算法的思路,都是源于 最大子序列和问题 的延伸,具体请参考 【数据结构与算法分析——C语言描述】第二章总结 算法分析 中的 “最大子序列和问题”部分。

下面是 4 个子序列算法的代码实现。

 

最大子序列和

1. 穷举法,时间复杂度O(N3

int maxSequenceSum1(const int A[], int N)
{
    int i, j, k, maxSum, thisSum;

    maxSum = 0;
    for (i = 0; i < N; i++)
    {
        for (j = i; j < N; j++)
        {
            thisSum = 0;
            for (k = i; k <= j; k++)
                thisSum += A[k];

            if (thisSum > maxSum)
                maxSum = thisSum;
        }
    }
  return maxSum;
}

2. 撤一个for,O(N2

int maxSequenceSum2(const int A[], int N)
{
    int i, j, maxSum, thisSum;

    maxSum = 0;
    for (i = 0; i < N; i++)
    {
        thisSum = 0;
        for (j = i; j < N; j++)
        {
            thisSum += A[j];

            if (thisSum > maxSum)
                maxSum = thisSum;
        }
    }
    return maxSum;
}

 3. 分治算法,O(NlogN)

int maxSubSum(const int A[], int left, int right)
{
    int maxLeftSum, maxRightSum;
    int maxLeftBorderSum, maxRightBorderSum;
    int leftBorderSum, rightBorderSum;
    int center, i;

    if (left == right)    /*Base case*/
    {
        if (A[left] > 0)
            return A[left];
        else
            return 0;
    }

    center = (left + right) / 2;
    maxLeftSum = maxSubSum(A, left, center);
    maxRightSum = maxSubSum(A, center + 1, right);

    maxLeftBorderSum = 0;    leftBorderSum = 0;
    for (i = center; i >= left; i--)
    {
        leftBorderSum += A[i];
        if (leftBorderSum > maxLeftBorderSum)
            maxLeftBorderSum = leftBorderSum;
    }

    maxRightBorderSum = 0;    rightBorderSum = 0;
    for (i = center + 1; i <= right; i++)
    {
        rightBorderSum += A[i];
        if (rightBorderSum > maxRightBorderSum)
            maxRightBorderSum = rightBorderSum;
    }
    return max(maxLeftSum, maxRightSum,
        maxLeftBorderSum + maxRightBorderSum);
}

int maxSequenceSum3(const int A[], int N)
{
    return maxSubSum(A, 0, N - 1);
}

 4. 联机算法,O(N)

int maxSequenceSum4(const int A[], int N)
{
    int i, maxSum, thisSum;

    maxSum = 0; thisSum = 0;
    for (i = 0; i < N; i++)
    {
        thisSum += A[i];

        if (thisSum> maxSum)
            maxSum = thisSum;
        else if (thisSum < 0)
            thisSum = 0;
    }
    return maxSum;
}

 

 下面,我仍然采用更优的联机算法来求解最小子序列和、最小正子序列和、以及最大子序列乘积。

 

最小子序列和

int minSequenceSum(const int A[],int N)
{
    int minSum, thisSum, i;

    minSum = 0; thisSum = 0;
    for (i = 0; i < N; i++)
    {
        thisSum += A[i];;

        if (thisSum < minSum)
            minSum = thisSum;
        else if (thisSum>0)
            thisSum = 0;
    }
    return minSum;
}

 

最小正子序列和

int minPositiveSubSum(const int A[], int N)
{
    int minSum, thisSum, i;

    minSum = 0x7FFFFFFF; thisSum = 0;
    for (i = 0; i < N; i++)
    {
        thisSum += A[i];

        if (thisSum < minSum && thisSum > 0)
            minSum = thisSum;
        else if (thisSum < 0)
            thisSum = 0;
    }
    return minSum;
}

 

最大子序列乘积

int maxPositiveSubMul(const int A[], int N)
{
    int maxMul, thisMul, i;

    maxMul = 1; thisMul = 1;
    for (i = 0; i < N; i++)
    {
        thisMul *= A[i];

        if (thisMul > maxMul)
            maxMul = thisMul;
    }

    return maxMul;
}

 

转载于:https://www.cnblogs.com/mingc/p/5903759.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值