算法模型从入门到起飞系列——广度优先遍历(BFS)

news2025/3/22 12:07:21

文章目录

  • 前言
  • 一、广度优先遍历(BFS)简介
    • 1.1 广度优先遍历(BFS)的特点
    • 1.2 广度优先遍历(BFS)的要素
  • 二、广度优先遍历(BFS)& 深度优先遍历(DFS)
    • 2.1 广度优先遍历pk深度优先遍历
    • 2.2 BFS & DFS使用场景
    • 2.3 BFS & DFS性能分析
  • 三、广度优先遍历模板
    • 3.1 广度优先遍历伪代码
    • 3.2 广度优先遍历模型图解
    • 3.3 广度优先遍历java模板
    • 3.4 广度优先遍历性能优化方案
  • 四、广度优先遍历取经之路
  • 献给读者


在这里插入图片描述
在这里插入图片描述


前言

探索算法之美:深入浅出广度优先遍历

在数据结构与算法的世界里,图和树无疑是最基础也是最迷人的结构之一。它们不仅构成了计算机科学理论的重要组成部分,而且在实际应用中也无处不在——从搜索引擎、社交网络到路径规划系统,这些技术背后的逻辑都离不开对图和树的有效处理。而在众多用于探索这些结构的方法中,广度优先遍历(Breadth-First Search, BFS)以其简洁而强大的特性脱颖而出,成为解决许多问题的关键。

在这个快节奏的信息时代,理解如何高效地搜索和解析复杂的数据结构变得尤为重要。无论你是正在寻找最佳路线的旅行者,还是致力于优化数据库查询的开发者,掌握BFS都能为你提供一种全新的视角和工具集。本篇博客旨在通过通俗易懂的语言和生动的例子,带你走进广度优先遍历的奇妙世界,揭开它那看似神秘却极具实用价值的面纱。

接下来的内容中,我们将一起探讨BFS的核心概念、工作原理及其应用场景。此外,我们还将通过具体的代码实现,展示如何将这一强大的算法应用于实际问题之中。不管你是编程新手,还是经验丰富的工程师,相信这篇文章都能给你带来新的启示和思考。让我们一起开始这段精彩的旅程吧!

一、广度优先遍历(BFS)简介

广度优先遍历(Breadth First Search, BFS),是一种用于图和树的遍历算法。它从根节点(选择某个任意节点作为根节点在图的情况下)开始,首先访问这个节点,然后依次访问该节点的所有直接相邻节点,再以这些相邻节点为中心,继续访问它们的未访问过的直接相邻节点,以此类推,直到所有节点都被访问过为止。

广度优先遍历的特点是逐层探索:先访问距离起始节点最近的一层节点,然后再访问距离为两层的节点,依此类推,直到访问到目标节点或整个图被遍历完毕。这种遍历方式类似于水波扩展的方式,因此得名“广度优先”。

在实现上,广度优先遍历通常使用队列(Queue)数据结构来辅助完成。初始时将起始节点加入队列中,然后进入循环过程,在每次循环中,从队列头部取出一个节点进行访问,并将其所有未被访问过的邻接节点加入队列尾部。这样可以确保按照层次顺序访问节点。

广度优先遍历的时间复杂度取决于图的表示方法。如果使用邻接矩阵表示图,时间复杂度为O(n^2),其中n是节点数;如果使用邻接表表示图,时间复杂度为O(n + e),这里e是边的数量。空间复杂度通常是O(n),因为每个节点都会被加入队列一次。

1.1 广度优先遍历(BFS)的特点

