【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]则输出
在这里插入图片描述

迷宫问题最短路径的引入

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

八皇后问题

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

时间复杂度

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

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

简化时间复杂度式

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

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

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

时间复杂度的计算

在这里插入图片描述

常见的时间复杂度

在这里插入图片描述

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

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

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

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

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

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

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

在这里插入图片描述

空间复杂度

在这里插入图片描述

猜你喜欢

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