《深入理解经典广度优先遍历算法》

广度优先遍历:宽度优先遍历(Breadth-First Search, BFS), 图论和树论中基本的查找搜索算法, 是广大图算法的基础.。

前置知识和介绍

数据结构: 队列, 双端队列。 二叉树:经典bfs,按层bfs(即树的层序遍历)。
编程语言: Java

广度优先遍历的细节和可玩性很高。 广度优先遍历英文名缩写是bfs。 所以,大佬口中的bfs☞广度优先遍历。 二叉树,多叉树中的层序遍历也是广度优先遍历。

广度优先遍历是很多算法的原型。
比如拓扑排序的kahn算法, Prim最小生成树算法, 单源最短路径算法Dijsktra。

单单论广度优先遍历的变种:
朴素广度优先遍历 => 按层广度优先遍历.
多源广度优先遍历;
01BFS;
bfs与dfs结合生成路径;
bfs剪枝策略;
双向广搜;

本篇只介绍基础部分的内容

广度优先遍历

以下内容均用bfs代替广度优先遍历。
用途:

  • 遍历图中所有的顶点。
  • 遍历所有顶点的路径。
  • 无向不带权图, 或者带权图权重相同且权重为正值), 求两点之间的最短路径。
  • 图的连通性检验, 图连通分量求解
  • kahn,Prim,Dijsktra… 图算法都是bfs的变种实现。

下面是无向图的bfs
具体图解一下(平板上手写字有点丑, 对不起对不起对不起):
以如下图为例
bfs在于选择一个源节点开始扩散, 这里以f为例。

在这里插入图片描述
先将f的邻接点b,e,c,g遍历一遍。然后再对b,e,c,g邻接且为访问过的顶点进行遍历。

这里实现需要借助队列(先进先出的结构), 和哈希集合(用于记忆化搜索,避免重复遍历, 优化效率)。

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

总而言之就是入队列是将这个点加入哈希集合中, 出队列就把它所有的未在哈希集合顶点加入到队列。
算法流程和代码实现在下文处有详解。

如果以最初的源头节点f标记为第一层,那么b,e,c,g就是第二层,a,d在第三层, 可以得到如下广度优先树。
在这里插入图片描述

这棵树是bfs在无向图中以源节点f的生成树。

这里简单给几个结论吧。

  1. 无向连通图中, 以某个节点扩散, 会得到以该节点为根节点的生成树(广度优先树)。
  2. 以src节点进行按层扩散, 朴素bfs不明显地区分层,但是按层的顺序。优化bfs(按层bfs)就把这个特征显示地展现了。=>这里类比经典二叉树层序遍历和优化层序遍历。
  3. 可以求解src到dest的最短边数, 比如,f->d点经过的最短边数是2。 需要处理f->d的所有简单路径然后挨个比大小吗? bfs当然不需要, 因为它总是处理完离源节点为k长度的所有节点,然后才处理k+1长度的节点。 bfs的性质。
  4. 前面提过,bfs可以解决最短路径问题。 不过这种最短路径的方法的使用条件必须记住。怎么说呢?毕竟bfs是相对"底层"的图算法, 最短路径算法有Bellman-Ford, A*, SPFA,Dijktra算法,它们的限制和使用条件也不尽相同。 我想说bfs使用限制应该相较于上述的最短路径算法要更加局限。
    使用条件:1. 无权图:这种情况等价于3求最短边问题。 2:带权图: a->b且b->a的相互权重相同, 且权重不为负值,不需要所有边权重都统一。

说了这么多, 你可能会吐槽, “我怎么记得住呢?” 下面先介绍算法流程,代码实现,然后我会以bfs求解图中连通分量问题, 无向图判环, 有向图判环来辅助理解这些性质

广度优先遍历的基本实现

这里重申一遍上面用过的容器

  1. 需要队列这种数据结构辅助。
    由于BFS需要由近到远的处理, 队列这种先进先出的结构可以总是让距离近的顶点先被处理。 因此广度优先遍历需要队列存储顶点和维护顺序。
  2. 需要哈希表(哈希集合)来标记已访问节点。
    BFS适用于无向图和带环图, 必须标记已访问的节点, 否则可能会陷入死循环重复处理同一节点或者困于环中。有个名词,记忆化搜索, 就是这个。

以下是朴素广度优先遍历的Java实现

