十种常用算法之分治算法(java版)

十大常用算法的完整实现

一、二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149
二、分治算法:https://blog.csdn.net/weixin_46635575/article/details/121532941
三、动态规划算法:https://blog.csdn.net/weixin_46635575/article/details/121534074
四、KMP算法:https://blog.csdn.net/weixin_46635575/article/details/121590510
五、贪心算法:https://blog.csdn.net/weixin_46635575/article/details/121626626
六、普利姆算法:https://blog.csdn.net/weixin_46635575/article/details/121653256
七、克鲁斯卡尔算法:https://blog.csdn.net/weixin_46635575/article/details/121670374
八、地杰斯特拉算法:https://blog.csdn.net/weixin_46635575/article/details/121692675
九、佛洛依德算法:https://blog.csdn.net/weixin_46635575/article/details/121714678
十、马踏棋盘算法(周游骑士算法):https://blog.csdn.net/weixin_46635575/article/details/121716596

1、分治算法的介绍

1、基本介绍

在这里插入图片描述
2、基本步骤

在这里插入图片描述
3、分治算法

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

  • 再来看这个
    在这里插入图片描述

2、分治算法的应用案例

(1)汉诺塔的思想

在这里插入图片描述

  • 当只有一个盘的时候,会直接把盘从A柱子移动到C柱子就OK了
  • 当有两个盘子的时候呢?是不是先把上面个盘子移动到B柱子,然后再移动地下的大盘到C,再转义B柱子上的
    在这里插入图片描述
  • 当有三个盘子呢?自己好好想一下,要把上面两个分为一个整体,进行处理,(不能把上面个一整一次性拿走)
    在这里插入图片描述
  • 当有四个盘子的时候一样的,要把上面三个分为一个整体进行处理(不能把上面个一整一次性拿走)
    在这里插入图片描述
  • 。。。。。。。。。。。。。。。。等

(2)上面思想分析

  • 如果只有一个盘:则A到C即可
  • 如果有两个或以上的盘子的时候:总是看作两个盘,最下面个盘子和上面的一部分盘。
    • 把最上面的整体一定到B柱子
    • 把最下面个盘子移动到C柱子
    • 把B的其他盘移动到C柱子

(3)代码实现

还是比较好理解的,千万不要用64去测试啊,我电脑跑了几分钟没有跑出个结果。

public class Hanoitower {
    public static void main(String[] args) {
        hanoitwer(5,'A','B','C');
    }


    /**
     * //汉诺塔的移动方法
     *     //使用分治算法
     * @param num ,盘数
     * @param a A柱子
     * @param b B柱子
     * @param c C柱子
     */
    public static void hanoitwer(int num,char a, char b, char c) {
        //如果只有一个盘的时候
        if (num == 1) {
            System.out.println("第1个盘从:" + a + "->" + c);
        } else {//如果不是一个盘子的时候
            //1、第一步,把最下面个的上面部分当做一个整体从A柱子移动到B柱子
            //进行递归处理 中间移动过程会用到C柱子,目的是A移动到B
            hanoitwer(num - 1,a,c,b);
            //2、把最下面的一个移动到C柱子
            System.out.println("第" + num + "个盘子:" + a + "->" + c);
            //3、把B上的盘子一定到C,此过程是把B上的移动到C,中间会用到A柱子
            hanoitwer(num - 1,b,a,c);
        }
     }
}

  • 还是要回归我们的分,主要是要会分,把上面的分开,然后当做一个子问题,进行重新递归排。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值