分治算法

介绍

1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并

2.应用:二分搜索、大整数乘法、棋盘覆盖、归并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔、快速傅立叶变换

 

步骤

1.分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题

2.解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

3.合并:将各个子问题的解合并为原问题的解

 

分治算法解决汉诺塔问题

public class HanoiTower {
    static int times;//记录移动次数

    /**
     * 移动盘子
     *
     * @param n:盘的个数
     * @param a:所有盘的起点
     * @param c:所有盘的终点
     */
    public static void move(int n, char a, char c) {
        System.out.println("第" + (++times) + "次移动" + "第" + n + "个盘从" + a + "->" + c);
    }

    //分治算法递归
    public static void hanoiTower(int n, char a, char b, char c) {
        if (n == 1) {//只有一个盘
            move(n, a, c);
        } else {//多个盘,分割为两部分,最底层一个盘,上面所有盘视作整体
            //n-1个盘从A移到B,以C作过渡
            hanoiTower(n - 1, a, c, b);
            //第n个盘从A移到C
            move(n, a, c);
            //n-1个盘从B移到C,以A作过渡
            hanoiTower(n - 1, b, a, c);
        }
    }
}

 

posted @   半条咸鱼  阅读(22)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示