算法—趣味理解分治算法

来源:互联网 发布:结构优化设计 王光远 编辑:程序博客网 时间:2024/05/22 08:23


所谓分治算法,先来个官方的解释:

将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立并且与原问题的性质相同。

求出子问题的解,就能得到原问题的解。


接下来是我的个人解释:

你是不是想到了微积分的微分积分化,数学归纳法。和高中学的数学归纳法还是很相似的,通过归纳出已知的问题的方法,来解决未知同类问题,就像自己归纳出函数方法一样。

其实到目前为止我觉得解释的还是比较抽象的,那我来两个示例代码吧

其实分治法,很像去医院看病治病


1.当你得了一种疑难杂症,你去医院找全科医生,医生不知道你具体哪里有问题,会让你全身检查一遍,去X光,胸透,心电图等等,就像下面的用(for循环遍历)(全身检查)一遍数组来(求最大值)(治好你那疑难杂症)

public class Test {public static void main(String[] args) {int[] array = new int[] { 2, 4, 5, 6, 23, 24, 21, 66, 21 };int max = array[0];// 通过使用for循环求出array数组的最大值for (int i = 0; i < array.length; i++) {if (array[i] > max)max = array[i];}System.out.println("array数组中最大的值为:" + max);}}

2.当你第二天以为疑难杂症解决了,知道了原来是亚健康,于是你再去医院看病,这时候好友建议你去看中医来调养和看西医来吃点药片,你觉得方法不错,于是你开干了,将这串数组分两块,左右两部分,自己写GetMax()方法

public class Test {public static int m;public static void main(String[] args) {int[] array = new int[] { 2, 77, 5, 6, 23, 24, 21, 66, 21 };System.out.println(GetMax(array, 0, 8));}public static int GetMax(int[] array, int l, int r) {int a, b;m = (l + r) / 2;if (l == m)return array[l];a = GetMax(array, l, m);b = GetMax(array, m + 1, r);return a > b ? a : b;}}

这两种看病方式都很有效,遍历,递归,但是你发现没有,第一种看病方式比第二种价钱贵出好几框皮皮虾,因为第一种遍历方式比第二种递归方式的算法频率高很多,因为给的数组数据很少,你没发现,可是当几千个人去医院看疑难杂症会都全身检查一遍吗?应该不会吧,从算法的时间复杂度明显后者比较高效


这个算法还用于解决一些经典问题:

(1)二分搜索 (2)大整数乘法 (3)Strassen矩阵乘法 (4)棋盘覆盖 (5)合并排序 (6)快速排序 (7)线性时间选择 (8)最接近点对问题 (9)循环赛日程表(10 )汉诺塔


我解释的可能比较粗浅,请大牛指正,这是我第一次接触算法,希望能形象记忆并喜欢上算法,不定期更新


0 0