五大常用算法之一:分治算法红脸书生

在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……

二、基本思想及策略

分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

如果原问题可分割成k个子问题,1

三、分治法适用的情况

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

1)该问题的规模缩小到一定的程度就可以容易地解决

2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

3)利用该问题分解出的子问题的解可以合并为该问题的解;

4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;

第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;、

第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。

第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。

四、分治法的基本步骤

分治法在每一层递归上都有三个步骤:

step1分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

step2解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

step3合并:将各个子问题的解合并为原问题的解。

它的一般的算法设计模式如下:

Divide-and-Conquer(P)

1.if|P|≤n0

2.thenreturn(ADHOC(P))

3.将P分解为较小的子问题P1,P2,...,Pk

4.fori←1tok

5.doyi←Divide-and-Conquer(Pi)△递归解决Pi

6.T←MERGE(y1,y2,...,yk)△合并子问题

7.return(T)

其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1,P2,...,Pk的相应的解y1,y2,...,yk合并为P的解。

THE END
1.五大常用算法之一:分治算法二、基本思想和策略 分治法的设计理念是将一个难以直接解决的大问题分为一些小问题,以便每个问题都能被打破,分而治之。 治疗策略是:对于n的问题,如果问题可以很容易地解决(如小n)直接解决,否则分解为k小子问题,这些子问题相互独立,与原始问题形式相同,递归解决这些子问题,然后解决原始问题。这种算法设计策略被称为https://www.tulingxueyuan.cn/tlzx/jsp/3793.html
2.探索四大算法思想:解密数学与计算的奇妙结合结语 四大算法思想贪心、分治、回溯和动态规划在数学与计算领域扮演着重要角色。它们在解决各类问题时展现出强大的能力,既有理论基础支撑,又有实际应用价值。通过本文的介绍,相信读者对这些算法思想有了更深入的了解,并能够进一步探索其在具体问题中的运用。数学与计算的奇妙结合将为我们开启更广阔的技术和科学世界。https://baijiahao.baidu.com/s?id=1779472753352943966&wfr=spider&for=pc
3.分治法的基本思想与例子解析分治法及其应用合并排序算法是用分治策略实现对n个元素进行排序的算法。其基本思想是:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并为所要求的排好序的集合。 packageSort; /** *@authorLIn * 算法名称:归并排序 * 算法描述: https://blog.csdn.net/why_still_confused/article/details/51755899
4.分治法算法思想51CTO博客已为您找到关于分治法算法思想的相关内容,包含IT学习相关文档代码介绍、相关教程视频课程,以及分治法算法思想问答内容。更多分治法算法思想相关解答可以来51CTO博客参与分享和学习,帮助广大IT技术人实现成长和进步。https://blog.51cto.com/topic/fenzhifasuanfasixiang.html
5.基于聚类和划分的SAT分治判定与已有的SAT判定技术相比,本文并不试图改进判定算法本身或者算法采用的数据结构来提高CNF公式的可满足性判效率,而是利用分治的思想,将复杂的CNF表示的SAT的判定问题划分为多个子问题来求解.方法的基本思路是:基于对CNF公式特点的分析,即:如果一个布尔公式F中的子句可以划分为m个子句组C1, C2,,Cm,每个子句组中https://www.jos.org.cn/html/2015/9/4799.htm
6.helloalgo分治哈希表:虽然哈希表并不直接应用分治,但某些哈希冲突解决方案间接应用了分治策略,例如,链式地址中的长链表会被转化为红黑树,以提升查询效率。 可以看出,分治是一种“润物细无声”的算法思想,隐含在各种算法与数据结构之中。 12.2 分治搜索策略 暴力搜索:它通过遍历数据结构实现,时间复杂度为 ( ) 。 自适应搜索:它https://zhuanlan.zhihu.com/p/701640359
7.1.问题求解算法理解并掌握去随机的基本方法,即结合经用场景,可能可以在输入空间的一个子集上将随机算法改为确定算法●引导要点:如何找合适的输入子集 论题4-18:启发式算法 ●学习目的:通过典型的模拟淬火算法,理解启发式算法的基本概念,其价值以及局限性; 了解遗传算法的基本思想及其适用性●引导要点:如何从自然界获得灵感,以非常https://cs.nju.edu.cn/jxcgj/kctxsf.html
8.排序算法总结菜鸟教程基本思想:参考归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。首先考虑下如何将2个有序数列合并。这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 https://www.runoob.com/w3cnote/sort-algorithm-summary.html
9.算法原理:大数据处理的分治思想!腾讯云开发者社区尽管开发一个MapReduce看起来很高深,感觉遥不可及。实际上,万变不离其宗,它的本质就是分治算法思想,分治算法。如何理解分治算法?为什么说 MapRedue 的本质就是分治算法呢? 分治是一种被广泛应用的有效方法,它的基本思想是把最初的问题分解成若干子问题,然后,在逐个解决各个子问题的基础上得到原始问题的解。所谓https://cloud.tencent.com/developer/article/1691814
10.C语言常见排序算法归并排序C语言1.1 基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法 (Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序 列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 1.2 算法思想 到这里,https://www.jb51.net/article/255354.htm
11.数据结构与算法——基础篇(六)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往https://www.jianshu.com/p/229b672e6a70