广度优先遍历(Breadth First Search, BFS)具有以下几个显著特点:

  1. 逐层探索:广度优先遍历从起始节点开始,首先访问所有距离起始节点最近的节点(即直接相连的邻居),然后再访问这些邻居的未访问邻居,依此类推。这种遍历方式确保了先访问离起始节点较近的节点,再访问较远的节点,类似于一层一层地向外扩展。
  2. 使用队列结构:为了实现这一层次遍历的特点,BFS通常使用队列(Queue)这种数据结构来辅助完成。初始时将起始节点加入队列中,然后进入循环过程,在每次循环中,从队列头部取出一个节点进行访问,并将其所有未被访问过的邻接节点加入队列尾部。
  3. 寻找最短路径:在无权图(即边没有权重或每条边的权重都相同的情况下),广度优先遍历可以用于寻找从起始节点到目标节点的最短路径。这是因为它按照距离的远近依次访问节点,最先到达目标节点的路径一定是路径长度最短的。
  4. 空间复杂度较高:由于需要存储所有已经访问但尚未处理的节点,以及为了防止重复访问而记录的所有已访问节点的信息,BFS的空间复杂度相对较高。在最坏情况下,空间需求与图中的节点数成正比,特别是在接近满图(几乎每个节点都与其他大多数节点相连)的情况下。
  5. 适用于非加权图的搜索问题:虽然BFS主要用于非加权图中的搜索任务,但它也是许多其他算法的基础,例如在解决迷宫问题、网络路由协议等方面都有应用。

1.2 广度优先遍历(BFS)的要素

广度优先遍历(Breadth First Search, BFS)有几个关键要素,这些要素共同作用以确保算法能够正确且高效地执行。以下是BFS的主要要素:

  1. 队列(Queue):这是BFS的核心数据结构之一,用于按照“先进先出”(FIFO)的原则存储待访问的节点。通过队列,算法可以实现逐层探索图或树的结构,即先访问距离起始节点最近的一层节点,再依次向外扩展。
  2. 访问标记(Visited Set/Array):为了避免重复访问同一个节点而陷入循环,在遍历过程中需要记录哪些节点已经被访问过。通常使用一个集合(Set)或者数组来保存所有已经访问过的节点信息。
  3. 图的表示:BFS的效果和效率与图的表示方法密切相关。常见的图表示方法包括邻接矩阵和邻接表。邻接矩阵适用于稠密图,但空间消耗较大;邻接表则更适用于稀疏图,能够节省空间并提高遍历效率。
  4. 起点的选择:在开始执行BFS之前,必须选择一个起始节点作为遍历的起点。对于连通图来说,选择哪个节点作为起点可能影响到首次发现特定目标节点的时间,但对于整个图的遍历过程来说,这个选择不会影响最终的结果。
  5. 处理逻辑:当从队列中取出一个节点进行处理时,需要定义如何处理该节点的数据或状态。这取决于具体的应用场景,比如寻找最短路径、连通分量分析等。

二、广度优先遍历(BFS)& 深度优先遍历(DFS)

深度优先遍历作为广度优先遍历的’兄弟’,自然是要较量一番。

2.1 广度优先遍历pk深度优先遍历

特性深度优先遍历 (DFS)广度优先遍历 (BFS)
数据结构栈(Stack)或递归队列(Queue)
访问顺序尽可能深入地访问节点逐层访问节点
主要应用寻找连通分量、拓扑排序、解决迷宫问题等寻找最短路径(无权图)、层级遍历
空间复杂度O(V),但实际取决于图的形状,可能会更高O(V),其中V是顶点的数量
时间复杂度O(V + E),其中V是顶点数,E是边数O(V + E),其中V是顶点数,E是边数
回溯可能需要回溯以确保所有节点都被访问不需要回溯
适合场景适用于探索所有分支的情况更适合寻找最近的目标节点

2.2 BFS & DFS使用场景

广度优先遍历(Breadth First Search, BFS)和深度优先遍历(Depth First Search, DFS)都是图和树结构中常用的遍历算法,但它们适用于不同的场景。以下是两者在不同使用场景中的应用:

广度优先遍历(BFS)的使用场景

  1. 寻找最短路径:在无权图中寻找从一个节点到另一个节点的最短路径时,BFS是一个理想的选择。由于它是逐层探索,最先找到的目标节点一定是到达目标的最短路径。
  2. 连通分量分析:当需要确定图中所有节点是否连通,或者找出图的所有连通分量时,BFS可以有效地遍历整个图或其部分。
  3. 社交网络:在社交网络中查找距离某人“几步之遥”的朋友或关系圈,BFS非常适合这种层级式扩展的需求。
  4. 垃圾回收:在某些内存管理系统中,如标记-清除垃圾回收算法,BFS用于追踪对象引用以决定哪些对象是可以被回收的。

