LeetCode(7)-树:DFS/BFS类问题

什么时候用BFS,什么时候用DFS?BFS与DFS应用场景 1 前言 最近做到一道 找迷宫中从入口到出口最短路径的一道题。 力扣-找到离入口最近的出口 显然,理论上DFS和BFS都能找到解。 但是,DFS会超时,BFS就不会。 因此,我就又研究了一下DFS和BFS的原理,整理了一下他们的应用范围,希望自己能记住,刷题的时候少走弯路。 2 原理 2.1 BFS 宽度优先搜索算法(又称广度优先搜索) 形象地说:面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路 队列(queue)实现:每次从队 阅读详情

此文总结树中和深度优先遍历(DFS)和广度优先遍历(BFS)相关的问题.

1. LeetCode 144. 二叉树的前序遍历

给定一个二叉树,返回它的 前序 遍历。

示例:

输入: [1,null,2,3]
1

2
/
3

输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    //递归版本
    List<Integer> res = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        //递归终止条件
        if(root == null) return res;
        res.add(root.val);
        preorderTraversal(root.left);
        preorderTraversal(root.right);
        return res;
    }
    
    //迭代版本
    public List<Integer> preorderTraversal(TreeNode root) {
        //迭代做法:申请一个stack,现将head压入;当stack不为空时,
        //弹出树节点即为当前遍历所得,并且判断树节点是否存在右子节点,
        //存在则压栈;再判断是否存在左子节点,存在则压栈 
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode pop = stack.pop();
            res.add(pop.val);
            if (pop.right != null) stack.push(pop.right);
            if (pop.left != null) stack.push(pop.left);
        }
        return res;
    }

2. LeetCode 589. N叉树的前序遍历

给定一个 N 叉树,返回其节点值的前序遍历。

例如,给定一个 3叉树 :

在这里插入图片描述

返回其前序遍历: [1,3,5,6,2,4]。

说明: 递归法很简单,你可以使用迭代法完成此题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 List<Integer> res = new ArrayList<>();
    public List<Integer> preorder(Node root) {
        //递归做法,和二叉树的前序遍历相似,
        //不过需要使用for循环来获取到每个孩子节点
        if (root == null) return res;
        res.add(root.val);
        for (int i = 0; i < root.children.size(); i++) {
            Node node = root.children.get(i);
            preorder(node);
        }
        return res;
    }
    
    public List<Integer> preorder(Node root) {
        //迭代的做法,和二叉树的前序遍历迭代做法相似,
        //也是需要一个栈,不过需要使用for循环来获取到每个孩子节点
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        Stack<Node> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            Node pop = stack.pop();
            res.add(pop.val);
            for (int i = pop.children.size() - 1; i >= 0; i--) {
                //从右侧开始入栈
                stack.push(pop.children.get(i));
            }
        }
        return res;
    }

3. LeetCode 94. 二叉树的中序遍历

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
1

2
/
3

输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

List<Integer> res = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        //递归终止条件
        if (root == null) return res;
        inorderTraversal(root.left);
        res.add(root.val);
        inorderTraversal(root.right);
        return res;
    }


public List<Integer> inorderTraversal(TreeNode root) {
        //迭代做法,思路是创建一个栈,当栈不为空或当前节点不为空时,存在以下判断:
        //当节点不为空,此时将该节点压入栈中,并且将该节点置为其左节点(下移过程)
        //当节点为空时,弹栈出来的节点即为遍历结果,并且将当前节点置为弹栈节点的右子节点(上移过程)
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        Stack<TreeNode> stack = new Stack<>();
        while (!stack.isEmpty() || root != null) {
            if (root != null) {
                //压栈
                stack.push(root);
                //置为左子节点
                root = root.left;
            } else {
                //弹栈
                TreeNode pop = stack.pop();
                res.add(pop.val);
                //将当前节点置为弹栈节点的右子节点
                root = pop.right;
            }
        }
        return res;
    } 

4. LeetCode 145.二叉树的后序遍历