算法流程:

  1. 给定一个源节点s, 将其加入队列, 并用哈希表标记开始遍历。
  2. 弹出对头的节点,并扫描它的所有关联的顶点, 若当前关联顶点未标记过那么加入队列。
  3. 重复2过程直至队列为空, 弹出对头节点时可以进行额外处理(比如打印,收集…)。

三种建图方式实现
任选一种你喜欢的方式即可。

链式前向星

package BFS;public class Code01_BFS {//链式前向星的bfs写法public static int MAXN = 1001;public static int MAXM = 2003;public static int[] head = new int[MAXN];public static int[] next = new int[MAXM];public static int[] to = new int[MAXM];public static int cnt;public static int[] queue = new int[MAXN];public static int l,r;public static boolean[] visited = new boolean[MAXN];//把0编号空出来public static void build(int n){for(int i=1;i<=n;i++){head[i] = 0;visited[i] = false;}cnt = 1;}//添加一条有向边u->v//无向边就交换参数多调一次这个。public static void addEdge(int u,int v){next[cnt] = head[u];to[cnt] = v;head[u] = cnt++;}public static void bfs(int start){if(start == 0) {return;}queue[r++] = start;visited[start] = true;while(l != r){int cur = queue[l++];//这里可以处理cur...打印,收集,处理信息...System.out.print(cur+" ");for(int ei = head[cur]; ei != 0;ei = next[ei]){int dst = to[ei];if(!visited[dst]){queue[r++] = dst;visited[dst] = true;//标记已访问过}}}}// 主函数public static void main(String[] args) {build(6); // 假设图有6个节点//这种图结构//1 -> 2, 3//2 -> 4, 5//3 -> 6addEdge(1, 2);addEdge(1, 3);addEdge(2, 4);addEdge(2, 5);addEdge(3, 6);System.out.println("BFS traversal starting from node 1:");bfs(1); // 从节点1开始BFS遍历}
}

邻接矩阵:

package BFS;public class Code02_BFS_Matrix {public static int MAXN = 101;public static int[][] graph = new int[MAXN][MAXN];public static int[] queue = new int[MAXN];public static int l,r;public static boolean[] visited = new boolean[MAXN];public static int n;public static void build(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){graph[i][j] = 0;}visited[i] = false;}}//添加有向不带权边。u->v//无向边交换参数又调一次。public static void addEdge(int u,int v){graph[u][v] = 1;}public static void bfs(int start){if(start == 0) {return;}queue[r++] = start;visited[start] = true;while(l != r){int cur = queue[l++];//这里可以处理cur...打印,收集,处理信息...System.out.print(cur + " "); // 处理当前节点(这里是打印)for(int next=1;next<=n;next++){if(graph[cur][next]==1&&!visited[next]){queue[r++] = next;visited[next] = true;}}}}// 主函数public static void main(String[] args) {n = 6;build(); // 构建图,假设图中有6个节点//这种图结构//1 -> 2, 3//2 -> 4, 5//3 -> 6addEdge(1, 2);addEdge(1, 3);addEdge(2, 4);addEdge(2, 5);addEdge(3, 6);System.out.println("BFS traversal starting from node 1:");bfs(1); // 从节点1开始进行BFS遍历}
}

邻接表

package BFS;import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Queue;public class Code03_BFS_List {// 邻接表方式建图public static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();public static  void build(int n){graph.clear();for(int i=0;i<=n;i++){graph.add(new ArrayList<>());}}public static void addEdge(int u,int v){graph.get(u).add(v);}public static void bfs(int start){if(start == 0){return ;}//动态队列和哈希表Queue<Integer> queue = new ArrayDeque<>();HashSet<Integer> set = new HashSet<>();queue.add(start);set.add(start);while(!queue.isEmpty()){int cur = queue.poll();//处理打印System.out.print(cur + " "); // 处理当前节点(这里是打印)for(int next:graph.get(cur)){if(!set.contains(next)){set.add(next);queue.add(next);}}}}// 主函数public static void main(String[] args) {build(6); // 假设图有6个节点//这种图结构//1 -> 2, 3//2 -> 4, 5//3 -> 6addEdge(1, 2);addEdge(1, 3);addEdge(2, 4);addEdge(2, 5);addEdge(3, 6);System.out.println("BFS traversal starting from node 1:");bfs(1); // 从节点1开始BFS遍历}
}

无向图连通分量

