转载请注明: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。

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

    

  1. int maxSubArray(vector<int>& nums)
  2. {
  3. if(nums.size() == )//递归退出
  4. {
  5. return nums[];
  6. }
  7.  
  8. auto mid =nums.begin() + (nums.end() - nums.begin())/;
  9.  
  10. vector<int> left_vec(nums.begin(),mid);
  11. int left = maxSubArray(left_vec);//要么在数组的左边
  12.  
  13. vector<int> right_vec(mid,nums.end());//要么在数组的右边
  14. int right = maxSubArray(right_vec);
  15. //以下计算通过数组中间的情况,分别计算left_max和right_max,相加得到mid_max
  16. int left_max = -;
  17. int left_add = ;
  18. for(auto iter = mid-;iter != nums.begin();iter--)
  19. {
  20. left_add += *iter;
  21. if(left_add > left_max)
  22. {
  23. left_max = left_add;
  24. }
  25. }
  26. left_add += *nums.begin();
  27. if(left_add > left_max)
  28. {
  29. left_max = left_add;
  30. }
  31.  
  32. int right_max = -;
  33. int right_add = ;
  34. for(auto iter = mid;iter != nums.end();iter++)
  35. {
  36. right_add += *iter;
  37. if(right_add > right_max)
  38. {
  39. right_max = right_add;
  40. }
  41. }
  42. right_max = right_max >= right_add ? right_max : right_add;
  43.  
  44. int mid_max = right_max + left_max;
  45.  
  46. //right,left,mid_max三个比大小,大的为答案
  47. int rl_max = (right > left? right:left);
  48. return mid_max > rl_max ? mid_max : rl_max;
  49. }

    

[算法]分治算法(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. 正在搞用web.py做的通讯录

    正在搞用web.py做的通讯录,应该算是学习吧,学习那个web.py的应用框架,其实已经搞起来了,可以增删改数据了,查询还没可以用,现在正在搞登录认证的问题,久没用python, 但再上手后半小时就有 ...

  2. Sicily shortest path in unweighted graph

    题目介绍: 输入一个无向图,指定一个顶点s开始bfs遍历,求出s到图中每个点的最短距离. 如果不存在s到t的路径,则记s到t的距离为-1.   Input 输入的第一行包含两个整数n和m,n是图的顶点 ...

  3. CSS5.4 安装问题集

    由于手痒,将5.2 卸载了,装了5.4 出现如下错误:install failed to install com.ti.ccstudio.debugserver.win32 corrctly. ... ...

  4. 客户端把rsyslog重启,就会发送全部日志 --待研究

    客户端: uat-web02:/var/log/nginx# echo "scan-cccc21231">>scan.log uat-web02:/var/log/ng ...

  5. 【HDOJ】1080 Human Gene Functions

    DP.wa了一下午,原来是把mmax写在外层循环了.最近事情太多了,刷题根本没状态. #include <cstdio> #include <cstring> #include ...

  6. COJ 0979 WZJ的数据结构(负二十一)

    WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个 ...

  7. Codeforces - ZeptoLab Code Rush 2015 - D. Om Nom and Necklace:字符串

    D. Om Nom and Necklace time limit per test 1 second memory limit per test 256 megabytes input standa ...

  8. CSS 代码是什么?(转)

    转自:http://www.divcss5.com/rumen/r95.shtml CSS 代码是什么,什么是CSS代码? 目录 什么是CSS css代码样子(图) 作用 相关扩展阅读 一.了解什么是 ...

  9. DataGrid横向滚动条无法拖动的问题

    项目中经常遇到一些问题,这些问题可能很简单,但是之前从未遇到,可能经过了一番谷歌,也可能是查阅了MSDN,或是借鉴了大牛博客,逐渐有了些眉目,为了将这些东西落地,也为了将来之不易的东西记录下来,以备今 ...

  10. bui上手体验

    在最近的项目中,接触到了bui这个后台管理框架 主页地址:http://builive.com/ 主页上也有一个后台管理的Demo:http://builive.com/apps/default/ma ...