分而治之算法
记录关于分而治之思路的一些算法
分而治之三步骤:分解原问题,解决子问题,合并问题解
1.分解原问题:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。
2.解决子问:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。
3.合并:将各子问题的解合并为原问题的解。
MrYuShiwen
能够成就别人的人才能称得上是真英雄,愿我们彼此相互成就,成为那个真英雄!
Java开发工程师,后端工程师,努力想成为架构师的小萌新;
写代码和学习新知识是一件非常有趣的事情,它即是个人爱好也是个人职业;
愿我的文章对读者有用,欢迎评论,一起进步!
如果期待更多我的知识分享,请关注我,一起成为那个了不起的人吧!
展开
-
次序选择问题 java代码完整实现 分治法
什么是次序选择:就是需要找出给定序列中第k小元素(其中k大1小于n)。比如当k=3时,我们需要找出该序列中第三小元素。分治法解决次序选择问题:我们可以借用随机主元的快速排序的思维去解决该问题(点击查看本人另一篇博文随机化快速排序:随机化快速排序),与快速排序不同的是,在主元下标等于k时,我们就可以直接退出,不需要再进行剩下的分解问题和合并问题解过程。其时间复杂度的数学期望为O(n),是一个非常高效的算法。比如我们要寻找第4小元素,给定数组为945721683,下面我们对其进行分析:开始——>原创 2020-07-11 10:59:13 · 2015 阅读 · 3 评论 -
快速排序(随机化快速排序 随机主元)java代码(递归实现)分治法(分而治之)
固定主元的快速排序:1.首先选取一个主元(一般取数组的头部或者尾部为主元);2.把其他数与主元比较,如果比主元小,放主元左边,如果比主元大,放主元右边;(这个时候主元左边的数都只是比主元小,左边的数还没有从小到大排好)。3.对主元左边数组段重复1,2步骤;对右边也重复1,2步骤。ps:上述步骤2的具体实现说明(主元以每次选取数组尾端元素为例):1.创建两个指针i,j;i初始值为数组头部元素下标减一,j为数组头部元素下标(i左边存放比主要小的元素,i到j存放比主元大的元素,等到j走到尾端要交换主元素原创 2020-07-10 21:30:13 · 1343 阅读 · 0 评论 -
逆序对(逆序对问题) 分而治之方法(分治法)java代码实现完整版(递归实现)
什么是逆序对:对于一个包含n个整数的数组arr[1…n],如果有i < j,且arr[ i ]>arr[ j ],则称(A[ i] ,A[ j] )为数组arr中的一个逆序对。一般思维:蛮力枚举:即两层for循环遍历每个元素,这样的算法时间复杂度为O(n2).那么我们能否利用分治法去寻找一个更有效的方法去解决问题呢。分治法解决逆序对:我们可以参考归并排序的过程,结合归并排序每次比较排序之后的有序性,在合并的过程中进行统计逆序对的个数,(不太了解分治法和归并排序的读者,可以点击查看我原创 2020-07-09 18:52:13 · 1985 阅读 · 3 评论 -
最大子数组(最大子数组和)分治法 java代码实现(完整版)递归方式实现(分而治之)
什么是最大子数组:子数组:数组中一段连续的序列最大子数组:子数组中各个值相加和最大一般人思维1:蛮举,把数组中每个子数组都计算一遍当然这样的算法效率是低下的一般人思维2:我们在蛮举的时候会发现其实有很多重复计算的地方,所以我们会想到保存上次相加后的结果,但是这样的算法效率也不够高,其时间复杂度为O(n2).接下来我将会介绍用分而治之算法思想去解决问题分而治之解决最大子数组问题:1.什么是分而治之:...原创 2020-07-08 15:55:09 · 1832 阅读 · 0 评论 -
归并排序 (分而治之算法) java代码实现(java完整代码)java递归实现(分而治之)MergeSort(分治法)
归并排序是分而治之算法策略的典型代表之一分而治之算法的思路:分而治之三步骤:分解原问题,解决子问题,合并问题解1.分解原问题:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。2.解决子问:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。3.合并:将各子问题的解合并为原问题的解。归并排序:以数组为例,假设数组长度为n1.首先把其拆分n组每组一个,2.然后每相连的两组进行比较,并排序;(第一遍排序之变成了n/2组,每组为2个,当然若n为奇数,则最后一组只有原创 2020-07-07 17:16:38 · 2186 阅读 · 0 评论