Java实现深度优先搜索

article/2025/9/13 18:34:44

Java实现深度优先搜索

图的遍历

图的遍历就是访问图中的每个节点并且每个节点只访问一次。但图中有那么多节点,要如何进行访问就是一个问题,所以我们需要有特定的策略来进行访问这些节点。图的访问策略一般有两种:深度优先搜索和广度优先搜索

深度优先搜索基本思想

从初始节点开始出发访问,访问该节点的第一个相邻节点,然后以该相邻节点为起点,继续访问其相邻节点,反复持续该过程直到图中所有节点已全部被访问;简单总结就是:访问完当前节点后就去访问当前节点的第一个相邻节点。这样一来,图的访问顺序就是向深处访问,而不是横向访问。

我们将要访问的节点称为头节点,相邻节点称为表节点;头节点中存储数据和第一个表节点,表节点中存储头节点的下标和头节点的下一个相邻节点;头节点使用顺序(链表)存储,表节点使用链表存储;

如下图,其深度优先搜索顺序可以v1, v2, v4, v8, v5, v3, v6, v7,注意:深度优先搜索的顺序不是唯一的,这取决于访问起点和表节点的顺序。

image-20221119211434508

实现思路

  • 访问头节点,并将该头节点标记为以访问过
  • 访问表节点中第一个没有被访问过的头节点,这里需要循环
  • 以该头节点为起点,继续上面两步操作直到访问完所有节点,这里需要递归

代码实现

定义头节点和表节点

