Java 深度优先搜索

深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。在Java中,可以使用递归或迭代的方法来实现DFS。下面我将分别介绍这两种实现方式。

递归实现

递归实现通常更为直观和简洁。在递归方法中,我们会使用一个栈(在递归调用栈中)来保存节点信息。

import java.util.*;  class Graph {  private int numVertices;  private LinkedList<Integer>[] adjLists;  // 构造函数  Graph(int vertices) {  numVertices = vertices;  adjLists = new LinkedList[vertices];  for (int i = 0; i < vertices; i++) {  adjLists[i] = new LinkedList<>();  }  }  // 添加边  void addEdge(int src, int dest) {  adjLists[src].add(dest);  }  // 递归的深度优先搜索(DFS)辅助函数  private void DFSUtil(int vertex, boolean[] visited) {  // 标记当前节点为已访问  visited[vertex] = true;  System.out.print(vertex + " ");  // 递归访问所有邻接节点  Iterator<Integer> iterator = adjLists[vertex].listIterator();  while (iterator.hasNext()) {  int adjVertex = iterator.next();  if (!visited[adjVertex]) {  DFSUtil(adjVertex, visited);  }  }  }  // 深度优先搜索算法  void DFS(int startVertex) {  // 标记所有节点为未访问  boolean[] visited = new boolean[numVertices];  // 从指定节点开始DFS  DFSUtil(startVertex, visited);  }  public static void main(String[] args) {  Graph graph = new Graph(5);  graph.addEdge(0, 1);  graph.addEdge(0, 2);  graph.addEdge(1, 2);  graph.addEdge(2, 0);  graph.addEdge(2, 3);  graph.addEdge(3, 3);  System.out.println("深度优先搜索(DFS)遍历起始节点为 2:");  graph.DFS(2);  }  
}

迭代实现

迭代实现DFS需要使用显式栈来保存节点信息。以下是一个使用栈实现DFS的例子:

import java.util.*;  class Graph {  private int numVertices;  private LinkedList<Integer>[] adjLists;  // 构造函数  Graph(int vertices) {  numVertices = vertices;  adjLists = new LinkedList[vertices];  for (int i = 0; i < vertices; i++) {  adjLists[i] = new LinkedList<>();  }  }  // 添加边  void addEdge(int src, int dest) {  adjLists[src].add(dest);  }  // 深度优先搜索算法(迭代方式)  void DFS(int startVertex) {  // 标记所有节点为未访问  boolean[] visited = new boolean[numVertices];  // 创建一个栈并压入起始节点  Stack<Integer> stack = new Stack<>();  stack.push(startVertex);  // 遍历栈,直到栈为空  while (!stack.isEmpty()) {  int vertex = stack.pop();  // 如果该节点未被访问  if (!visited[vertex]) {  // 标记为已访问并打印  visited[vertex] = true;  System.out.print(vertex + " ");  // 将所有邻接节点压入栈中  Iterator<Integer> iterator = adjLists[vertex].listIterator();  while (iterator.hasNext()) {  int adjVertex = iterator.next();  if (!visited[adjVertex]) {  stack.push(adjVertex);  }  }  }  }  }  public static void main(String[] args) {  Graph graph = new Graph(5);  graph.addEdge(0, 1);  graph.addEdge(0, 2);  graph.addEdge(1, 2);  graph.addEdge(2, 0);  graph.addEdge(2, 3);  graph.addEdge(3, 3);  System.out.println("深度优先搜索(DFS)遍历起始节点为 2:");  graph.DFS(2);  }  
}

总结

  1. 递归实现:代码更简洁,但对于非常深的图(例如递归深度非常大)可能会导致栈溢出。
  2. 迭代实现:使用显式栈来控制递归深度,更适合处理深图,但代码相对复杂一些。

你可以根据具体的需求选择合适的实现方式。

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

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

相关文章

[Java基础] 流程控制

[Java基础] 运算符 [Java基础] 基本数据类型 [Java基础] Java HashMap 的数据结构和底层原理 目录 基本语法 条件语句 if 语句 if-else 语句 switch 语句 循环语句 for 循环 while 循环 do-while 循环 跳转语句 break 语句 continue 语句 return 语句 最佳实践…

嵌入式基础 -- SDIO协议

SDIO 硬件、协议与 Linux 驱动技术文档 1. SDIO 简介 SDIO&#xff08;Secure Digital Input Output&#xff09;协议是SD存储卡的物理接口扩展&#xff0c;允许通过SD总线连接和控制各种I/O设备&#xff0c;如Wi-Fi、蓝牙、GPS模块等。SDIO协议在标准的SD协议基础上扩展&…

【题解】【记忆化递归】——Function

【题解】【记忆化递归】——Function Function题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.思路解析2.AC代码 Function 通往洛谷的传送门 题目描述 对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c) 如果 a ≤ 0 a \le 0 a≤0 或 b ≤…

大厂面试真题-具体说说jdk1.7和1.8的hashmap的线程不安全都有什么问题

HashMap在JDK 1.7和JDK 1.8中都存在线程不安全的问题&#xff0c;但具体表现和解决方式有所不同。以下是对这两个版本中HashMap线程不安全问题的详细分析&#xff1a; JDK 1.7 HashMap的线程不安全问题 在JDK 1.7中&#xff0c;HashMap的线程不安全问题主要体现在扩容过程中。…

