博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[算法]分治算法(Divide and Conquer)
阅读量:4360 次
发布时间:2019-06-07

本文共 1978 字,大约阅读时间需要 6 分钟。

转载请注明: 

分治算法

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

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

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

  分治法的三个步骤是:

    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
& nums){ if(nums.size() == 1)//递归退出 { return nums[0]; } auto mid =nums.begin() + (nums.end() - nums.begin())/2; vector
left_vec(nums.begin(),mid); int left = maxSubArray(left_vec);//要么在数组的左边 vector
right_vec(mid,nums.end());//要么在数组的右边 int right = maxSubArray(right_vec); //以下计算通过数组中间的情况,分别计算left_max和right_max,相加得到mid_max int left_max = -1000000; int left_add = 0; for(auto iter = mid-1;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 = -1000000; int right_add = 0; 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;}

 

    

转载于:https://www.cnblogs.com/StartoverX/p/4575744.html

你可能感兴趣的文章
语言、数据和运算符
查看>>
正则表达式30分钟入门教程
查看>>
sqlserver try catch·
查看>>
怎么在三维世界里叙述五维故事
查看>>
1028: 可乐(2018年中南大学研究生复试机试题 )
查看>>
珍藏的最全的windows操作系统快捷键
查看>>
【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
查看>>
二叉树结点删除操作
查看>>
图论-单源最短路-SPFA算法
查看>>
转换文件的字符集
查看>>
prometheus + grafana安装部署(centos6.8)
查看>>
Redis和Memcached的区别【转】
查看>>
VMware: Deploy multiple VM’s from template with PowerCLI
查看>>
Cascaded pose regression
查看>>
model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转;解决的方法是用responsewrite(普通的字符响应)...
查看>>
自动在数据库中创建表
查看>>
如何在一个进程中启动另外一个线程:ProcessStartInfo Constructor
查看>>
树状数组模板题 P1904
查看>>
Kerberos安装及使用
查看>>
android 布局中 layout_gravity、gravity、orientation、layout_weight
查看>>