图搜索的两种写法,广度优先和深度优先

最近AI的爆发大家都疯了,也确实够疯,前几年谁能天天和AI聊天呢,特别它越来越智能,越来越理解你,你越来越离不开它,我很好奇将来它会不会有情绪,太可怕了,一旦有了这个就有了感情,那才是人类的噩梦

整理下图的理解吧
它是复杂的非线性结构;比如社交好友,都有以下一些维度

  • 顶点:图至少有一个顶点;如每个用户就是一个顶点
  • 边:两点确定一个边
  • 度:一个顶点包含多少条边
  • 无向图:没有方向,比如同学,是护卫同学
  • 有向图:有方向,比如父子关系
  • 无权图:不关注相互的关系有多强
  • 有权图:需关注关系有多强
    示例
    在这里插入图片描述

认识下下面集中图

邻接矩阵

就是二维数组,A[i][j],有就是1,无就是0;缺点浪费空间
在这里插入图片描述

邻接表

单链表
在这里插入图片描述

图的搜索

有哪些核心用途呢,解决需要探索所有可能性的问题,尤其是路径存在性和连通性分析
首先是

广度优先搜索BFS

特点看下图,波纹式向外搜索
在这里插入图片描述
下面附上广度优先搜索的算法以及注释


/*** 广度优先搜索 (Breadth-First Search, BFS) 算法的实现* 广度优先搜索算法是一种图形搜索算法,它从根节点开始,沿着树的宽度遍历树的节点,直到找到目标节点或遍历完所有节点为止。* 广度优先搜索算法的基本思想是:首先将根节点放入队列中,然后从队列中取出第一个节点,并标记为已访问,然后依次访问该节点的相邻节点,* 并将其相邻节点放入队列中,重复以上步骤,直到队列为空或找到目标节点为止。* 广度优先搜索算法的特点是:它可以有效地搜索最短路径,但效率较低。*/
public class BFSDemo {/*** 图的邻接表表示(使用List<List<Integer>>存储)* 例如:graph.get(0) 表示节点0的所有邻居节点*/private static List<List<Integer>> graph;public static void main(String[] args) {// 示例:构建一个包含4个节点的图int totalNodes = 6;graph = new ArrayList<>(totalNodes);// 初始化每个节点的邻接表for (int i = 0; i < totalNodes; i++) {graph.add(new ArrayList<>());}// 添加图的边(无向图)addEdge(0, 1);addEdge(0, 2);addEdge(1, 3);addEdge(2, 3);addEdge(2, 5);addEdge(3, 4);addEdge(5, 4);// 从节点0开始执行BFSbfs(0, totalNodes);  // 输出:0 1 2 3 5 4}/*** 广度优先搜索(BFS)核心实现** @param startNode  起始遍历节点* @param totalNodes 图中总节点数*/public static void bfs(int startNode, int totalNodes) {// 队列用于存储待访问节点Queue<Integer> queue = new LinkedList<>();// 标记已访问节点(避免重复访问)boolean[] visited = new boolean[totalNodes];// 初始化:起始节点入队并标记为已访问queue.offer(startNode);visited[startNode] = true;System.out.print("BFS遍历顺序: ");while (!queue.isEmpty()) {int currentNode = queue.poll();System.out.print(currentNode + " "); // 输出访问节点// 遍历当前节点的所有邻居for (int neighbor : graph.get(currentNode)) {if (!visited[neighbor]) {visited[neighbor] = true;  // 标记为已访问queue.offer(neighbor);     // 邻居节点入队}}}}/*** 添加无向图的边(双向)*/private static void addEdge(int u, int v) {graph.get(u).add(v);  // u -> vgraph.get(v).add(u);  // v -> u(如果是无向图)}
}

有向图啥的自己参考改一改哈

深度优先搜索DFS

接下来讲解一下这个,相当于一条道走到黑,怎么绕远怎么来
下面这段代码用了递归判断是否访问过的方法遍历所有同生共死的兄弟

import java.util.ArrayList;
import java.util.List;
/*** 深度搜索优先遍历算法的实现* 原理:从某个节点开始,递归地遍历它的相邻节点,直到所有节点都被访问过。* 时间复杂度:O(V+E),其中V是节点数,E是边数。* 空间复杂度:O(V),其中V是节点数。*/
public class DFSDemo {private static List<List<Integer>> graph;private static boolean[] visited;public static void main(String[] args) {int totalNodes = 6;graph = new ArrayList<>(totalNodes);visited = new boolean[totalNodes];for (int i = 0; i < totalNodes; i++) {graph.add(new ArrayList<>());}// 添加边addEdge(0, 1);addEdge(0, 2);addEdge(1, 3);addEdge(2, 3);addEdge(2, 5);addEdge(3, 4);addEdge(5, 4);System.out.print("DFS递归遍历顺序: ");dfsRecursive(0);  // 输出: 0 1 3 2 5 4 或类似(取决于邻接表顺序)}/*** 递归实现* 每取出一个点,就查这个点连接的点List取一个判断是否访问过,每访问过就继续递归查这个点下面连接的点,直到所有点都被访问过。*/public static void dfsRecursive(int node) {System.out.print(node + " ");//标记已访问,下面判断使用visited[node] = true;for (int neighbor : graph.get(node)) {if (!visited[neighbor]) {//如果没被访问过,就递归实现dfsRecursive(neighbor);}}}private static void addEdge(int u, int v) {graph.get(u).add(v);graph.get(v).add(u);}
}

好了,两个经典的家伙介绍完毕,祝你好运

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

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

相关文章

嵌入式八股RTOS与Linux---前言篇

前言 Linux与RTOS是校招八股的时候很喜欢考察的知识,在这里并没有把两个操作系统完全的独立开去讲,放在一起对比或许可能加深印象。我们讲Linux的内核有五部分组成:进程调度、内存管理、文件系统、网络接口、进程间通信,所以我也将从这五方面出发 中断管理去对比和RTOS的不同。…

ChatBI 的技术演进与实践挑战:衡石科技如何通过 DeepSeek 实现商业落地

随着人工智能技术的快速发展&#xff0c;ChatBI&#xff08;基于自然语言交互的商业智能&#xff09;逐渐成为企业数据分析领域的热门话题。作为 BI&#xff08;商业智能&#xff09;领域的新形态&#xff0c;ChatBI 通过自然语言处理&#xff08;NLP&#xff09;技术&#xff…

基于Vue实现Echarts的平滑曲线

在Vue2.x的项目中使用echarts实现如下效果 安装echarts npm install echarts --save组件引入echarts // 在你的Vue组件中 import * as echarts from echarts;在模板中添加一个div元素&#xff0c;用来放置图表 <divref"chart"class"chart"style"…

关于重构分析查询界面的思考(未完)

业务系统里&#xff0c;查询界面很常见&#xff0c;数据分析场景需求普遍而迫切&#xff0c;而新的技术也在不断出现&#xff0c;很有必要重构分析查询界面。 查询筛选 为了尽可能从数据中发现&#xff0c;需要尽可能地将查询条件添加进来&#xff0c;可这样&#xff0c;查询…

在jQuery中DOM操作

&#xff08;一&#xff09;元素选取 各种选择器的使用方法与示例 标签选择器&#xff1a;通过 HTML 标签名称来选取元素。例如&#xff0c;若想选中页面中所有的段落元素&#xff0c;可使用$(‘p’)。假设我们有如下 HTML 结构&#xff1a; 这是第一个段落 这是嵌套在div中的…

Java 集合框架中 `List` 接口及其子类的详细介绍,并用 UML 图表展示层次结构关系,用表格对比各个类的差异。

下面是 Java 集合框架中 List 接口及其子类的详细介绍&#xff0c;并用 UML 图表展示层次结构关系。最后&#xff0c;我会用表格对比各个类的差异。 Java 集合框架中 List 接口及其子类 UML 类图描述 以下是 List 接口及其子类的 UML 类图描述&#xff0c;不包含方法。 详细…

Java面试八股—Redis篇

一、Redis的使用场景 &#xff08;一&#xff09;缓存 1.Redis使用场景缓存 场景&#xff1a;缓存热点数据&#xff08;如用户信息、商品详情&#xff09;&#xff0c;减少数据库访问压力&#xff0c;提升响应速度。 2.缓存穿透 正常的访问是&#xff1a;根据ID查询文章&…

Spring Boot使用线程池创建多线程

在 Spring Boot 2 中&#xff0c;可以使用 Autowired 注入 线程池&#xff08;ThreadPoolTaskExecutor 或 ExecutorService&#xff09;&#xff0c;从而管理线程的创建和执行。以下是使用 Autowired 方式注入线程池的完整示例。 1. 通过 Autowired 注入 ThreadPoolTaskExecuto…

9、交付手段-强化肌肉记忆(随身工具箱)

一、交付工具箱 当临时遇到各类交付棘手问题时&#xff0c;大脑里记住交付工具的使用场景&#xff0c;有利于快速决策&#xff0c;将这些工具转为肌肉记忆&#xff0c;能够快速灵活处理交付中的各类问题&#xff0c;蜕变为交付之星 1、复杂项目&#xff1a;WBS分解、日站会、…

【概念】Node.js,Express.js MongoDB Mongoose Express-Validator Async Handler

1. Node.js 定义&#xff1a;Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;允许你在服务器端运行 JavaScript 代码。作用&#xff1a;它使得开发者可以使用 JavaScript 编写服务器端代码&#xff0c;从而实现前后端使用同一种语言。比喻&#xff1a…

【GPT入门】第22课 langchain LCEL介绍

【GPT入门】第22课 langchain LCEL介绍 1. LCEL介绍与特点2. 原生API与LCEL的对比2. 简单demo 1. LCEL介绍与特点 LCEL 即 LangChain Expression Language&#xff0c;是 LangChain 推出的一种声明式语言&#xff0c;用于简化和优化在 LangChain 框架内构建复杂链和应用的过程…

数据结构——单链表list

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍数据结构——单链表 目录 一、单链表 二、使用步骤 1.结构体定义 2.初始化 3.插入 3.1 头插 3.2 尾插 3.3 按位置插 四.删除 4.1头删 4.2 尾删 4.3 按位置删 4.4按值删 五 统计有效值个数 六 销毁…

堆排序:力扣215.数组中的第K个大元素

一、问题描述 在一个整数数组 nums 中&#xff0c;需要找出第 k 个最大的元素。这里要注意&#xff0c;我们要找的是数组排序后的第 k 个最大元素&#xff0c;而不是第 k 个不同的元素。例如&#xff0c;对于数组 [3,2,1,5,6,4]&#xff0c;当 k 2 时&#xff0c;第 2 个最大…

C语言(25)

一.数据在内存中的存储 1.整数在内存中的存储 整数在内存中以二进制的形式储存&#xff0c;分别为原码&#xff0c;补码&#xff0c;反码 有符号的整数&#xff0c;在上述三种形式都有符号位和数值位两个部分&#xff0c;符号位为0是正数&#xff0c;1是负数&#xff0c;最高…

鸿蒙开发-一多开发之媒体查询功能

在HarmonyOS中&#xff0c;使用ArkTS语法实现响应式布局的媒体查询是一个强大的功能&#xff0c;它允许开发者根据不同的设备特征&#xff08;如屏幕尺寸、屏幕方向等&#xff09;动态地调整UI布局和样式。以下是一个使用媒体查询实现响应式布局的实例&#xff1a; 1. 导入必要…

Docker运行hello-world镜像失败或超时:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi

Docker运行hello-world镜像失败或超时&#xff0c;报错&#xff1a;Unable to find image ‘hello-world:latest’ locally Trying to pull repository docker.io/library/hello-world … /usr/bin/docker-current: missing signature key. See ‘/usr/bin/docker-current run …

MySQL连接较慢原因分析及解决措施

文章目录 整体说明一、问题现象二、问题分析2.1、DNS反向解析问题2.2、网络问题2.3、SSL/TLS协商问题2.4、自动补全的延迟 三、问题解决 摘要&#xff1a; MySQL连接较慢原因分析及解决措施 关键词&#xff1a; MySQL、连接缓慢、客户端、参数设置 整体说明 在使用MySQL的时候…

doris:安全概览

oris 提供以下机制管理数据安全&#xff1a; 身份认证&#xff1a;Doris 支持用户名/密码与 LDAP 认证方式。 内置认证&#xff1a;Doris 内置了用户名/密码的认证方式&#xff0c;可以自定义密码策略&#xff1b; LDAP 认证&#xff1a;Doris 可以通过 LDAP 服务集中管理用户…

C++之文字修仙小游戏

1 效果 1.1 截图 游戏运行&#xff1a; 存档&#xff1a; 1.2 游玩警告 注意&#xff01;不要修改装备概率&#xff0c;装备的概率都是凑好的数字。如果想要速升&#xff0c;修改灵石数量 2 代码 2.1 代码大纲 1. 游戏框架与初始化 控制台操作&#xff1a;通过 gotoxy() …

Docker安装部署RabbitMQ

Docker安装部署RabbitMQ 本文介绍了如何在Linux&#xff08;CentOS 7&#xff09;系统环境下的Docker上安装部署RabbitMQ的详细过程。 目录 Docker安装部署RabbitMQ一、环境准备1.Linux环境2.Docker3.停止并移除现有的 RabbitMQ 镜像和容器 二、安装部署RabbitMQ1.拉取 RabbitM…