深度优先遍历(DFS)的使用场景

  1. 拓扑排序:在有向无环图(DAG)中进行拓扑排序时,DFS是一个常用的方法。它能够有效地生成任务调度顺序等。
  2. 迷宫问题与解谜游戏:DFS适合于解决迷宫类问题或解谜游戏,其中需要探索尽可能多的路径直到找到解决方案。
  3. 连通性和循环检测:DFS可用于检测图中是否存在循环,以及确定无向图或有向图中的连通分量。
    深度相关的问题:当问题涉及到搜索树的深度,比如限制搜索深度的启发式搜索,DFS及其变体(如迭代加深深度优先搜索)非常有用。
  4. 地图着色问题:在尝试为地图着色时,DFS可以帮助探索所有可能的颜色分配方案,以确保相邻区域颜色不同。

💡贴士:选择BFS还是DFS取决于具体的应用需求。如果问题是关于寻找最短路径或需要按层次访问节点,则BFS通常是更好的选择;而如果是关于探索所有可能性、深度相关的搜索或需要对图进行深度优先探索时,DFS则更为合适。此外,DFS还特别适合那些需要回溯的情况。

2.3 BFS & DFS性能分析

广度优先遍历(Breadth First Search, BFS)和深度优先遍历(Depth First Search, DFS)在性能方面各有特点,主要体现在时间复杂度、空间复杂度以及对特定问题的适应性上。以下是它们之间的性能比较:

时间复杂度

  • BFS:在最坏情况下,BFS需要访问图中的每个节点和每条边一次。因此,其时间复杂度为O(V + E),其中V是顶点的数量,E是边的数量。
  • DFS:同样地,DFS也需要访问图中的每个节点和每条边一次,所以它的时间复杂度也是O(V + E)。
    从时间复杂度的角度来看,两者在处理图时具有相同的效率,都取决于图的规模(即顶点数和边数)。

空间复杂度

  • BFS:由于BFS使用队列来存储待探索的节点,并且在最坏情况下需要同时存储几乎所有的节点(例如,在一个完全二叉树中),其空间复杂度为O(V)。此外,如果图非常稠密(边很多),则可能需要额外的空间来存储图本身。
  • DFS:DFS可以递归实现或使用显式栈实现。对于递归版本,最坏情况下的空间复杂度取决于递归调用栈的深度,这在最坏情况下(如线性链表状的图)可能是O(V)。对于非递归版本,使用的显式栈也可能达到O(V)的空间复杂度。然而,在稀疏图中,实际使用的空间通常会少于BFS。
    对特定问题的适应性
  • BFS:最适合用于寻找无权图中的最短路径问题,因为它能确保最先到达目标节点的路径是最短的。此外,BFS也非常适合需要按层次探索的应用场景,比如社交网络分析中的“几步之遥”朋友查找。
  • DFS:更适合解决那些需要探索所有可能性的问题,比如迷宫问题、解谜游戏等。DFS及其变体(如迭代加深的DFS)在搜索深度受限的情况下特别有用。另外,DFS非常适合用来检测图中的循环和进行拓扑排序。

💡贴士:选择BFS还是DFS取决于具体应用场景的需求。如果问题是关于寻找最短路径或需要按层次访问节点,则BFS通常是更好的选择;而如果是关于探索所有可能性、深度相关的搜索或需要对图进行深度优先探索时,DFS则更为合适。在空间利用方面,BFS可能会使用更多的内存,特别是在处理大型图时,而DFS可能因为递归深度限制而在某些编程环境中遇到堆栈溢出的问题。因此,在考虑算法性能时,不仅要看时间复杂度,还需要综合考虑空间复杂度和具体的使用场景。

三、广度优先遍历模板

3.1 广度优先遍历伪代码

