美文网首页
分治策略

分治策略

作者: szn好色仙人 | 来源:发表于2018-05-12 20:04 被阅读0次

求解递归式方法

最大子数组问题

分治策略
  • 分治法流程
  • 伪代码
  • C++实现

template<typename T>
T FindMaxCrossingSubarray(T* pArray, const int nLenC, int& nBeginPos,
    int& nEndPos)
{
    if (1 == nLenC)
    {
        nBeginPos = 0;
        nEndPos = 0;
        return pArray[0];
    }

    const int nLeftLenC = nLenC / 2;

    T aSum[2] = {};
    T nTemSum = 0;

    for (int i = nLeftLenC - 1; i >= 0; --i)
    {
        nTemSum += pArray[i];
        if (nLeftLenC - 1 == i || aSum[0] < nTemSum)
        {
            aSum[0] = nTemSum;
            nBeginPos = i;
        }
    }

    nTemSum = 0;
    for (int i = nLeftLenC - 1; i < nLenC; ++i)
    {
        nTemSum += pArray[i];
        if (nLeftLenC - 1 == i || aSum[1] < nTemSum)
        {
            aSum[1] = nTemSum;
            nEndPos = i;
        }
    }

    return aSum[0] + aSum[1] - pArray[nLeftLenC - 1];
}

template<typename T>
T FindMaximumSubarray(T* pArray, const int nLenC, int& nBeginPos, 
    int& nEndPos)
{
    if (1 == nLenC)
    {
        nBeginPos = 0;
        nEndPos = 0;
        return pArray[0];
    }

    T aSum[4] = {};
    int aLeftPos[2] = {};
    int aRigthPos[2] = {};
    int aCenterPos[2] = {};
    const int nHalfC = nLenC / 2;

    if (nHalfC)
    {
        aSum[0] = FindMaximumSubarray(pArray, nHalfC, aLeftPos[0],
            aLeftPos[1]);
    }
    
    if (nLenC - nHalfC)
    {
        aSum[1] = FindMaximumSubarray(pArray + nHalfC, nLenC - nHalfC,
            aRigthPos[0], aRigthPos[1]);

        aRigthPos[0] += nHalfC;
        aRigthPos[1] += nHalfC;
    }

    aSum[2] = FindMaxCrossingSubarray(pArray, nLenC, aCenterPos[0],
        aCenterPos[1]);

    if (aSum[0] >= aSum[1] && aSum[0] >= aSum[2])
    {
        nBeginPos = aLeftPos[0];
        nEndPos = aLeftPos[1];
        aSum[3] = aSum[0];
    }
    else if (aSum[1] >= aSum[0] && aSum[1] >= aSum[2])
    { 
        nBeginPos = aRigthPos[0];
        nEndPos = aRigthPos[1];
        aSum[3] = aSum[1];
    }
    else
    {
        nBeginPos = aCenterPos[0];
        nEndPos = aCenterPos[1];
        aSum[3] = aSum[2];
    }

    return aSum[3];
}
线性解
  • 流程
template<typename T>
T Better(T* pArray, const int nLenC, int& nBeginPos, int& nEndPos)
{
    T nMaxSum = pArray[0];
    T nSurplusSum = pArray[0];
    int nTemBeginPos = nBeginPos = nEndPos = 0;

    for (int i = 1; i < nLenC; ++i)
    {
        nSurplusSum += pArray[i];

        if (nSurplusSum > nMaxSum)
        {
            nEndPos = i;
            nBeginPos = nTemBeginPos;
            nMaxSum = nSurplusSum;
        }
        else if (nSurplusSum <= 0)
        {
            nSurplusSum = 0;
            nTemBeginPos = i + 1;
        }
    }

    return nMaxSum;
}

代入法求解递归式



递归树法求解递归式

主方法求递归式

以上来自算法导论第四章

相关文章

  • 分治策略

    求解递归式方法 最大子数组问题 分治策略 分治法流程 伪代码 C++实现 线性解 流程 代入法求解递归式 递归树法...

  • 分治策略

    分治策略 本文包括分治的基本概念二分查找快速排序归并排序找出伪币棋盘覆盖最大子数组 源码链接:https://gi...

  • 分治策略

    分治策略 解决问题的典型策略: 分而治之将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到...

  • 0x01 分治法

    1、分治策略分治法是采用分而治之,逐个解决的策略。孙子兵法曰:凡治众如寡者,分数是也。 采用分治求解的问题必须具有...

  • 最大子数组问题的几种解法

    分治算法 最近看到《算法导论》的分治策略一节,看到的一个题目可以优化引申出来多种解法,同时也可以帮助理解分治策略的...

  • 归并排序

    1、分治法 归并排序是完全遵循分治策略的排序算法。什么是分治法? 分治法,即将原问题分解为几个规模较小的子问题,递...

  • 排序算法之--快速排序

    今天来整理一下快速排序。 快速排序采用分治策略对数据进行排序,什么是分治策略呢?简单地说就是“分而治之,各个击破”...

  • 常见的算法策略:递归算法与分治策略

    递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的...

  • 分治策略——算法

    分而治之:据不同的成因选择不同的解决方案。成语大全如是说。而似乎分治只借了这个成语的名,意思却偏向于问题的拆解再合...

  • 【算法点滴】分治策略小结

    分治策略介绍 分治策略可概括为以下步骤: 分解(Divide):将问题分解为若干个小的子问题。每个子问题与大问题同...

网友评论

      本文标题:分治策略

      本文链接:https://www.haomeiwen.com/subject/wjvhdftx.html