无向图连通分量:会员题
:会员朋友们可以提交前面两个并查集和bfs的解法;
非会员下面会提供对数器,(并查集和bfs求解连通分量相互验证), 自行改数据和debug,输入测试样例测数据。
非Java的朋友, 借助ChatGPT转换即可。
在这里插入图片描述

数据范围:

在这里插入图片描述

如果你了解并查集, 那么自然对连通分量并不陌生。
这里依然给出连通分量的概念:

对于无向图而言,一个极大连通子图为一个连通分量。
所有连通分量构成互相没有相同顶点的子图集合。
人话:就是一个图中的完全连通的区域, 比如上述示例1中:{0,1,2},{3,4}它们是图中独立的连通子区域。连通子图。

并查集解法:不了解并查集没关系, 可以略过此部分后续学习。
并查集初始化是每个元素都是一个小的集合,设计sets变量, sets = n,假设初始时连通分量是n, 遍历图中所有的边,将关联到端点进行合并, 每成功合并一次那么实际预期的连通分量就减少1。 最终剩余的sets就是实际的连通分量数目。

class Solution {public static int MAXN = 2001;public static int[] father = new int[MAXN];public static int sets;public static void build(int n){for(int i = 0;i < n;i++){father[i] = i;}sets = n;}public static int find(int i){if(father[i]!=i){father[i] = find(father[i]);}return father[i];}public static void union(int x,int y){int fx = find(x);int fy = find(y);if(fx != fy){sets--;father[fx] = fy;}}public int countComponents(int n, int[][] edges) {build(n);for(int[] edge:edges){union(edge[0],edge[1]);}return sets;}
}

这个方法是正确的。

下面介绍bfs

算法流程:

  1. 选择一种建图方式(这里以链式前向星建图), 初始化队列,布尔数组(哈希集合)
  2. 遍历所有顶点,如果当前src顶点不在哈希集合那么对它做bfs, bfs过程将所有与bfs和它本身标记(进入布尔数组中),重复直至所有顶点遍历完毕。
  3. 统计多少个节点做了bfs, 节点数目就是该图的连通分量数目。