BFS(G, start_vertex):
    // G 是图,start_vertex 是遍历的起始顶点
    let queue be a new Queue  // 创建一个空队列
    let visited be a new Set  // 创建一个用于记录已访问节点的集合

    queue.enqueue(start_vertex)  // 将起始顶点加入队列
    visited.add(start_vertex)    // 标记起始顶点为已访问

    while queue is not empty:    // 当队列不为空时循环
        current_vertex = queue.dequeue()  // 从队列中取出一个顶点
        visit(current_vertex)            // 访问该顶点(根据实际情况定义visit函数)

        for each neighbor in G.adjacentVertices(current_vertex):  // 遍历当前顶点的所有邻居
            if neighbor is not in visited:  // 如果邻居未被访问
                queue.enqueue(neighbor)     // 将邻居加入队列
                visited.add(neighbor)       // 标记邻居为已访问

3.2 广度优先遍历模型图解

  1. 初始状态:
    在这里插入图片描述

  2. 访问A:
    在这里插入图片描述

  3. A节点左右节点入队:
    在这里插入图片描述

  4. 访问B:
    在这里插入图片描述

  5. 访问C:
    在这里插入图片描述

  6. 访问D:
    在这里插入图片描述

  7. 访问E:
    在这里插入图片描述

  8. 访问F:
    在这里插入图片描述

  9. 访问G:
    在这里插入图片描述

  10. 队列为空,结束。

3.3 广度优先遍历java模板

首先定义二叉树:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

广度优先遍历实现:

import java.util.LinkedList;
import java.util.Queue;

public class BinaryTreeBFS {

    public void bfs(TreeNode root) {
        if (root == null) return; // 如果根节点为空,则直接返回

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root); // 将根节点加入队列

        while (!queue.isEmpty()) {
            TreeNode current = queue.poll(); // 从队列中取出第一个节点
            System.out.print(current.val + " "); // 访问当前节点

            // 如果左子节点不为空,则将其加入队列
            if (current.left != null) {
                queue.add(current.left);
            }

            // 如果右子节点不为空,则将其加入队列
            if (current.right != null) {
                queue.add(current.right);
            }
        }
    }

    public static void main(String[] args) {
        // 构建一个简单的二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.right.right = new TreeNode(6);

        BinaryTreeBFS bfsExample = new BinaryTreeBFS();
        bfsExample.bfs(root); // 执行广度优先遍历
    }
}

3.4 广度优先遍历性能优化方案

优化二叉树广度优先搜索(Breadth First Search, BFS)的性能可以从多个方面入手,包括数据结构的选择、算法逻辑的优化以及内存管理等。以下是一些常见的优化策略:

  1. 数据结构选择
    使用合适的队列实现:在Java中,LinkedList作为队列使用时虽然可以工作,但其在插入和删除操作上的效率可能不如专门设计的队列类。考虑使用ArrayDeque作为队列,它提供了更高效的队列操作。
Queue<TreeNode> queue = new ArrayDeque<>();
  1. 减少不必要的对象创建
    避免频繁创建对象:在循环内部尽量减少新对象的创建。例如,在遍历过程中,如果某些临时变量可以在方法外部定义,则应将其移到循环外以减少开销。
  2. 避免重复计算
    缓存重复计算的结果:如果在遍历过程中需要多次计算相同的结果(如节点的深度),可以考虑预先计算并存储这些结果,而不是每次访问都重新计算。
  3. 并行处理
    利用多线程并行化处理:对于非常大的二叉树,可以尝试将不同层次或部分子树的遍历任务分配给不同的线程来执行。然而,需要注意的是,并行化可能会引入额外的复杂性和同步开销,因此需谨慎评估是否能带来实际性能提升。
  4. 空间优化
    原地修改:如果允许修改原始数据结构,可以直接在二叉树的节点上标记已访问状态,从而节省用于跟踪访问状态的额外空间。
  5. 特定场景下的优化
    针对特定形状的树进行优化:如果你知道你的二叉树具有某种特殊结构(比如完全二叉树),你可以根据这种结构的特点进一步优化算法。例如,在完全二叉树中,可以通过数学公式直接计算出某个节点的左右子节点位置,而不需要通过指针追踪。

