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+1,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,0,2)); //处理第一次递归调用 q = m; };//while t = answer(p,q); while(!StackEmpty( sqStack )) { pop(sqStack,(p, q, m, s, ret)); //退栈,ret为返回地址 if(ret==2) { push(sqStack,(p, q, m, t, 3)); //处理第二次递归调用 p = m + 1; go to L1;} else { t = combine(s,t); //将两个子问题的解合并成一个解 };//if };//while return t; }//div1 当然,这个算法还可以简化
Divide and conquer method相关推荐
- 分治策略Divide and Conquer
在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",通常是递归算法,就是 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最 ...
- INF421 - Amphi 2 Divide and Conquer
INF421 - Amphi 2 Divide and Conquer 0.Quizz回顾 在数组中同时寻找最大和最小元素 Big-Oh Notation (Landau Symbols) 1. In ...
- 分治法 Divide and Conquer思想及实际应用
分治思想 Divide and Conquer,即为分治法,基于分支递归的一种解决问题的思想方法. 分治分治,"分而治之"的意思,就是把一个复杂的原问题分成一个或多个相同子问题,而 ...
- Lecture 3 Divide and Conquer
1.Divide the problem(instance) into one or more sub-problem; 2.Conquer each sub-problem recursively; ...
- 分治法 divide and conquer
分治算法包含以下步骤: 1.分(divide):将一个大问题分解成若干个子问题,每个子问题的问题规模n更小了,这样就有了好几个待解决的子问题. 2.治(conquer):递归的去解决每个子问题. 3. ...
- 分治算法求乘方a^b 取余p(divide and conquer)
传统的计算方法为循环n个a相乘.时间复杂度为O(n). 如用分治算法,效率可提升至O(lgn). 结合recursive有 double pow(int a, int n){if(n==0)retur ...
- Divide and conquer:K Best(POJ 3111)
挑选最美的珠宝 题目大意:挑选k个珠宝使得∑a/∑b最大,输出组合数 最大化平均值的标准题型,二分法就好了,一定要注意范围(10e-7),如果是10e-8就会tle,10e-6就是wa 1 #inc ...
- 2017 SEERC Divide and Conquer 树上差分
题目 题目大意:给出两颗树的复合图(即这张图是由两颗树拼起来的),询问最小割掉多少条边,可以使得图不联通,并输出方案数. 分析 我觉得这是一道很难的题目,因为比较难想,前提结论比较多. 首先我们需要得 ...
- Divide and conquer:Drying(POJ 3104)
烘干衣服 题目大意:主人公有一个烘干机,但是一次只能烘干一件衣服,每分钟失水k个单位的水量,自然烘干每分钟失水1个单位的水量(在烘干机不算自然烘干的那一个单位的水量),问你最少需要多长时间烘干衣服? ...
最新文章
- 关于Block的copy和循环引用的问题
- Python 非线性方程组
- DL之simpleNet:利用自定义的simpleNet(设好权重)对新样本进行预测、评估、输出梯度值
- 检查可执行文件所需要的共享库
- python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记
- 今天为你分享互联网营销的两个核心思维
- jsp+servlet+mysql的简单使用
- 西门子atch指令详解_西门子PLC中断指令?
- AFDX(ARINC664)的交换机规范
- 大文件上传解决方案-支持断点续传的文件上传插件(转)
- windows11 安全中心点击进去内容空白解决方法
- 鸿蒙珠融入体内,逍遥至尊之诸天逍遥
- 图像去雾开源数据集资源汇总
- C6678信号处理板学习资料:基于6U VPX TMS320C6678+XC7K325T 的信号处理板
- 屏蔽上网时弹窗广告,防止追踪、恶意域名,过滤横幅广告、以及视频广告的方法
- html滚轮下拉动画,html5+css3齿轮滚动动画代码
- C/C++ 数组的初始化
- 【PDN仿真笔记7-使用Sigrity PowerSI进行PDN仿真的方法2】
- 育儿-《让孩子远离焦虑》书中的精髓:家长如何帮助孩子解决他们自身的焦虑问题。
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
热门文章
- iOS6中旋转的略微改变
- Java并行编程–从并行任务集获取反馈
- ip地址伪装php,技术教程:如何使用浏览器插件伪装IP地址
- python 自动填excel_使用python自动填充文字.docx从excel fi
- java定义一个空数组_一个 Java 方法,最多能定义多少参数?
- 入口文件到控制器 php,tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析...
- python修改csv文件字段顺序_Pandas中DataFrame交换列顺序的方法实现
- xcode11 新功能_Xcode 11功能
- textview 复制粘贴_Android TextView使用剪贴板复制粘贴
- java 字符串首字符大写_Java字符串为大写