List<Integer> res = new ArrayList<Integer>();
    public List<Integer> postorderTraversal(TreeNode root) {
        //递归过程
        if (root == null) return res; 
        postorderTraversal(root.left);
        postorderTraversal(root.right);
        res.add(root.val);
        return res;
    }
    
    public List<Integer> postorderTraversal(TreeNode root) {
       List<Integer> res = new ArrayList<Integer>();
        if (root == null) return res;
        //stack1用以当中'中转站'
        Stack<TreeNode> stack1 = new Stack<>();
        //stack2用以保存遍历结果
        Stack<TreeNode> stack2 = new Stack<>();
        stack1.push(root);
        while (!stack1.isEmpty()) {
            //弹栈即为遍历结果
            root = stack1.pop();
            stack2.push(root);
            //stack1压入左子节点
            if (root.left !=null) stack1.push(root.left);
            //stack1压入右子节点
            if (root.right !=null) stack1.push(root.right);
        }
        //将stack2的结果取出
        while (!stack2.isEmpty()) {
            res.add(stack2.pop().val);
        }
        return res;
    }

5. LeetCode 590. N叉树的后序遍历

List<Integer> res = new ArrayList<>();
    public List<Integer> postorder(Node root) {
        //递归终止条件
        if (root == null) return res;
        for (int i = 0; i < root.children.size(); i++) {
            postorder(root.children.get(i));
        }
        res.add(root.val);
        return res;
    }
    
    public List<Integer> postorder(Node root) {
        //采用迭代的方法,思路是创建两个栈stack1和stack2,
        //其中stack1作为中转栈,stack2作为保存结果栈,
        //一开始现将root压入stack1中,当stack1不为空时,弹栈并放入stack2中,
        //将弹栈节点由左至右压入stack1中
        //当stack1为空时,将stack2依次弹栈则得遍历结果
       List<Integer> res = new ArrayList<Integer>();
        if (root == null) return res;
        //stack1用以当中'中转站'
        Stack<Node> stack1 = new Stack<>();
        //stack2用以保存遍历结果
        Stack<Node> stack2 = new Stack<>();
        stack1.push(root);
        while (!stack1.isEmpty()) {
            Node pop = stack1.pop();
            stack2.push(pop);
            for (int i = 0; i < pop.children.size(); i++) {
                stack1.push(pop.children.get(i));
            }
        }
        //获取结果
        while (!stack2.isEmpty()) {
            res.add(stack2.pop().val);
        }
        return res;
    }

6. LeetCode 102. 二叉树的层次遍历

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

3
/
9 20
/
15 7
返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public List<List<Integer>> levelOrder(TreeNode root) {
            if (root == null) return new ArrayList<>();
            ArrayList<List<Integer>> res = new ArrayList<>();
            //FIFO队列
            LinkedList<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()) {
                ArrayList<Integer> levelNodes = new ArrayList<>();
                int len = queue.size();
                //遍历存储这一层的值
                for (int i = 0; i < len; i++) {
                    TreeNode poll = queue.poll();
                    //出队的即为遍历结果
                    levelNodes.add(poll.val);
                    //如果出队的节点含有左子节点则添加进队列
                    if (poll.left != null) queue.offer(poll.left);
                    //如果出队的节点含有右子节点则添加进队列
                    if (poll.right != null) queue.offer(poll.right);
                }
                //添加这一层的结果进res中
                res.add(levelNodes);
            }
            return res;
        }

7. LeetCode 102. N叉树的层序遍历

public List<List<Integer>> levelOrder(Node root) {
        // TODO: 19-7-12 思考过程类似102题二叉树的层次遍历 
        ArrayList<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;
        LinkedList<Node> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            ArrayList<Integer> levelNodes = new ArrayList<>();
            int len = queue.size();
            for (int i = 0; i < len; i++) {
                //存储层次
                Node poll = queue.poll();
                //出队的即为遍历结果
                levelNodes.add(poll.val);
                List<Node> childrens = poll.children;
                //孩子节点从左至右入队
                for (int j = 0; j < childrens.size(); j++) {
                    queue.offer(childrens.get(j));
                }
            }
            //存储当前层次的结果
            res.add(levelNodes);
        }
        return res;
    }

8. LeetCode 102. N叉树的层序遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

3
/
9 20
/
15 7
返回锯齿形层次遍历如下:

[
[3],
[20,9],
[15,7]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        int depth = 0;
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int len = queue.size();
            ArrayList<Integer> oneRes = new ArrayList<>();
            for (int i = 0; i < len; i++) {
                TreeNode poll = queue.poll();
                //判断是奇数层还是偶数层,奇数层从左往右收集节点值,偶数层则从右往左收集节点值
                if (depth % 2 == 0) {
                    //奇数层
                    oneRes.add(poll.val);
                } else {
                    //偶数层
                    oneRes.add(0, poll.val);
                }
                if (poll.left != null) queue.offer(poll.left);
                if (poll.right != null) queue.offer(poll.right);
            }
            res.add(oneRes);
            depth++;
        }
        return res;
    }