四、广度优先遍历取经之路

  1. **最短路径问题:**对于无权图(即边没有权重),BFS可以找到从起点到目标点的最短路径(这里的“最短”指的是最少的边数)。这是因为BFS会按照距离起点的层次逐层向外扩展,所以最先到达目标点的路径一定是最短的。
  2. **连通分量计算:**在无向图中,BFS可用于查找所有的连通分量。通过从每个尚未访问的节点开始执行BFS,我们可以识别出整个图中的所有连通部分。
  3. **二部图检测:**BFS也可用于判断一个图是否为二部图(即可以将图中的所有节点分成两个集合,使得每条边都连接着这两个集合中的各一个节点)。这通常通过给节点上色来实现,相邻节点必须有不同的颜色。
  4. **拓扑排序(有限制):**虽然深度优先搜索(DFS)更常用作拓扑排序的基础,但在某些情况下,也可以使用BFS来实现,特别是在处理有向无环图(DAG)时。
  5. **网络广播:**在网络应用中,比如局域网上的消息广播,可以从源节点开始使用BFS将信息传递给网络中的所有其他节点。
  6. **垃圾回收:**在一些垃圾回收算法中,BFS被用来追踪对象引用图中的可达对象。
  7. 社交网络分析:在社交网络中,BFS可以用来寻找两个人之间的最短关系链,或者找出某个人的直接朋友、朋友的朋友等。
  8. **迷宫问题:**在解决迷宫问题时,BFS能够找到从入口到出口的最短路径。
  9. 网页抓取:搜索引擎爬虫可能使用BFS策略来系统地探索互联网上的页面链接,确保优先抓取更接近起始页面的内容。

献给读者


💯 计算机技术的世界浩瀚无垠,充满了无限的可能性和挑战,它不仅是代码与算法的交织,更是梦想与现实的桥梁。无论前方的道路多么崎岖不平,希望你始终能保持那份初心,专注于技术的探索与创新,用每一次的努力和进步书写属于自己的辉煌篇章。

🏰在这个快速发展的数字时代,愿我们都能成为推动科技前行的中坚力量,不忘为何出发,牢记心中那份对技术执着追求的热情。继续前行吧,未来属于那些为之努力奋斗的人们。


亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 设计思路 …

注意力机制,本质上是在做什么?

本文以自注意机制为例&#xff0c;输入一个4*4的矩阵 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时&#xff0c;计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…

使用Python在Word中创建、读取和删除列表 - 详解

目录 工具与设置 Python在Word中创建列表 使用默认样式创建有序&#xff08;编号&#xff09;列表 使用默认样式创建无序&#xff08;项目符号&#xff09;列表 创建多级列表 使用自定义样式创建列表 Python读取Word中的列表 Python从Word中删除列表 在Word中&#xff…

右键添加:新建HTML模板文件

使用注册表给Windows右键添加:新建HTML文档模板的功能_注册表右键新建-CSDN博客 新建文件有了&#xff0c;但是没有引用模板文件&#xff0c;是空文件。 默认改成 htmlfile 模板成功

Windows10配置OpenJDK11

下载 # 华为OpenJDK镜像源 https://mirrors.huaweicloud.com/openjdk/11.0.2/解压 # 解压后至于C:\Dev\Env\Java\jdk-11.0.2目录下 https://mirrors.huaweicloud.com/openjdk/11.0.2/openjdk-11.0.2_windows-x64_bin.zip编译安装 # 以管理员身份运行 CMD命令提示符 并进入JD…

统一开放世界与开放词汇检测:YOLO-UniOW无需增量学习的高效通用开放世界目标检测框架

目录 一、摘要 二、引言 三、相关工作 开放词汇对象检测 开放世界目标检测 参数高效学习 四、高效通用的开放世界目标检测 问题定义 高效的自适应决策学习 开放世界通配符学习 五、Coovally AI模型训练与应用平台 六、实验 数据集 评价指标 实施细节 定量结果 …

如何给商品一键换色?图生生AI,告别繁琐修图

在电商竞争日益激烈的今天&#xff0c;商品图片的视觉效果直接影响着消费者的购买决策。而商品颜色的展示&#xff0c;更是重中之重&#xff01;传统的图片换色方式&#xff0c;往往需要耗费设计师大量的时间和精力&#xff0c;从抠图到调色&#xff0c;再到细节调整&#xff0…

