算法---分治法
2016-03-07 20:21
239 查看
1.分治法的思想:
将一个输入规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,然后递归的求解这些子问题,最后用适当的方法将各子问题的解合并成原问题的解。
2.分治法的步骤:
分(divide)二分为主
治(conquer)递归调用,当规模足够小时直接处理
组(combine)
3.抽象化控制
4.解决问题
(1)二分检索(就是查找一个二分检索树)
*一定是有序的
*任何一种以比较为基础的算法,其最坏情况下的计算时间都不可能低于O(logn),也就是不可能存在其最坏情况下计算时间比二分检索算法的计算时间数量级还低的算法。结论:二分检索是解决检索问题的最优的最坏情况算法。
(2)归并分类
给定一个含有n个元素的集合,把它们按一定的次序分类(如非降次序)
(先蓝色线往下递归)
procedureMERGE(low,mid,high)
inth,j,k,low,mid,high;
globalA(low:high);
localB(low:high);
h←low;i←low;j←mid+1;
while(h≤midandj≤high)do
if(A[h]≤A[j])thenB[i]←A[h];h←h+1;
elseB[i]←A[j];j←j+1;
endif
i←i+1;
repeat
if(h>mid)thenfork←jtohighdoB[i]←A[k];i←i+1repeat
elsefork←htomiddoB[i]←A[k];i←i+1repeat
fork←lowtohighdoA[k]←B[k]repeat
endMERGE
*任何以关键字比较为基础的分类算法,最坏情况下的时间下界都是Ω(nlogn),
因此从数量级的角度上看,归并算法是最坏情况下的最优算法。
将一个输入规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,然后递归的求解这些子问题,最后用适当的方法将各子问题的解合并成原问题的解。
2.分治法的步骤:
分(divide)二分为主
治(conquer)递归调用,当规模足够小时直接处理
组(combine)
3.抽象化控制
procedureDANDC(p,q) globaln,A(1:n); integerm,p,q;//1≤p≤q≤n// ifSMALL(p,q)//判断输入规模q-p+1是否足够小,可直接求解
thenreturn(G(p,q)) elsem=DIVIDE(p,q) return(COMBINE(DANDC(p,m),DANDC(m+1,q))) endif endDANDC
4.解决问题
(1)二分检索(就是查找一个二分检索树)
*一定是有序的
*任何一种以比较为基础的算法,其最坏情况下的计算时间都不可能低于O(logn),也就是不可能存在其最坏情况下计算时间比二分检索算法的计算时间数量级还低的算法。结论:二分检索是解决检索问题的最优的最坏情况算法。
(2)归并分类
给定一个含有n个元素的集合,把它们按一定的次序分类(如非降次序)
(先蓝色线往下递归)
ProcedureMERGESORT(low,high) intlow,high,mid; if(low<high) thenmid←(low+high)/2 callMERGESORT(low,mid) callMERGESORT(mid+1,high) callMERGE(low,mid,high) endif endMERGESORT
procedureMERGE(low,mid,high)
inth,j,k,low,mid,high;
globalA(low:high);
localB(low:high);
h←low;i←low;j←mid+1;
while(h≤midandj≤high)do
if(A[h]≤A[j])thenB[i]←A[h];h←h+1;
elseB[i]←A[j];j←j+1;
endif
i←i+1;
repeat
if(h>mid)thenfork←jtohighdoB[i]←A[k];i←i+1repeat
elsefork←htomiddoB[i]←A[k];i←i+1repeat
fork←lowtohighdoA[k]←B[k]repeat
endMERGE
*任何以关键字比较为基础的分类算法,最坏情况下的时间下界都是Ω(nlogn),
因此从数量级的角度上看,归并算法是最坏情况下的最优算法。
相关文章推荐
- 构建之法--软件工程学习随笔之一
- ListView的性能优化之convertView和viewHolder
- 阿里架构之旅(三)——动物园管理者zookeeper
- leetcode26. [Array]Remove Duplicates from Sorted Array
- 《机电传动控制》第二周作业
- ListView的性能优化之convertView和viewHolder
- Ecshop购物车或结算页面显示商品的品牌
- C++模板插入排序
- 00.出关啦!!!
- 一个java代码生成器的简单实现
- NLP 课程笔记
- 基于ZooKeeper的Dubbo注册中心
- ASP.NET MVC 4 中 Controller 与 ApiController 做读取、新增、更新、删除 ( CRUD )
- UI界面的一些简单控件
- 1282 回文数猜想
- mac系统中让一台电脑多套键盘鼠标同时多人使用
- pjsip教程-ICE-NAT passthrough
- Struts2入门示例教程
- 同余模定理
- java设计模式之单例模式