分治算法概念:
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
分治基本思想:
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。
分治算法解题步骤:
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
汉诺塔例题:
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
分析:
1)当 n == 1时,直接将盘子从 A 移动到C
(2)当 n > 1时,可以拆分成3大步骤
①将 n– 1 个盘子从 A 移动到B
②将编号为 n 的盘子从 A 移动到C
③将 n– 1 个盘子从 B 移动到C
步骤:
package 刷题24;
public class 分治例题 {
public static void main(String[] args) {
hanoitol(3, "a", "b", "c");
}
private static void hanoitol(int q, String a, String b, String c) {
// 如果只有一个那么直接打印从a到c
if (q == 1) {
System.out.println("从" + a + "到" + c);
} else {
hanoitol(q - 1, a, c, b);// 除了第q个其他所有的从a到b,此时c是辅助盘子
System.out.println("从" + a + "到" + c);// 把第q个从a到c
hanoitol(q - 1, b, a, c);// 除了第q个其他所有的从b到c,此时a是辅助盘子
}
}
}