常见算法——分治算法

常见算法——分治算法

基本介绍

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

基本思想

  • 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略基本思想

应用案例(汉诺塔问题)

在这里插入图片描述借助中间柱B将A柱上的盘移动到C柱。

代码实现

package com.divide_and_conquer;

public class Hanoitower {

	public static void main(String[] args) {
		hanoiTower(5, 'A', 'B', 'C');

	}
	// 汉诺塔的移动方法
	// 分治算法
	public static void hanoiTower(int num, char a, char b, char c) {
		// 只有一个盘
		if (num == 1) {
			System.out.println("第1个盘从" + a + "-->" + c);
		} else {
			// 如果我们有n>=2情况,我们总是可以看做是两个盘1.最下边的盘2.上面的盘
			// 1.先把最上面的盘A->B 移动过程会使用到c
			hanoiTower(num - 1, a, c, b);
			// 2.把最下边的盘A->C
			System.out.println("第" + num + "个盘从" + a + "-->" + c);
			// 3.把B塔的所有盘从B->C 移动过程会使用到a
			hanoiTower(num - 1, b, a, c);
		}
	}
}
发布了39 篇原创文章 · 获赞 31 · 访问量 6064

猜你喜欢

转载自blog.csdn.net/lu_long/article/details/104114179