9. LeetCode 108. 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

0
/
-3 9
/ /
-10 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums, 0, nums.length - 1);
    }

    private TreeNode helper(int[] nums, int left, int right) {
        //递归终止条件
        if (left > right) return null;
        //递归过程
        //求出当前中间节点,并且递归地连接左右子树
        int middle = left + (right - left) / 2;
        TreeNode root = new TreeNode(nums[middle]);
        root.left = helper(nums, left, middle - 1);
        root.right = helper(nums, middle + 1, right);
        return root;
    }

10. LeetCode 105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

3
/
9 20
/
15 7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> inorder_map = new HashMap<>();
        int n = inorder.length;
        for (int i = 0; i < n; i++) inorder_map.put(inorder[i], i);

        return helper(preorder, 0, n, inorder, 0, n, inorder_map);


    }

    private TreeNode helper(int[] preorder, int pre_start, int pre_end, int[] inorder, int in_start, int in_end, Map<Integer, Integer> inorder_map) {
        if (pre_start == pre_end) return null;
        //从先序遍历中取当前根节点
        TreeNode root = new TreeNode(preorder[pre_start]);
        //从map中取当前根节点对于中序遍历数组的索引位置
        int loc = inorder_map.get(preorder[pre_start]);
        //划分成左右两个子树去构建
         root.left = helper(preorder, pre_start + 1, pre_start + loc - in_start + 1, inorder, in_start, loc - 1, inorder_map);
        root.right = helper(preorder, pre_start + loc - in_start + 1, pre_end, inorder, loc + 1, in_end, inorder_map);
        return root;
    }

还有一种基于Arrays.copyOfRange的写法,这种写法更加地直观和简单:

import java.util.*;
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return rebuild(preorder, inorder); 
    }
    
    private TreeNode rebuild(int[] preorder, int[] inorder) {
        if (preorder.length == 0 || inorder.length == 0) {
            return null;
        }
        //当前根节点
        TreeNode root = new TreeNode(preorder[0]);
        //找到当前根节点位于中序遍历的索引
        int rootIndex = findIndex(inorder, preorder[0]);
        //递归
        root.left = rebuild(Arrays.copyOfRange(preorder, 1, rootIndex + 1),
                            Arrays.copyOfRange(inorder, 0, rootIndex));
        root.right = rebuild(Arrays.copyOfRange(preorder, rootIndex + 1, preorder.length),
                            Arrays.copyOfRange(inorder, rootIndex + 1, inorder.length));
        return root;
    }
    
    private int findIndex(int[] array, int target) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == target) return i;
        }
        return -1;
    }
}

未完持续…

深度优先算法DFS入门 (超级简单的例题入门) 参考文章: 1、Leetcode Subset I & II 作者:算法鱼 (里面是java版本的代码) 一、什么是 DFS? 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 具体做法是:假设初始状态是图中所有顶点均未被访问,则从某个顶点V出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V有路径相通的顶点都被... 阅读详情

相关推荐

树的递归遍历,DFS遍历和BFS遍历

文章目录树的递归遍历,DFS遍历和BFS遍历问题解法一:递归遍历解法二:DFS遍历解法三:BFS遍历总结DFS模板BFS模板 树的递归遍历,DFS遍历和BFS遍历 问题 解法一:递归遍历 解法二:DFS遍历 解法三:BFS遍历 总结 DFS模板 BFS模板 待续 ...

JackComeOn的博客 4011

golang BFS DFS

