Algorithm Divide-And-Conquer

Divide and conquer is an algorithm design paradigm based on multi-branched recursion. A divide-and-conquer algorithm works by recursively breaking down a problem into two or more sub-problems of the same or related type, until these become simple enough to be solved directly. The solutions to the sub-problems are then combined to give a solution to the original problem.

前言

    分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

分治算法

分治算法介绍:

1)分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……
2)分治算法可以求解的一些经典问题:二分搜索,大整数乘法,棋盘覆盖,合并排序,快速排序,线性时间选择,最接近点对问题,循环赛日程表,汉诺塔。

分治算法的基本步骤

分治法在每一层递归上都有三个步骤:
1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
3)合并:将各个子问题的解合并为原问题的解。

汉诺塔游戏思路分析:

如果是有一个盘, A->C
如果我们有 n >= 2 情况,我们总是可以看做是两个盘 1.最下边的盘 2. 上面的盘
1)先把 最上面的盘 A->B
2)把最下边的盘 A->C
3)把B塔的所有盘 从 B->C

分治算法解析:


汉诺塔游戏代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @Auther: Arsenal
* @Date: 2020-03-28 17:22
* @Description: 分治算法
*/
public class DivideAndConquer {
public static void main(String[] args) {
hanoiTower(3,'A','B','C');
}

/**
* 汉诺塔
* @param num 盘子数量
* @param a a塔
* @param b b塔
* @param c c塔
*/
public static void hanoiTower(int num, char a, char b, char c) {

if (num == 1) { //如果是有一个盘, A->C
System.out.println("第" + num + "个盘从 " + a + "==>" + c);
} else { //有 n >= 2 情况,我们总是可以看做是两个盘 1.最下边的盘 2. 上面的盘
//先把 最上面的盘 A->B
hanoiTower(num - 1, a, c, b);
//把最下边的盘 A->C
System.out.println("第" + num + "个盘从 " + a + "==>" + c);
//把B塔的所有盘 从 B->C
hanoiTower(num - 1, b, a, c);
}

}
}

延伸

    分治算法
    分治算法总结
    分治算法-百度百科
    韩顺平数据结构和算法
    Data Structures - Divide and Conquer

Content
  1. 1. 前言
  2. 2. 分治算法
  3. 3. 延伸