[算法]分治算法(Divide and Conquer)
转载请注明:http://www.cnblogs.com/StartoverX/p/4575744.html
分治算法
在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,这些子问题互不相交,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
分治法所能解决的问题一般具有以下几个特征:
- 问题的规模缩小到一定的程度就可以容易地解决
- 问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
- 利用该问题分解出的子问题的解可以合并为该问题的解
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
分治法的三个步骤是:
- 分解(Divide):将原问题分解为若干子问题,这些子问题都是原问题规模较小的实例。
- 解决(Conquer):递归地求解各子问题。如果子问题规模足够小,则直接求解。
- 合并(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)的更多相关文章
- 分治算法——Karastsuba算法
分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...
- 算法(Java实现)—— 分治算法
分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...
- 分治算法求乘方a^b 取余p(divide and conquer)
传统的计算方法为循环n个a相乘.时间复杂度为O(n). 如用分治算法,效率可提升至O(lgn). 结合recursive有 double pow(int a, int n){ ) ; ) return ...
- 算法上机题目mergesort,priority queue,Quicksort,divide and conquer
1.Implement exercise 2.3-7. 2. Implement priority queue. 3. Implement Quicksort and answer the follo ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 从两个平方算法到分治算法-java
先来看看问题的来源,假设有这么一个数组: 1 2 -5 4 -2 3 -3 4 -15 我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有 ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
- UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...
- 分治算法(Divide-and-Conquer)和Google的云计算
1.云计算:涉及到存储.计算.资源的调度和权限的管理等 2.分治算法的原理: 讲一个复杂的问题,分成若干个简单的子问题进行解决,然后对子问题的记过进行合并,得到原有问题的解 ...
随机推荐
- 一次java程序的重构
// com口操作类 package xyz.game; class ComOpera { public void openPort() throws Exception {...} // 打开com ...
- 转:VC中WORD,DWORD,unsigned long,unsigned short的区别(转)
typedef unsigned long DWORD;typedef int BOOL;typedef unsigned char BYTE; ...
- SQL basic
Function 从例子学习 drop function dbo.getWorkingDateCount; --getWorkingDateCount = functionName CREATE FU ...
- Entity Framework with MySQL 学习笔记一(查询)
参考 : http://msdn.microsoft.com/en-us/data/jj574232.aspx EF 查询基本上有3中 默认是 Lazy Loading 特色是只有在需要数据的时候EF ...
- 用PYTHON实现将电脑里的所有文件按大小排序,便于清理
嘿嘿,慢慢找到写代码的感觉了. 这个小程序涉及的东东还是很多的,数据结构的设计,错误的处理,快速字典排序,文件数值调整.... import os,os.path import glob SUFFIX ...
- P0口上拉电阻选择
如果是驱动led,那么用1K左右的就行了.如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大:如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超 ...
- 黑马程序员_Java其他对象(System,Runtime,Date,Calendar,Marh-Random)
System System类包含一些有用的类字段和方法(都是静态的).它不能被实例化. 在System类提供的设施中,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载文件和库的 ...
- android中操作SQLite注意事项
调用rawQuery()后,需要调用Cursor的movToFirst(); public Cursor query(String sql, String[] args){ SQLiteDatabas ...
- java中protect属性用法总结
测试代码: pojo类: package com.lky.h1; public class Base { private Integer id; protected String name; publ ...
- Linux下使用虚拟网卡的ingress流控(入口流控)
Linux内核实现了数据包的队列机制,配合多种不同的排队策略,可以实现完美的流量控制和流量整形(以下统称流控).流控可以在两个地方实现,分别为egress和ingress,egress是在数据包发出前 ...