//头节点
public class HNode<T> {public T data; //数据域public boolean isVisit; //标识该头节点是否已经被访问过public TNode firstArc; //指针域,指向第一个表节点public HNode(T data) {this.data = data;}public HNode() {}@Overridepublic String toString() {return "HNode{" +"data=" + data +", isVisit=" + isVisit +", firstArc=" + firstArc +'}';}
}//表节点
class TNode {public int hNodeIndex;//存储头节点下标public TNode nextArc; //指针域,指向下一个相邻的表节点public TNode(int hNodeIndex) {this.hNodeIndex = hNodeIndex;}}

定义一个 Graph 类,一个Graph类就表示一个图

class Graph {private HNode[] vertices; //存储头节点public Graph(HNode[] vertices) {this.vertices = vertices;}//构建图public void build(Object data) {}//图的深度优先搜索//index表示从顺序表中的第几个节点开始遍历public void dfs(int index) {//访问index对应的头节点System.out.println(vertices[index].data);//设置当前节点为已访问vertices[index].isVisit = true;//临时变量,用于辅助遍历表节点TNode temp = vertices[index].firstArc;//通过表节点访问未被访问过的头节点while (temp != null) {if (vertices[temp.hNodeIndex].isVisit) {//当前节点已经被访问过,无需再访问,继续往后寻找temp = temp.nextArc; //后移} else {//当前表节点对应的头节点没有被访问过,以该头节点为起点,继续执行上面代码的逻辑:访问-寻找为访问的表节点-访问-寻找完毕,退出dfs(temp.hNodeIndex);}}}}

在main方法中测试

public class DFSDemo {public static void main(String[] args) {HNode[] nodes = new HNode[5];for (int i = 0; i < nodes.length; i++) {HNode<String> node = new HNode<>("张三-" + (i + 1));nodes[i] = node;}TNode node1 = new TNode(2);node1.nextArc = new TNode(3);nodes[0].firstArc = node1;TNode node2 = new TNode(0);node2.nextArc = new TNode(4);nodes[1].firstArc = node2;TNode node3 = new TNode(1);node3.nextArc = new TNode(3);nodes[2].firstArc = node3;TNode node4 = new TNode(0);node4.nextArc = new TNode(1);nodes[3].firstArc = node4;TNode node5 = new TNode(3);node5.nextArc = new TNode(2);nodes[4].firstArc = node5;for (HNode node : nodes) {System.out.println(node);}Graph graph = new Graph(nodes);System.out.println("--------------深度优先搜索--------------");graph.dfs(0);}
}

测试结果

image-20221119222023589


http://chatgpt.dhexx.cn/article/7CpkOE0w.shtml

相关文章

深度优先搜索

深度优先搜索&#xff1a; 深度优先搜索是对先序遍历的一般化。我们从某个节点开始&#xff0c;先处理&#xff0c;并将标记为已知&#xff0c;然后任意选择的一个邻接顶点&#xff0c;对其进行深度优先搜索&#xff0c;这样就递归的遍历了图的所有顶点。当图中有圈时&#xf…

【基础知识】一文看懂深度优先算法和广度优先算法

概览 先上个图 现在我们要访问图中的每个节点&#xff0c;即图的遍历。 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使每个顶点仅被访问一次&#xff…

深度优先搜索(DFS),看这一篇就够了。

一&#xff0c;定义&#xff1a; 深度优先搜索的思路和树的先序遍历很像&#xff0c;下面是百度百科上的定义&#xff1a; 深度优先遍历图的方法是&#xff0c;从图中某顶点v出发&#xff1a; &#xff08;1&#xff09;访问顶点v&#xff1b; &#xff08;2&#xff09;依次从…

Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

一&#xff0c;简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xff0c;寻路(走迷宫)&#xff0c;搜索引擎&#xff0c;爬虫等&#xff0c;也频繁出现在 leetcode&am…

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

1. 深度优先搜索简介 深度优先搜索算法&#xff08;Depth First Search&#xff09;&#xff1a;英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先&#xff0c;就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想&#xff0c;该算法沿着树的深度遍历树的节…

【新书速递】实用安全多方计算导论

安全多方计算&#xff08;MPC&#xff09;是解决数据安全与隐私保护问题的关键安全数据交换技术&#xff0c;近年来发展迅速&#xff0c;但由于MPC涉及复杂的密码学和工程实现技术&#xff0c;行业长期缺乏同时具备MPC研究、应用和实现能力的综合性人才&#xff0c;这阻碍了MPC…

百万富翁问题--安全多方计算

百万富翁问题—安全多方计算 是由图灵奖获得者姚期智提出的。 有A、B两个富翁&#xff0c;A资产i亿元&#xff0c;B资产j亿元&#xff0c;i、j均在0-10范围内&#xff0c;在互不让对方知道自己资产的情况下&#xff0c;比较A和B的资产谁多谁少。 那么如何去比较呢&#xff1f;…

隐私保护技术之安全多方计算

安全多方计算(Secure Multi-Party Computation&#xff0c;SMPC)用于解决一组互不信任的参与方各自持有秘密数据&#xff0c; 协同计算一个既定函数的问题。安全多方计算在保证参与方获得正确计算结果的同时&#xff0c;无法获得计算结果之外的任何信息。 在整个计算过程中&…

基于同态加密体制的安全多方计算

本文首发公众号VenusBlockChain&#xff0c;关注公众号后可免费阅读&#xff01;VenusBlockChain致力于区块链技术研究&#xff0c;传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们&#xff0c;欢迎关注。 安全多方计算&#xff08;Secure Mu…

多方安全计算

说明&#xff0c;本文是转载的&#xff0c;个人觉得作者讲解清晰明了&#xff0c;收录用于学习&#xff0c;原文链接&#xff1a;https://blog.csdn.net/yuxinqingge/article/details/104588197。 如今&#xff0c;互联网已经完成了从IT时代向DT时代转变&#xff0c;数据已经成…

多方安全计算MPC

1.多方安全计算的价值 MPC是密码学的一个重要分支&#xff0c;旨在解决一组互不信任的参与方之间保护隐私的协同计算问题&#xff0c;为数据需求方提供不泄露原始数据前提下的多方协同计算能力。 在目前个人数据毫无隐私的环境下&#xff0c;对数据进行确权并实现数据价值显得…

安全多方计算(MPC)

MPC既适用于特定的算法&#xff0c;如加法、乘法、AES&#xff0c;集合交集等&#xff1b;也适用于所有可表示成计算过程的通用算法。 根据计算参与方个数不同&#xff0c;可分为只有两个参与方的2PC和多个参与方&#xff08;≥3&#xff09;的通用MPC 1&#xff09;安全两方&a…

安全多方计算之二:一文搞懂百万富翁问题

百万富翁问题 1. 解决方案2. 协议描述3. 协议说明4. 协议举例5. 协议扩展 两个百万富翁Alice和Bob想知道他们两个谁更富有&#xff0c;但他们都不想让对方及其他第三方知道自己财富的任何信息&#xff0c;这是由中国计算机科学家、2000年图灵奖获得者姚启智教授于1982年在论文《…

安全多方计算-入门学习笔记(三)

四、基于非噪音的安全多方计算介绍 1概念 非噪音方法一般是通过密码学方法将数据编码或加密&#xff0c;得到一些奇怪的数字&#xff0c;而且这些奇怪的数字有一些神奇的性质&#xff0c;比如看上去很随机但其实保留了原始数据的线性关系&#xff0c;或者顺序明明被打乱但人们…

基于隐私保护的安全多方计算区块链融合技术的智能合约

安全多方计算与区块链的融合技术 SMPC-安全多方计算综述安全的定义安全模型SMPC效率问题 区块链应用&#xff1a;智能合约智能合约的问题SMPC需求引入 基于SMPC的智能合约辅助&#xff1a;MPI协议-效率提升 SMPC-安全多方计算综述 随着物联网、移动计算、大数据、云计算的快速…

安全多方计算之GMW协议

安全多方计算之GMW协议 一、背景 论文原文《How to play any mental game》。作者&#xff1a;Micali S, Goldreich O, Wigderson A. 发表在&#xff1a;Proceedings of the Nineteenth ACM Symp on Theory of Computing, STOC. GMW协议可以同时适用在布尔电路和算术电路&am…

多方安全计算概述

多方安全计算&#xff08;Secure Multi-Party Computation&#xff0c; MPC&#xff09;是密码学的一个分支&#xff0c;在无可信第三方的情况下&#xff0c;仍可安全地按照公开的计算逻辑&#xff0c;进行数据协同计算&#xff0c;并输出结果。 即使参与各方输入的数据只有自…

安全多方计算之一:什么是安全多方计算

安全多方计算 1. 安全多方计算简介2. 基本概念2.1 参与者2.2 攻击者 3. 安全多方计算的模型4. 安全多方计算的密码学工具5. 学习参考 1. 安全多方计算简介 安全多方计算问题SMC&#xff0c;Secure Multi-party Computation&#xff09;由由中国计算机科学家、2000年图灵奖获得…

安全多方计算简介

文章目录 一、安全多方计算定义二、安全多方计算安全模型1.行为模型2.安全门限 三、安全多方计算关键技术1.秘密共享(Secret Sharing, SS)2.不经意传输(Oblivious Transfer, OT)3.混淆电路(Garbled Circuit, GC) 参考资料 一、安全多方计算定义 安全多方计算(Secure Multi-Par…

安全多方计算 # 个人笔记

一个优美令人如痴如醉的领域。 Data is the oil of the 21st century 欢迎读者拍砖和提供本文修改建议。本文长期维护。 第二次编辑于2021/10/20&#xff0c;新增了部分阅读材料&#xff0c;调整了文章内容的组织。 0 研究背景 【最后更新于2021/10/20】 时代背景&#xff1…