阿里Dataworks使用循环节点和赋值节点完成对mongodb分表数据同步

背景 需求将MongoDB数据入仓MaxCompute 环境说明 MongoDB 100个Collections&#xff1a;orders_1、orders_2、…、orders_100 前期准备 1、MongoDB数据源配置 需要先保证DW和MongoDB网络是能够联通的&#xff0c;需要现在集成任务中配置MongoDB的数据源信息。 具体可以查…

项目分析:自然语言处理(语言情感分析)

在这个信息爆炸的时代&#xff0c;我们每天都在与海量的文本数据打交道。从社交媒体上的帖子、在线评论到新闻报道&#xff0c;文本信息无处不在。然而&#xff0c;这些文本不仅仅是文字的堆砌&#xff0c;它们背后蕴含着丰富的情感和观点。如何有效地理解和分析这些情感&#…

【AI知识点】对比学习(Contrastive Learning)

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】 对比学习&#xff08;Contrastive Learning&#xff09; 是一种基于样本之间相似性和差异性的无监督或自监督学习方法&#xff0c;旨在通过构建正例和负例对来学习数据的有效表示。对比学习广泛应用于自然语言处理&#…

Linux下的防病毒软件(Antivirus software for Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善&#xff0c;可以先去看上一个案例然后再…

docker环境安装mongoDB实现平滑迁移实战

docker环境安装mongoDB实现平滑迁移实战 一、备份原始数据&#xff08;从别的服务器备份到当前服务器&#xff09;二、数据迁移三、迁移过程日志打印四、验证迁移数据准确性 一、备份原始数据&#xff08;从别的服务器备份到当前服务器&#xff09; 使用mongodump工具对原始mo…

Redisson使用全解

redisson使用全解——redisson官方文档注释&#xff08;上篇&#xff09;_redisson官网中文-CSDN博客 redisson使用全解——redisson官方文档注释&#xff08;中篇&#xff09;-CSDN博客 redisson使用全解——redisson官方文档注释&#xff08;下篇&#xff09;_redisson官网…

Java发送请求实现QPS限制

业务场景 在开发中&#xff0c;当有业务需求需要调用第三方服务实现功能&#xff0c;但是服务接口有QPS限制&#xff0c;所以我们需要在发送请求时限制发送频率防止请求失败。 实现方法 使用 Java Semaphore 类来实现控制请求QPS QPS限制 Component public class QPSControll…

洛谷P1484.种树

洛谷P1484.种树 题目解析及思路 题目要求在一条n个坑的路上&#xff0c;对于已知每个坑种树的收益&#xff0c;并且相邻两个坑不能同时种树的情况下&#xff0c;求最大收益 思考一个小范围的例子(不考虑数组全负数)&#xff1a; 当m 1时&#xff0c;答案一定为数组中的最大…

MySQL 8.4修改user的host属性值

MySQL 8.4修改user的host属性值 update mysql.user set host localhost where user mysql用户名; MySQL 8.4修改初始化后的默认密码-CSDN博客文章浏览阅读804次&#xff0c;点赞6次&#xff0c;收藏11次。先下载mysql的zip压缩包&#xff1a;MySQL :: Download MySQL Communi…

贪心day1

文章目录 前言雪糕的最大数量重新分装苹果装满石头的背包的最大数量K 次取反后最大化的数组和不同整数的最少数目 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛…

51、AVR、ARM、DSP等常用芯片之对比

51芯片 51芯片通常指的是基于8051内核的单片机&#xff0c;这是一种经典的微控制器&#xff08;MCU&#xff09;。虽然关于51芯片的详细现代应用和发展可能因具体型号和厂商而有所不同&#xff0c;但基于8051内核的单片机通常具有以下特点&#xff1a; 结构经典&#xff1a;8…

STL-string

STL的六大组件&#xff1a; string // string constructor #include <iostream> #include <string> using namespace std; int main() {// 构造std::string s0("Initial string");std::string s1; //nullptrstd::string s2("A character sequenc…

【在Linux世界中追寻伟大的One Piece】Jsoncpp|序列化

目录 1 -> Jsoncpp 1.1 -> 特性 1.2 -> 安装 2 -> 序列化 3 -> 反序列化 4 -> Json::Value 1 -> Jsoncpp Jsoncpp是一个用于处理JSON数据的C库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C数据结构的功能。Jsoncpp是开源的&#xf…

RHCSA复习题

第一~七章 1.创建以下目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下。 [rootlocalhost ~]# mkdir /yasuo [rootlocalhost ~]# mkdir /yasuo/dir1 [rootlocalhost ~]# cd /yasuo/dir1 [rootlocalhost dir1]# touch hostname hostname02 passwd ssh_config sshd [r…

深度学习:模型攻击(Model Attack)详解

模型攻击&#xff08;Model Attack&#xff09;详解 模型攻击通常指在机器学习和人工智能领域中&#xff0c;故意设计的行为或方法&#xff0c;旨在操纵或欺骗机器学习模型的输出。这类攻击可能导致模型做出错误的决策或泄露敏感信息&#xff0c;对于安全性至关重要的应用&…