class Solution {public static int MAXN = 2001;public static int MAXM = 10001;public static int[] head = new int[MAXN];public static int[] next = new int[MAXM];public static int[] to = new int[MAXM];public static int[] queue = new int[MAXN];public static int l,r;public static boolean[] visited = new boolean[MAXN];public static int cnt;public static void build(int n) {cnt = 1;Arrays.fill(head, -1); // 初始化head数组Arrays.fill(visited, false);//初始化哈希集合。}public static void addEdge(int u, int v) {next[cnt] = head[u];to[cnt] = v;head[u] = cnt++;}public int countComponents(int n, int[][] edges) {build(n);// 构建图的邻接表for (int[] edge : edges) {addEdge(edge[0], edge[1]);addEdge(edge[1], edge[0]);}int ans = 0;// 使用队列进行 BFSfor (int i = 0; i < n; i++) {if (!visited[i]) {l = r = 0;queue[r++] = i;visited[i] = true;while (l != r) {int cur = queue[l++]; // 取出队列头部的元素// 遍历所有与当前节点相连的邻居for (int ei = head[cur], dest; ei != -1; ei = next[ei]) {dest = to[ei];if (!visited[dest]) {queue[r++]=dest;visited[dest] = true;}}}// 每次从一个未访问的节点开始 BFS,说明发现了一个新的连接分量ans++;}}return ans;}}

对数器测试:

package BFS;import java.util.*;
public class Code05_ConnectedComponent {public static void main(String[] args) {// 随机数生成器Random rand = new Random();// 随机生成节点数 n,确保 n >= 2int n = rand.nextInt(6) + 5; // n 在 5 到 10 之间// 生成两个连通分量List<int[]> edges = new ArrayList<>();// 随机生成分割点int mid = rand.nextInt(n - 1) + 1; // mid 介于 1 和 n-1 之间,分成两部分// 第一部分,连接节点 0 到 mid-1for (int i = 0; i < mid - 1; i++) {edges.add(new int[]{i, i + 1}); // 连接 0 和 1, 1 和 2 等等}// 第二部分,连接节点 mid 到 n-1for (int i = mid; i < n - 1; i++) {edges.add(new int[]{i, i + 1}); // 连接 mid 和 mid+1, mid+1 和 mid+2 等等}// 打印生成的测试用例System.out.println("节点数: " + n + ", 边数: " + edges.size());System.out.println("边列表:");for (int[] edge : edges) {System.out.println(Arrays.toString(edge));}// 实例化并调用 Solution1Solution1 solution1 = new Solution1();int result1 = solution1.countComponents(n, edges.toArray(new int[0][]));// 实例化并调用 SolutionSolution solution = new Solution();int result2 = solution.countComponents(n, edges.toArray(new int[0][]));// 比较两个结果if (result1 == result2) {System.out.println("测试通过: 连通分量数相同: " + result1);} else {System.out.println("测试失败: Solution1 = " + result1 + ", Solution = " + result2);}}static class Solution1 {public static int MAXN = 2001;public static int[] father = new int[MAXN];public static int sets;public static void build(int n) {for (int i = 0; i < n; i++) {father[i] = i;}sets = n;}public static int find(int i) {if (father[i] != i) {father[i] = find(father[i]);}return father[i];}public static void union(int x, int y) {int fx = find(x);int fy = find(y);if (fx != fy) {sets--;father[fx] = fy;}}public int countComponents(int n, int[][] edges) {build(n);for (int[] edge : edges) {union(edge[0], edge[1]);}return sets;}}static class Solution {public static int MAXN = 2001;public static int MAXM = 10001;public static int[] head = new int[MAXN];public static int[] next = new int[MAXM];public static int[] to = new int[MAXM];public static int[] queue = new int[MAXN];public static int l, r;public static boolean[] visited = new boolean[MAXN];public static int cnt;public static void build(int n) {cnt = 1;Arrays.fill(head, -1); // 初始化head数组Arrays.fill(visited, false); // 初始化哈希集合。}public static void addEdge(int u, int v) {next[cnt] = head[u];to[cnt] = v;head[u] = cnt++;}public int countComponents(int n, int[][] edges) {build(n);// 构建图的邻接表for (int[] edge : edges) {addEdge(edge[0], edge[1]);addEdge(edge[1], edge[0]);}int ans = 0;// 使用队列进行 BFSfor (int i = 0; i < n; i++) {if (!visited[i]) {l = r = 0;queue[r++] = i;visited[i] = true;while (l != r) {int cur = queue[l++]; // 取出队列头部的元素// 遍历所有与当前节点相连的邻居for (int ei = head[cur], dest; ei != -1; ei = next[ei]) {dest = to[ei];if (!visited[dest]) {queue[r++] = dest;visited[dest] = true;}}}// 每次从一个未访问的节点开始 BFS,说明发现了一个新的连接分量ans++;}}return ans;}}
}

在这里插入图片描述

自己修改对应的数据测试


判环问题

冗余连接
一道判断图中有无环的题。

在这里插入图片描述

图中判环可以暴力地用bfs和dfs解决。
这道题第一句话树可以看成一个连通且无环的无向图。 这句话暗示我们建图, 只要把这棵树以图的形式组织起来, 那么判环问题就迎刃而解了。
算法流程:

