转载请注明:http://www.cnblogs.com/StartoverX/p/4575744.html

分治算法

  在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,这些子问题互不相交,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

  分治法所能解决的问题一般具有以下几个特征:

    • 问题的规模缩小到一定的程度就可以容易地解决
    • 问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
    • 利用该问题分解出的子问题的解可以合并为该问题的解
    • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

  分治法的三个步骤是:

    1. 分解(Divide):将原问题分解为若干子问题,这些子问题都是原问题规模较小的实例。
    2. 解决(Conquer):递归地求解各子问题。如果子问题规模足够小,则直接求解。
    3. 合并(Combine):将所有子问题的解合并为原问题的解。

  以leetcode中Maximum Subarray为例:

    Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6。

    思路:利用分治法,最大连续子序列要么在数组的左半边,要么在数组的右半边,要么经过数组的中点。

    

int maxSubArray(vector<int>& nums)
{
if(nums.size() == )//递归退出
{
return nums[];
} auto mid =nums.begin() + (nums.end() - nums.begin())/; vector<int> left_vec(nums.begin(),mid);
int left = maxSubArray(left_vec);//要么在数组的左边 vector<int> right_vec(mid,nums.end());//要么在数组的右边
int right = maxSubArray(right_vec);
//以下计算通过数组中间的情况,分别计算left_max和right_max,相加得到mid_max
int left_max = -;
int left_add = ;
for(auto iter = mid-;iter != nums.begin();iter--)
{
left_add += *iter;
if(left_add > left_max)
{
left_max = left_add;
}
}
left_add += *nums.begin();
if(left_add > left_max)
{
left_max = left_add;
} int right_max = -;
int right_add = ;
for(auto iter = mid;iter != nums.end();iter++)
{
right_add += *iter;
if(right_add > right_max)
{
right_max = right_add;
}
}
right_max = right_max >= right_add ? right_max : right_add; int mid_max = right_max + left_max; //right,left,mid_max三个比大小,大的为答案
int rl_max = (right > left? right:left);
return mid_max > rl_max ? mid_max : rl_max;
}

    

[算法]分治算法(Divide and Conquer)的更多相关文章

  1. 分治算法——Karastsuba算法

    分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...

  2. 算法(Java实现)—— 分治算法

    分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...

  3. 分治算法求乘方a^b 取余p(divide and conquer)

    传统的计算方法为循环n个a相乘.时间复杂度为O(n). 如用分治算法,效率可提升至O(lgn). 结合recursive有 double pow(int a, int n){ ) ; ) return ...

  4. 算法上机题目mergesort,priority queue,Quicksort,divide and conquer

    1.Implement exercise 2.3-7. 2. Implement priority queue. 3. Implement Quicksort and answer the follo ...

  5. 算法与数据结构基础 - 分治法(Divide and Conquer)

    分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...

  6. 从两个平方算法到分治算法-java

    先来看看问题的来源,假设有这么一个数组: 1 2 -5 4 -2 3 -3 4 -15 我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有 ...

  7. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

  8. UVA 10245 The Closest Pair Problem 最近点问题 分治算法

    题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...

  9. 分治算法(Divide-and-Conquer)和Google的云计算

    1.云计算:涉及到存储.计算.资源的调度和权限的管理等   2.分治算法的原理:           讲一个复杂的问题,分成若干个简单的子问题进行解决,然后对子问题的记过进行合并,得到原有问题的解   ...

随机推荐

  1. Android中支持的常用距离单位

    px(像素):每个px对应屏幕上的一个点.dip或dp(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dip=1px.但 ...

  2. QQ音乐的请求

    CEF 3.2357.1291.g47e6d4bChromium 43.0.2357.134OS WindowsWebKit 537.36JavaScript 4.3.61.38Flash User ...

  3. tarjan缩点

    整理了下模板... #include<iostream> #include<cstdio> #include<cmath> #include<algorith ...

  4. Linux系统编程(30)—— socket编程之TCP/IP协议

    在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样.计算机使用者意识到,计算机 ...

  5. head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  6. HDOJ(HDU) 1465 不容易系列之一(错排)

    Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就 ...

  7. java的CalssLoader

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Ja ...

  8. android仿京东、淘宝商品详情页上拉查看详情

    话不多说,直接上干货,基本就是一个scrollview中嵌套两个scrollview或者webview;关键点事处理好子scrollview和父scrollview的触摸.滑动事件已达到想要的效果.大 ...

  9. Android中ListView通过BaseAdapter实现数据的绑定

    1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...

  10. Geeks Interview Question: Ugly Numbers

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence1, 2, 3, 4, 5, 6, 8, 9, ...