练习-班级活动(map存储键值对)

问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 n 以内的正整数作为 id&#xff0c;第 i 名同学的 id 为 ai​。 老师希望…

OpenHarmony 开源鸿蒙北向开发——hdc工具安装

hdc&#xff08;OpenHarmony Device Connector&#xff09;是为开发人员提供的用于设备连接调试的命令行工具&#xff0c;该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHarmony 设备&#xff08;或模拟器&#xff09;进行连接调试通信。简单来讲&#xff0c;hdc 是 Op…

buu-bjdctf_2020_babystack2-好久不见51

整数溢出漏洞 将nbytes设置为-1就会回绕&#xff0c;变成超大整数 从而实现栈溢出漏洞 环境有问题 from pwn import *# 连接到远程服务器 p remote("node5.buuoj.cn", 28526)# 定义后门地址 backdoor 0x400726# 发送初始输入 p.sendlineafter(b"your name…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式&#xff08;抽象类使用场景&#xff09; 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff…

Unix 域套接字(本地套接字)

Unix 域套接字&#xff08;Unix Domain Sockets&#xff09;&#xff0c;也称为本地套接字&#xff08;Local Sockets&#xff09;&#xff0c;是一种用于同一主机上进程间通信&#xff08;IPC&#xff09;的机制。Unix 域套接字提供了一种高效的进程间通信方式&#xff0c;它利…

Nordic nRF 蓝牙的 Direct Test Mode (DTM) 测试介绍

目录 概述 1. 核心物理层参数 1.1 射频频率 (RF Channel Frequency) 1.2 发射功率 (TX Power) 1.3 调制方式 (Modulation) 1.4 数据包类型 (Packet Type) 1.5 测试模式 (Test Mode) 2. 参数配置方法 2.1 通过 HCI 命令配置 2.2 示例&#xff08;nRF52 系列&#xff0…

LangChain开发(一)介绍和第一个例子

文章目录 简介LangChain框架组成LangChain库&#xff08;Libraries&#xff09;LangChain任务处理流程核心概念1. LLMs2. Chat Models3. 消息&#xff08;Message&#xff09;4. 提示&#xff08;prompts&#xff09;5. 输出解析器&#xff08;Output Parsers&#xff09;6.Ret…

Chrome-Edge-IDEA-Win 常用插件-工具包

Chrome-Edge-IDEA-Win 常用插件-工具包 Chrome-Edge-IDEA-Win 常用插件-工具包谷歌插件chropathJSONViewOctotree - GitHub code treeXPath Helper书签侧边栏篡改猴Print Edit WEEdge浏览器插件IDEA插件CodeGlance Pro 代码迷你缩放图插件Alibaba Cloud ToolkitAlibaba Java Co…

电加热产品亚马逊审核标准UL499报告

很多亚马逊卖家都上架应季产品 像加热垫 加热杯垫 加热毯等产品 都少不了亚马逊UL测试的报告 亚马逊明确要求 电子产品在亚马逊销售就必须需要有UL报告 不然就产品就被有下架的风险。由于 UL 标准也就是美洲的安全测试标准&#xff0c;因此亚马逊出于对安全的考虑会加强对带电的…

从实践到创新:低代码驱动教育行业数字化转型

随着数字化转型浪潮席卷教育领域&#xff0c;低代码开发平台因其“低门槛、高效率、强适配”特性&#xff0c;正成为教育行业信息化改革的新工具。本文将结合低代码技术在教育场景中的典型应用案例&#xff0c;分享其对教学管理、科研创新及人才培养模式的变革价值。 一、政策与…

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

996引擎-接口测试:消息Tips

996引擎-接口测试:消息Tips 发送视野内广播消息 sendrefluamsg发送聊天框消息 sendmsg发送地图消息 sendmapmsg打印消息到控制台 release_print发送自定义颜色的文字信息 guildnoticemsg测试NPC参考资料发送视野内广播消息 sendrefluamsg function npc_test_onclick1(player)-…

JavaWeb之WebSocket

目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本&#xff1a;8.0.442、Maven 依赖&#xff1a;3、前端代码4、后端…