  1. 选择一种你喜欢的建图的方式。
  2. 在建图过程中, 每增加一条边 ( u , v ) (u,v) (u,v)之前,查询u->v是否存在通路,如果存在通路,那么 ( u , v ) (u,v) (u,v)这条边添加进去就会形成回路;否则,将这条边添加进去。

bfs判环

class Solution {public static int MAXN = 1001;public static List<List<Integer>> graph = new ArrayList<>();public static int[] queue = new int[MAXN];public static int l, r;public static boolean[] set = new boolean[MAXN];public int[] findRedundantConnection(int[][] edges) {int n = edges.length;graph.clear();for (int i = 0; i <= n; i++) {graph.add(new ArrayList<>());}int u, v;for (int[] edge : edges) {u = edge[0];v = edge[1];if (bfs(u, v)) {return new int[] { u, v };}graph.get(u).add(v);graph.get(v).add(u);Arrays.fill(set, 0, n + 1, false);}return null;}public static boolean bfs(int u, int v) {l = r = 0;queue[r++] = u;while (l != r) {int cur = queue[l++];set[cur] = true;for (int next : graph.get(cur)) {if (next == v)return true;if (!set[next]) {queue[r++] = next;}}}return false;}
}

bfs暴力确实可以解决。
图的判环
一般地,dfs比bfs在判环上更优, 毕竟深度优先递归很容易剪纸。 而bfs对于稠密图来说不仅费空间,时间上效率也不高。暴力dfs判环还是暴力bfs判环都是糟糕的做法。
实际上,对于无向图,采用并查集才是最优解。如果两个元素位于同一集合, 那么并查集的合并操作就不会执行, 那么这说明了该连通分量成环了。
对于有向图判环, 要采用后面的拓扑排序算法。 拓扑排序就是优化判环的bfs和dfs的体现,拓扑排序的dfs(Tarjan算法)和bfs(kahn算法)相比暴力提高了很多效率。

以下是本题并查集的解法

class Solution {public static int MAXN = 1001;public static int[] father = new int[MAXN];public static void build(int n){for(int i=1;i<=n;i++){father[i] = i;}}public static int find(int i){if(father[i] != i){father[i] = find(father[i]);}return father[i];}public static boolean union(int x,int y){int fx = find(x);int fy = find(y);if(fx != fy){father[fy] = fx;return true;}return false;}public int[] findRedundantConnection(int[][] edges) {int n = edges.length;build(n);for(int[] edge:edges){if(!union(edge[0], edge[1])){return new int[]{edge[0], edge[1]};}}      return null; }
}

总结

本篇是bfs的介绍, 但也提到了有关并查集的篇幅。 并查集在求解连通分量和无向图判环上大显神威。
bfs:3种图结构实现, bfs求解连通分量, bfs暴力判环, bfs测试两点之间是否存在通路这些。
bfs要借助队列这种结构辅助, 写bfs算法基本要加队列, 另外要哈希集合来记忆化搜索等。

由于篇幅有限, bfs的部分只停留在基础的部分。 有关更多bfs的拓展及其变种算法, 后续有空再写写吧

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA工具链及功能介绍

一、处理流程 把verilog等源码&#xff0c;变为FPGA中可执行的比特流文件&#xff0c;主要包含这些步骤&#xff1a; 步骤功能转译将verilog代码转化为更详细的语法&#xff0c;增加更多细节内容技术映射将每个vrilog用到的模块&#xff0c;对应到FPGA的物理器件上优化优化冗余…

『python爬虫』使用docling 将pdf或html网页转为MD (保姆级图文)

目录 预览效果安装下载模型测试代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 预览效果 支持转化pdf的表格 安装 Docling 本身是专注于文档转换的工具&#xff0c;通常用于将文件&#xff08;如 PDF&…

超详细ensp配置VRRP和MSTP协议

一、简介 1、什么是VRRP&#xff1a; &#xff08;1&#xff09;VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;的概念&#xff1a; VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;指的是一种实现路由器冗余备份的协议&#xff0c;常用于…

【案例学习】如何使用Minitab实现包装过程的自动化和改进

Masimo 是一家全球性的医疗技术公司&#xff0c;致力于开发和生产各种行业领先的监控技术&#xff0c;包括创新的测量、传感器和患者监护仪。在 Masimo Hospital Automation 平台的助力下&#xff0c;Masimo 的连接、自动化、远程医疗和远程监控解决方案正在改善医院内外的护理…

【C语言】结构体、联合体、枚举类型的字节大小详解

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;和联合体&#xff08;union&#xff09; 是常用的复合数据类型&#xff0c;它们的内存布局和字节大小直接影响程序的性能和内存使用。下面为大家详细解释它们的字节大小计算方法&#xff0c;包括对齐规则、内存分配方…

中科亿海微SoM模组——波控处理软硬一体解决方案

本文介绍的波控处理软硬一体解决方案主要是面向相控阵天线控制领域&#xff0c;波控处理通过控制不同天线组件的幅相来调整天线波束的方向和增益&#xff0c;实现高精度角度控制和高增益。本方案由波控处理板、波控处理控制软件算法和上位机软件共同构成。波控处理SoM模组原型样…

Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解

文章目录 前言一、简单工厂&#xff08;静态工厂&#xff09;1、概述2、代码实现3、优缺点 二、工厂方法模式1、概述2、代码实现3、优缺点 三、抽象工厂模式1、概述2、代码实现3、优缺点 四、总结 前言 先看个案例&#xff1a;【手机和手机店】在没有工厂的时候&#xff0c;手…

【阅读记录-章节4】Build a Large Language Model (From Scratch)

文章目录 4. Implementing a GPT model from scratch to generate text4.1 Coding an LLM architecture4.1.1 配置小型 GPT-2 模型4.1.2 DummyGPTModel代码示例4.1.3 准备输入数据并初始化 GPT 模型4.1.4 初始化并运行 GPT 模型 4.2 Normalizing activations with layer normal…

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框&#xff0c;点左边的“Expert”&#xff08;专家&#xff09;&#xff0c;然后找到“IdleTimeout”&#xff0c;将数值设置为0&#xff0c;点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…

遗传算法与深度学习实战(25)——使用Keras构建卷积神经网络

遗传算法与深度学习实战&#xff08;25&#xff09;——使用Keras构建卷积神经网络 0. 前言1. 卷积神经网络基本概念1.1 卷积1.2 步幅1.3 填充1.4 激活函数1.5 池化 2. 使用 Keras 构建卷积神经网络3. CNN 层的问题4. 模型泛化小结系列链接 0. 前言 卷积神经网络 (Convolution…

使用 Docker Compose 来编排部署LMTNR项目

使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用&#xff0c;并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…

快速理解倒排索引在ElasticSearch中的作用

一.基础概念 定义&#xff1a; 倒排索引是一种数据结构&#xff0c;用来加速文本数据的搜索和检索&#xff0c;和传统的索引方式不同&#xff0c;倒排索引会被每个词汇项与包含该词汇项的文档关联起来&#xff0c;从而去实现快速的全文检索。 举例&#xff1a; 在传统的全文…

跨平台应用开发框架(3)-----Qt(样式篇)

目录 1.QSS 1.基本语法 2.QSS设置方式 1.指定控件样式设置 2.全局样式设置 1.样式的层叠特性 2.样式的优先级 3.从文件加载样式表 4.使用Qt Designer编辑样式 3.选择器 1.类型选择器 2.id选择器 3.并集选择器 4.子控件选择器 5.伪类选择器 4.样式属性 1.盒模型 …

Pump Science平台深度剖析:兴起、优势、影响与未来

在过去的几个月里&#xff0c;人们越来越关注去中心化科学&#xff08;DeSci&#xff09;。DeSci 是一种利用区块链技术进行科学研究的新方法。传统的科学研究经常面临所谓的“死亡之谷”&#xff0c;这指的是基础科学研究与成功开发和造福患者的实施之间的重要时期。DeSci 旨在…

网安瞭望台第4期:nuclei最新poc分享

国内外要闻 多款 D-Link 停产路由器漏洞&#xff1a;攻击者可远程执行代码 近日&#xff0c;知名网络硬件制造商 D-Link 发布重要安全公告。由于存在严重的远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;其敦促用户淘汰并更换多款已停产的 VPN 路由器型号。 此次…

TDengine在debian安装

参考官网文档&#xff1a; 官网安装文档链接 从列表中下载获得 Deb 安装包&#xff1b; TDengine-server-3.3.4.3-Linux-x64.deb (61 M) 进入到安装包所在目录&#xff0c;执行如下的安装命令&#xff1a; sudo dpkg -i TDengine-server-<version>-Linux-x64.debNOTE 当…

Mybatis集成篇(一)

Spring 框架集成Mybatis 目前主流Spring框架体系中&#xff0c;可以集成很多第三方框架&#xff0c;方便开发者利用Spring框架机制使用第三方框架的功能。就例如本篇Spring集成Mybatis 简单集成案例&#xff1a; Config配置&#xff1a; Configuration MapperScan(basePack…

k8s Init:ImagePullBackOff 的解决方法

kubectl describe po (pod名字) -n kube-system 可查看pod所在的节点信息 例如&#xff1a; kubectl describe po calico-node-2lcxx -n kube-system 执行拉取前先把用到的节点的源换了 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"re…

nginx+php压测及报错优化

测试环境&#xff1a;虚拟机centos7&#xff0c;nginxphp 压测工具&#xff1a;Apipost 访问的php程序中添加sleep()增加程序执行时长&#xff0c;使用Apipost进行压测&#xff0c;根据服务器配置设置一个大概可能触发报错的并发和轮训次数&#xff0c;若无报错逐渐增加并发和…

【数据结构】ArrayList与顺序表

ArrayList与顺序表 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 杨辉三角5.2 简单的洗牌算法 6. ArrayList的问题及思考 【本节目标】 线性表顺序表ArrayLis…