Divide and conquer method
分治法是最广泛使用的算法设计方法之一,其基本思想:把大问题分解成一些较小的问题,然后由小问题的解方便地构造出大问题的解。
分治法说穿了就是把问题放小,如果被分的问题还是比较大,那么久继续分下去。为了能清晰地反映采用分治策略设计算法的基本步骤,下面用一个称之为抽象化控制的过程来非形式的描述算法的控制流向,下面笔者举例来说明这个问题。
void div(p,q) {
int n,A[n]; //定义成全程变量
int m,p,q; //1≤p≤q≤n
if(small(p,q)) return(answer(p,q));
else
{
m = divide(p,q); //p≤m<q
return (combine(div(p,m),div(m+,q)));
};
}//div
在这个算法中,small(p,q)是一个布尔值函数,它用以判断输入为A(p:q)的问题是否小到无需进一步细分就能算出其答案的程度。若是,则调用能直接计算此规模下的子问题解的函数answer(p,q);若否,则调用分割函数divide(p,q),返回一个新的分割点m(整数)。于是,原问题被分成输入为A(p:m)和A(m+1:q)的两个子问题。对这两个子问题分别递归调用div得到各自的解x和y,再用一个合并函数combine(x,y)将这两个子问题的解合成原问题(输入为 A(p,q))的解。倘若所分成的两个子问题的输入规模大致相等,则div总的计算时间可用下面的递归关系式来表示:
g(n) 当n足够小,
T(n)=
2T(n/2)+f(n) 否则
其中,T(n)是输入规模为n的div的运行时间,g(n)是输入规模足够小以至于能直接求解时的运行时间,f(n)是combine的时间
显然用递归过程描述以分治法为基础的算法是理所当然的,但为了提高效率,往往需要将这一递归形式转换成迭代形式。例如下面这个算法:
void div1(p,q) {
//div的迭代模型,定义了一个适当大小的工作栈
int s,t;
intiStack(sqStack); //定义工作栈sqStack
L1:while(!small(p,q)) {
m = divied(p,q); //确定如何分割输入
push(sqStack,(p,q,m,,)); //处理第一次递归调用
q = m;
};//while
t = answer(p,q);
while(!StackEmpty( sqStack )) {
pop(sqStack,(p, q, m, s, ret)); //退栈,ret为返回地址
if(ret==) {
push(sqStack,(p, q, m, t, )); //处理第二次递归调用
p = m + ;
go to L1;}
else {
t = combine(s,t); //将两个子问题的解合并成一个解
};//if
};//while
return t;
}//div1 当然,这个算法还可以简化
Divide and conquer method的更多相关文章
- [LeetCode] 236. Lowest Common Ancestor of a Binary Tree_ Medium tag: DFS, Divide and conquer
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- [LeetCode] 系统刷题4_Binary Tree & Divide and Conquer
参考[LeetCode] questions conlusion_InOrder, PreOrder, PostOrder traversal 可以对binary tree进行遍历. 此处说明Divi ...
- [LeetCode] 124. Binary Tree Maximum Path Sum_ Hard tag: DFS recursive, Divide and conquer
Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 算法上机题目mergesort,priority queue,Quicksort,divide and conquer
1.Implement exercise 2.3-7. 2. Implement priority queue. 3. Implement Quicksort and answer the follo ...
- 【LeetCode】分治法 divide and conquer (共17题)
链接:https://leetcode.com/tag/divide-and-conquer/ [4]Median of Two Sorted Arrays [23]Merge k Sorted Li ...
- The Divide and Conquer Approach - 归并排序
The divide and conquer approach - 归并排序 归并排序所应用的理论思想叫做分治法. 分治法的思想是: 将问题分解为若干个规模较小,并且类似于原问题的子问题, 然后递归( ...
- Divide and Conquer.(Merge Sort) by sixleaves
algo-C1-Introductionhtml, body {overflow-x: initial !important;}html { font-size: 14px; }body { marg ...
- [算法]分治算法(Divide and Conquer)
转载请注明:http://www.cnblogs.com/StartoverX/p/4575744.html 分治算法 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式.字面上的解释是 ...
随机推荐
- as3 工具类分享 CookieMgr
今天分享一个工具类 CookieMgr,功能就是读取和写入 SharedObject 对象.很简单,都是静态方法,就不多说了 package org.polarbear.core { import f ...
- C/C++:拷贝构造函数
拷贝构造函数是一种特殊的构造函数,因为它也是用来构造对象的.它具有构造函数的所有特性.拷贝构造函数的作用是用一个已经存在的对象去初始化另一个对象,这两个对象的类类型应该是一样的.定义拷贝构造函数的形式 ...
- 关于在MDK中使用 printf 函数
microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdin.stdout 和 stderr. 这样,即可使用 printf() 来显示应用程序中的诊断消息. 要使用高级 I/ ...
- Ubuntu 小技巧
一.获得当前文件夹的路径: 在目标文件夹下,按Ctrl+l此文件的路径会被选中 之后Ctrl+c复制.要复制到终端(Terminal),选中终端按鼠标的滚轮就粘贴到了Terminal命令行中了. 二. ...
- codeforce 606A - Magic Spheres
题意:a,b,c三种球,能把俩个一样的球变成另一颜色不一样的球.给你目标x,y,z,问能否经过变化至少达打目标. #include<iostream> #include<stdio. ...
- java继承和多态
父类和子类 如果类C1扩展自另一个类C2,那么C1称为子类或派生类,C2称为父类或基类.派生类可以从它的基类中继承可访问的数据域和方法,还可添加新数据域和新方法 例如:实现一个几何图形基类; clas ...
- HW6.17
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- POJ 3764 (异或+字典树)
早就听过用字典树求异或最大值,然而没做过.发现一碰到异或的题就GG,而且因为以前做过的一道类似的题(事实上并不类似)限制了思路,蠢啊= =. 题意:一棵带权的树,求任意两点间路径异或的最大值. 题解: ...
- define定义方法
define('a',function(){ ; return x; }); define('b',['a'],function(a){ ; return y+a; }); M.use(['b'],f ...
- jquery中 cache: true和false的区别
true:会读缓存,可能真的到服务器上. 假如上次访问了a.html,第二次的时候得到的是上次访问的a.html的结果,而不是重新到服务器获取. false:会在url后面加一个时间缀,让它跑到服务器 ...