【java算法】中缀转后缀/递归/时间复杂度

递归

简单递归分析

输出为2 3 4
在这里插入图片描述

输出为2
在这里插入图片描述

递归解决问题应用
在这里插入图片描述

递归遵守的重要原则
在这里插入图片描述

迷宫问题

在这里插入图片描述
代码实现

package digui;

public class MiGong {
    
    
    public static void main(String[] args) {
    
    
        //先创建一个二维数组模拟迷宫
        //地图声明
        int[][] map = new int[8][7];
        //使用1表示
        //上下全部置为1
        for (int i = 0; i < 7; i++) {
    
    
            map[0][i] = 1;
            map[7][i] = 1;
        }

        //左右全部置为1
        for (int i = 0; i < 8; i++) {
    
    
            map[i][0] = 1;
            map[i][6] = 1;
        }
        //设置挡板 1表示
        map[3][1] = 1;
        map[3][2] = 1;
        //输出地图
        System.out.println("地图的情况:");
        for (int i = 0; i < 8; i++) {
    
    
            for (int j = 0; j < 7; j++) {
    
    
                System.out.printf(map[i][j]+" ");
            }
            System.out.println();
        }

        //使用递归回溯给小球找路
        setWay(map,1,1);

        //输出新地图 小球走过 并标识过的递归
        System.out.println("小球走过 并标识过的地图情况:");
        for (int i = 0; i < 8; i++) {
    
    
            for (int j = 0; j < 7; j++) {
    
    
                System.out.printf(map[i][j]+" ");
            }
            System.out.println();
        }
    }

    //使用递归回溯来给小球找路
    //1.map 表示地图
    //2.i j表示从地图哪个为止开始出发
    //3.如果小球能到map[6][5]为止 则说明通路找到
    //4.约定 当map[i][j]为0表示该点没有走过;2表示路可以走;3表示该点已经走过 但是走不通
    //5.在走迷宫时 需要确定一个策略:下 右 上 左,如果该点走不通 再回溯
    /**
     *
     * @param map 表示地图
     * @param i 从哪个位置开始找
     * @param j
     * @return 如果找到通路 则返回true
     */
    public static boolean setWay(int[][] map,int i,int j){
    
    
        if (map[6][5] == 2){
    
    //通路已经找到ok
            return true;
        }else {
    
    
            if (map[i][j] == 0){
    
    //如果当前这个点还没走过
                //按照策略 下 有 上 左 走
                map[i][j] = 2;//假定该点是可以走通
                if (setWay(map,i+1,j)){
    
    
                    //向下走
                    return true;
                }else if (setWay(map,i,j+1)){
    
    
                    //向右走
                    return  true;
                }else if (setWay(map,i-1,j)){
    
    
                    //向上走
                    return true;
                }else if (setWay(map,i,j-1)){
    
    
                    //向左走
                    return true;
                }else {
    
    
                    //说明该点是走不通 死路
                    map[i][j] = 3;
                    return false;
                }
            }else {
    
    
                //如果map[i][j] != 0 可能是1 2 3
                return false;
            }
        }
    }
}

在这里插入图片描述

若新增挡板map[2][2]则输出
在这里插入图片描述

迷宫问题最短路径的引入

改策略为上右下左
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八皇后问题

思路分析
在这里插入图片描述

扫描二维码关注公众号,回复: 14793404 查看本文章

时间复杂度

度量程序执行时间的两种方法
在这里插入图片描述

时间频度
在这里插入图片描述

简化时间复杂度式

忽略常数项
在这里插入图片描述

忽略低次项
在这里插入图片描述

忽略系数(限定条件
在这里插入图片描述

时间复杂度的计算

在这里插入图片描述

常见的时间复杂度

在这里插入图片描述

常数阶O(1)
在这里插入图片描述

对数阶O(log2n)
在这里插入图片描述

线性阶O(n)
在这里插入图片描述

线性对数阶O(nlogN)
在这里插入图片描述

平方阶O(n2 )
在这里插入图片描述

立方阶O(n3) K次方阶O(nk)
在这里插入图片描述

平均时间复杂度和最坏时间复杂度

在这里插入图片描述

空间复杂度

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_65431212/article/details/128678716