分治算法Divide and Conquer
创始人
2024-02-09 00:30:00
0

评价

它可以减少运行的时间,很多问题如果暴力求解需要O(n^2)的复杂度,而通过分治可以减少到O(nlogn)
当与随机化技术相结合时,分治的功能很强大

分治算法的步骤

1.先将大的问题分解为一个个小的子问题
2.对每一个子问题通过递归对他们进行求解
3.然后将求解后的子问题进行合并,就完成了对大问题的求解

经典问题

问题一:归并排序问题

Sort problem
INPUT: An array of n integers, denoted as A[0..n − 1]
OUTPUT: The elements of A in increasing order

想法一

将一个数组分为两部分,每次都去除最后一个元素,然后对前面剩余的元素进行排序。
在这里插入图片描述
伪代码:

1: if k ≤ 1 then
2: return ;
3: end if
4: InsertionSort(A, k − 1);//排序前k-1个,要执行n次
5: key = A[k];
6: i = k − 1;
7: while i ≥ 0 and A[i] > key do//将第k个插入,插入时间为O(n)
8: A[i + 1] = A[i];
9: i − −;
10: end while
11: A[i + 1] = key;

在这里插入图片描述
这种分治的方法也可以解决问题,但他的时间复杂度为O(n^2),并没有节约时间。
证明:T(n) = T(n − 1) + O(n) = O(n^2).

想法二

从中间分,将一个数组一分为二成两个差不多大的数组。
在这里插入图片描述

1: //Sort elements in A[l..r]
2: if l < r then
3: m = (l + r)/2; //m denotes the middle point
4: MergeSort(A, l, m );
5: MergeSort(A, m + 1, r);
6: Merge(A, l, m, r); //Combining the sorted arrays
7: end if

在这里插入图片描述
合并算法的实现为:

Merge (A, l, m, r)
1: //Merge A[l..m] (denoted as L) and A[m + 1..r] (denoted as R).
2: i = 0; j = 0;
3: for k = l to r do
4: if L[i] < R[j] then
5: A[k] = L[i];
6: i + +;
7: if all elements in L have been copied then
8: Copy the remainder elements from R into A;
9: break;
10: end if
11: else
12: A[k] = R[j];
13: j + +;
14: if all elements in R have been copied then
15: Copy the remainder elements from L into A;
16: break;
17: end if
18: end if
19: end for

在这里插入图片描述
此时它的时间复杂度为:O(nlogn),比想法一的要快很多,由此可以看出,这种划分的策略是更好的
在这里插入图片描述

问题二:逆序对问题

CountingInversion problem
INPUT: An array A[0..n − 1] with n distinct numbers;
OUTPUT: the number of inversions. A pair of indices i and j
constitutes an inversion if i < j but A[i] > A[j].

这个问题可以用暴力的办法来求解,但是需要花费的时间为O(n^2),我们可以考虑用分治的思想来进行求解。
首先将原先的数组一分为二,然后对分开的每一部分求出它的逆序对数,最后在合并的时候,在求出前后两部分存在的逆序对。
在这里插入图片描述
在这里插入图片描述
从上述图片我们可以看出,求逆序对的思想和归并排序的思想很相似,只是求逆序对时在合并的时候要再进行一步处理,也就是要求出前后两部分的逆序对。

Merge-and-Count (L, R)
1: RC = 0; i = 0; j = 0;
2: for k = 0 to ∥L∥ + ∥R∥ − 1 do
3: if L[i] > R[j] then
4: A[k] = R[j];
5: j + +;
6: RC+ = (∥L∥ − i);//这一步就说明,存在前面的数比后面的数大,也就是有逆序对。
7: if all elements in R have been copied then
8: Copy the remainder elements from L into A;
9: break;
10: end if
11: else
12: A[k] = L[i];
13: i + +;
14: if all elements in L have been copied then
15: Copy the remainder elements from R into A;
16: break;
17: end if
18: end if
19: end for

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...