美文网首页
分治算法

分治算法

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

分治策略

  • 分解:将问题划分为一些子问题,子问题的形式与原问题一致,只是规模更小
  • 解决:递归求解子问题,如果子问题规模足够小,则直接求解
  • 合并:将子问题的解组合成原问题的解

最大子数组问题

采用分治法的求解策略:
  • 分解:将数组均分为A、B,则数组的最大子数组必定位于A或者位于B或者跨越了数组中点
  • 解决:递归求解位于A与位于B情况下的解
  • 合并:对于得到的最大子数组,获取其最大值则就是原问题的解
  • 递归式:T(n) = 2T(n / 2) + θ(n)
  • 复杂度:nlg(n)
拓展:线性解

设数组A[0, i]的最大子数组为A[a, b],则数组A[0, i + 1]的最大子数组要么是A[a, b],要么是A[k, i + 1] (k ≥ a)。潜在的新解k在求A[0, i]的最大子数组A[a, b]的时候可以同步求出。

//寻找最大子数组,允许子数组为空,返回的下标置为-1表示当前最大子数组为空
template<typename T> T FindMaxChildArray(T* pArray, const size_t nLenC,
    size_t& nBeginPos, size_t& nEndPos)
{
    T nSumMax = 0;
    T nSumTem = 0;
    size_t k = 0;   //新的左侧解
    
    nBeginPos = nEndPos = -1;

    for (size_t i = 0; i < nLenC; ++i)
    {
        nSumTem += pArray[i];
        if (nSumTem > nSumMax)
        {
            nSumMax = nSumTem;
            nBeginPos = k;
            nEndPos = i;
        }
        else if (nSumTem <= 0)
        {
            //之前的左侧解已经不可能是潜在的解了,进行重置
            k = i + 1;
            nSumTem = 0;
        }
    }

    return nSumMax;
}

相关文章

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • 算法导论第2.3章 - 分治算法

    分治算法 递归:算法一次或多次递归地调用其自身已解决紧密相关的若干子问题。这些算法遵循分治法的思想。 分治算法三个...

  • 从分治算法到 MapReduce

    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就...

  • Leetcode-Java(二十五)

    241. Different Ways to Add Parentheses 采用分治算法,分治算法的基本思想是将...

  • 09《算法入门教程》分治算法

    1. 前言 本节内容是分治算法系列之一:分治算法的介绍,主要介绍了分治算法的定义及基本思想和实现策略,然后我们介绍...

  • 分治算法

    理解分治算法 分而治之

  • 分治算法

    分治是一种思想体现,就是把一个大的问题分为若干个子问题,这些子问题相互独立且与原问题性质相同然后在子问题继续向下分...

  • 分治算法

    分治算法字面意思就是将一个复杂的数据进行分开计算,分治 的策略就是: 一个分治法将规模为n的问题分成k个规模为n/...

  • 分治算法

    http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741...

  • 分治算法

    分冶算法的基本思想是将原问题分解为几个规模较小的但类似原问题的子问题,递归地求解这些了问题,然后再合并这些子问题的...

网友评论

      本文标题:分治算法

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