突然想起一个面试题,用go实现不太好写,明天在想有什么好的方法实现图,暂时就想到这么实现 package main import "fmt" type list struct { data string //表示能够访问的点,包括自己,考虑到QQ也可以给自己发消息 next []*list } var m map[string]bool //遍历每层的点,第一层就是A点 func DFS(row []*list){ if len(m) == 5 { return } //下一层的点的集

qq_44477844的博客 1561

DFS深度优先搜索和BFS广度优先搜索 leetcode 200. Number of Islands【python解法】

一、深度优先搜索和广度优先搜索 DFS(Depth-First-Search),是盲目搜索算法的一种。常常用在树的遍历及图的处理上。假设当前搜索的节点记为k,深度优先搜索表示,继续探寻k节点的所有的边。搜索过程中,遇到满足条件的k+1节点,则继续搜索探寻k+1节点的所有的边。最后回溯至节点k。这个过程一直进行到已发现从源节点开始可以到达的所有节点位置。 **深度优先遍历图算法步骤: 访问起始...

Sesen的木屋 1085

深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索(DFS)和广度优先搜索(BFS)是图论中两个非常重要的算法,主要用于拓扑排序,寻路(走迷宫)和搜索引擎等。

Go-Hello的博客 8063

BFS与DFS简介与LC实例

BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或搜索算法,在树与图相关算法的考察中是非常常见的两种解题思路。 BFS与DFS常考算法整理 Definition of DFS and BFS How to Implement DFS a...

MapleStory的博客 2412

第7篇-SAP MM模块-JIT应用实战解析,从计划协议到JIT供应的关键配置与流程

本文深入解析SAP MM模块中的JIT(Just In Time)供应模式,从计划协议到JIT供应的关键配置与流程。通过动态计划行管理、需求聚合与分解等核心功能,实现精确数量、时间和地点的物料供应。文章详细介绍了主数据准备、计划协议配置、MRP参数精调及EDI集成方案,并提供了实施中的典型问题与解决方案,助力企业优化供应链管理。

weixin_30363509的博客 948

dfs /bfs/ dp/ 贪心 (leetcode55)

详见https://leetcode.com/articles/jump-game/# 思路 dfs/bfs dfs和bfs都是非常简单的思路。 在dfs中,可以通过最后一层的结果赋予上一层值,从而降低复杂度。 dp 这里我的思路是:i指针从后往前遍历。如果i指向的是一个好的点,那么将所有能一次到达i的点都赋值为好的点。 答案的思路是:依旧是i指针从后往前遍历。如果在i之后有i能到达的好的点,则i...

weixin_44147606的博客 1318

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4797

golang力扣leetcode 1020.飞地的数量

1020.飞地的数量1020.飞地的数量题解代码 1020.飞地的数量 1020.飞地的数量 题解 BFS或者DFS,这题的思路就是把边框当作搜索的点,那么能搜索到的就是能走通的,即代码中的vis,进行遍历即可算出搜索不到的,就是答案了 代码 package main func numEnclaves(grid [][]int) int { var dirs = []struct{ x, y int }{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} var vis = make(

清风 643

UE5在Ubuntu22.04.4下的高效开发环境配置指南

本文详细介绍了在Ubuntu 22.04.4系统上配置UE5高效开发环境的完整指南,包括系统准备、显卡驱动安装、UE5引擎编译与配置、开发工具链设置以及性能优化技巧。通过逐步指导,帮助开发者快速搭建稳定的UE5开发环境,解决常见问题,提升开发效率。

weixin_29251131的博客 383

Mamba-YOLO实战:环境配置+模型训练+精度调优全流程指南(附Colab代码)

在目标检测领域,一场由状态空间模型引发的技术革新正在悄然改写行业格局。近期国际顶级学术期刊连续发布的YOLOv5_mamba、FER-YOLO等突破性成果,不仅刷新了检测精度记录,更开创了结构化状态空间模型(SSM)与经典检测框架的创新融合范式。当前该领域涌现的十大标杆性研究,已在以下维度取得突破性进展:√ 遮挡目标识别准确率提升38%√ 小样本场景泛化能力增强2.7倍√ 视频流检测延迟降低至17ms√ 多目标交叉干扰抑制效果达SOTA。

2501_90555291的博客 1583

树型算法题解

树结构如下 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 1. 获取给定二叉树最小深度 思路:通过广度优先遍历能更快找到最优解。深度优先搜索也可以找到最优解,但是需要找到所有解后 广度优先搜索,一层一...

asd804171023的博客 1392

4. PCIe 接口时序

在上一篇中,大致介绍IPcore接口。总的来说接口如下图数据的接收和发送通过transmitTLPinterface和ReceiveTLPinterface。收发数据的时序也只是描述这几个接口的关系。从手册上截取PCIex1的接口时序。

jjinl的专栏 6123

LeetCode琅琊榜第十三层-全排列(DFS深度优先算法)

LeetCode.46全排列 难度:中等 博主空间与往期力扣 题目链接

算法萌新一枚 805

SAP Fiori Elements 扩展实战:UI 层扩展、OData 服务扩展、CDS 视图增强及全流程案例

UI 层扩展主要关注在不修改标准生成界面的基础上,自定义用户界面元素和交互逻辑。典型需求包括:在现有 Fiori Elements 界面上添加新的字段(如表格列或表单项)、增加自定义按钮并绑定操作、以及通过控制器扩展加入事件处理等。无论在 RAP 还是传统 BOPF 架构下,前端 UI 扩展通常采用 SAPUI5 提供的**扩展点(Extension Points)和控制器扩展(Controller Extension)**机制来安全地插入自定义代码。下面分别说明两种后端架构下 UI 扩展的实现方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 905

使用HART Server PC软件进行HART设备的组态、调试和分析的完整指南

HART协议是一种用于工业自动化中的双向通信协议,能够在4-20mA模拟信号的基础上叠加数字信号,从而实现设备的远程监控和管理。HART协议兼具模拟和数字通信的优点,被广泛应用于过程控制系统中。设备组态:通过软件可以对HART设备进行组态,配置设备参数。设备调试:支持设备的在线调试和故障诊断,方便快速解决问题。数据分析:提供设备运行数据的实时监控和历史数据分析功能。报表生成:支持生成各类报表,便于数据记录和管理。

qq_38334677的博客 2475

图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。 前言 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻

qq_44918331的博客 3万+

数据架构师必看:大数据时代的架构演进与实践

数据架构是企业数据资产的“骨架”——它决定了数据能多快被处理、多准被分析、多安全被存储。本文将聚焦从传统架构到大数据架构的关键转折点,覆盖技术选型、典型场景、落地挑战三大核心命题,帮助读者建立“演进思维”而非“固定思维”。本文将按“历史演进→核心概念→技术原理→实战案例→趋势展望”的逻辑展开,用“超市仓库升级”贯穿始终,让抽象的技术概念具象化。传统数据仓库:精但小,适合结构化、批量分析。大数据架构:大但乱,适合全类型、海量数据存储。流批一体:解决实时+批量的效率问题。湖仓一体。

AI Agent Harness Engineering 914

LeetCode 101.对称二叉树(DFS、BFS)

给定一个二叉树,检查它是否是镜像对称的。

晴空๓ 5233

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

DFS和BFS

一、DFS(深度优先搜素算法) 1、基本概念 深度优先搜索算法(depth first search, 简称dfs) 是一种用于遍历或搜索树或图的算法。沿着数的深度遍历树的节点,尽可能深的搜索树的分支。当节点v所在边都已被探寻或者在搜索时节点不满足条件, 搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有满足条件的所有节点被访问为止。 2、算法思路 深度优先遍历图的方法是,从...

weixin_43763859的博客 3117

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python - 深夜数据结构与算法之 BFS & DFS

Python BFS/DFS 简介与算法练习。

BITDDD小栈 3121

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【刷题】Leetcode 1609.奇偶树

本文初步介绍了DFS和BFS算法,并讲解了判断奇偶树的两种方法。

叫我龙翔的博客 1565

leetcode刷题总结之BFS与DFS

DFS算法:一直往深处走,直到找到解或者走不下去为止。 BFS算法:一层一层的搜索,直到找到解或者点全部访问完为止。 DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。 BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进出队列。 用途: DFS多用于连通性问题因为其运行思想与人脑的思维很相似,故解决连通性问题更...

algsup 3608

基于Java的深度优先遍历(DFS)和广度优先遍历(BFS)

什么是深度/广度优先遍历(DFS/BFS)? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。

Robin的博客 3477

LeetCode 200.岛屿数量(DFS、BFS)

给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

晴空๓ 1808

LeetCode算法题4:DFS和BFS

本文介绍了深度优先搜索(DFS)和广度优先搜索(BFS)算法的基本原理及其在图像渲染问题中的应用。DFS采用递归方式访问元素,通过修改像素值避免重复访问;BFS借助队列实现层级扩散,从中心点向外逐层渲染。两种算法都需要处理边界条件和初始颜色判断,但BFS需要注意入队时标记已访问节点,防止重复处理。文末还指出了BFS实现中可能存在的重复入队问题,需特别注意访问时机。两种搜索方法在解决连通区域填充问题时各有特点。

Little_ant_的博客 3251
上一篇: Java基础(5)-散列表与HashMap那点事
下一篇: 算法学习笔记(9)-回溯算法与八皇后问题
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值