十六、Java数据结构与算法 - 图

news2024/11/20 3:18:42

文章目录

  • 一、图的基本介绍
    • 1.1 为什么要有图
    • 1.2 图的举例说明
    • 1.3 图的常用概念
  • 二、图的表示方式
    • 2.1 邻接矩阵
    • 2.2 邻接表
  • 三、图的快速入门案例
  • 四、图的遍历
    • 4.1 深度优先遍历DFS
      • 4.1.1 基本思想
      • 4.1.2 算法步骤
      • 4.1.3 图示
    • 4.2 广度优先遍历BFS
      • 4.2.1 基本思想
      • 4.2.2 算法步骤
      • 4.2.3 图示
    • 4.3 代码实现图及两种遍历方式


一、图的基本介绍

1.1 为什么要有图

  • 前面我们学了线性表和树
  • 线性表局限于一个直接前驱和一个直接后继的关系
  • 树也只能有一个直接前驱也就是父节点
  • 当我们需要表示多对多的关系时,这里我们就用到了图

1.2 图的举例说明

图是一种数据结构,其中节点可以具有零个或者多个相邻元素。两个节点之间的连接称为边。节点也可以称为顶点。如下图,展示了一些图:
在这里插入图片描述

1.3 图的常用概念

1)顶点(vertex)
2)边(edge)
3)路径
4)无向图
在这里插入图片描述
5)有向图
6)带权图
在这里插入图片描述

二、图的表示方式

图的表示方式有两种:二维数组表示(邻接矩阵) 和 链表表示(邻接表)

2.1 邻接矩阵

邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是row和col表示的是1…n个点。
(0 表示不能直接连通, 1 表示直接连通)
在这里插入图片描述

2.2 邻接表

1)邻接矩阵需要为每个顶点都分配n个边的空间,其实很多边都是不存在,会造成空间的损失。
2)邻接表的实现只关心存在的边,不关心不存在的边,因此没有空间浪费,邻接表由数组+链表组成
在这里插入图片描述

三、图的快速入门案例

1)要求:代码实现如下图结构
在这里插入图片描述
2)思路分析

  • 存储顶点 用String类型 使用ArrayList
  • 保存矩阵 int[][] edges
    3)代码实现
public class GraphDemo {

	private ArrayList<String> vertexList;//存储顶点集合
	private int[][] edges;//存储图对应的邻结矩阵
	private int numOfEdges;//表示边的数目

	public static void main(String[] args) {
		int n = 5;  //结点的个数
		String Vertexs[] = {"A", "B", "C", "D", "E"};
		//创建图对象
		GraphDemo graph = new GraphDemo(n);
		//循环的添加顶点
		for (String vertex : Vertexs) {
			graph.insertVertex(vertex);
		}
		//添加边
		//A-B A-C B-C B-D B-E
		graph.insertEdge(0, 1, 1); // A-B
		graph.insertEdge(0, 2, 1); 
		graph.insertEdge(1, 2, 1); 
		graph.insertEdge(1, 3, 1); 
		graph.insertEdge(1, 4, 1); 
		
        //显示一把邻结矩阵
        graph.showGraph();

	}

	public GraphDemo(int n) {
		vertexList = new ArrayList<String>(n);
		edges = new int[n][n];
	}

	//图中常用方法
	//返回结点的个数
	public int getNumOfVertex() {
		return vertexList.size();
	}
	//显示图对应的矩阵
	public void showGraph() {
		for (int[] link:edges) {
			System.out.println(Arrays.toString(link));
		}
	}

	//得到边的数目
	private int getNumOfEdges() {
		return numOfEdges;
	}

	//返回结点i(下标)对应的数据 0->"A" 1->"B" 2->"C"
	public String getValueByIndex(int i) {
		return vertexList.get(i);
	}

	//插入结点
	public void insertVertex(String vertex) {
		vertexList.add(vertex);
	}

	//添加边
	/**
	 * 
	 * @param v1 表示点的下标即是第几个顶点  "A"-"B" "A"->0 "B"->1
	 * @param v2 第二个顶点对应的下标
	 * @param weight
	 */
	public void insertEdge(int v1,int v2, int weight) {
		edges[v1][v2] = weight;
		edges[v2][v1] = weight;
		numOfEdges++;
	}
}

四、图的遍历

所谓图的遍历,就是对节点的访问,一个图有那么多个节点,如何遍历这些节点,需要特定的策略,一般有两种访问遍历策略:

  • 深度优先遍历 DFS
  • 广度优先遍历 BFS

4.1 深度优先遍历DFS

4.1.1 基本思想

4.1.2 算法步骤

4.1.3 图示

4.2 广度优先遍历BFS

4.2.1 基本思想

4.2.2 算法步骤

4.2.3 图示

4.3 代码实现图及两种遍历方式

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

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

相关文章

Segment Anything模型部分结构和代码解析

0x0. 前言 上个月Meta提出的Segment Anything Model&#xff08;SAM&#xff09;希望在视觉领域通过Prompt基础大模型的套路来解决目标分割的问题。经过实测&#xff0c;在大多数场景中SAM的表现都足够惊艳&#xff0c;并且基于SAM的各种二创工作也爆发了比如 检测一切的Groun…

Prometheus监控报警-web,域名,端口, 钉钉版本

Prometheus监控报警-web&#xff0c;域名&#xff0c;端口&#xff0c; 钉钉版本 采用文章 https://www.yuque.com/youngfit/qok2pe/nypstd#616a2e58https://www.jianshu.com/p/eae67b770c3ehttps://blog.csdn.net/Sebastien23/article/details/113645177https://www.cnblogs…

Unix套接字(UDS,Unix Domain Socket)

【知识简介】 在​​Linux​​系统中&#xff0c;有很多进程间通信方式&#xff0c;套接字&#xff08;Socket&#xff09;就是其中的一种。但传统的套接字的用法都是基于TCP/IP协议栈的&#xff0c;需要指定IP地址。如果不同主机上的两个进程进行通信&#xff0c;当然这样做没…

BEVFusion A Simple and Robust LiDAR-Camera Fusion Framework 论文学习

论文地址&#xff1a;BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework 论文学习 Github 地址&#xff1a;BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework 论文学习 1. 解决了什么问题&#xff1f; 将相机和 LiDAR 融合已经成为 3D 检测任务事…

【MySQL】数据库的增删改查二:CURD

目录 ​ 需要知道 &#x1f31f;一、增加数据 &#x1f308;1、语法 &#x1f308;2、单行数据&#xff0c;全列插入 &#x1f308;3、多行数据&#xff0c;全列插入 &#x1f31f;二、查询数据 &#x1f308;1、全列查询 &#x1f308;2、指定列查询 &#…

Nacos集群部署配置Nginx负载均衡

Nacos集群部署配置Nginx负载均衡 1|新建nacos文件夹 mkdir nacos 新建文件夹 cd nacos 进入文件夹2|下载Nacos安装包&#xff08;前提是云服务器&#xff0c;有网。也可以在windows下载好再上传&#xff09; wget https://github.com/alibaba/nacos/releases/download/2…

新品发布 | 12通道CAN FD转USB接口卡全新上市!

新品发布 ON 05.05 TC1018是同星智能开发的一款12路CAN FD总线转USB接口卡&#xff0c;配合我们的TSMaster软件可以监控、分析和仿真CAN FD总线数据。广泛应用于汽车、工业、特种机械和其他行业&#xff0c;用于CAN总线测试与分析、UDS诊断和ECU刷写等方面。 TC1018-产品简介…

weka3.8.6的安装与使用

目录 背景 一、安装 二、使用explorer 1. 介绍 2.打开自带的数据集(Preprocess) 1.打开步骤 2.查看属性和数据编辑 3.classify 4.Cluster 5.Associate 6.Select attributes 7.Visualize 待补充 背景 Weka的全名是怀卡托智能分析环境&#xff08;Waikato Environme…

进程调度/页面置换/磁盘调度算法

进程调度算法 进程调度算法也称 CPU 调度算法&#xff0c;毕竟进程是由 CPU 调度的。 当 CPU 空闲时&#xff0c;操作系统就选择内存中的某个「就绪状态」的进程&#xff0c;并给其分配 CPU。 什么时候会发生 CPU 调度呢&#xff1f;通常有以下情况&#xff1a; 当进程从运…

AIGC:【LLM(二)】——LangChain:由LLMs驱动的应用开发框架

文章目录 一.背景介绍二.LangChain简介2.1 常见应用场景 三.LangChain特点3.1 优点3.2 不足 四.LangChain功能4.1 基础功能4.2 功能模块4.2.1 LLM和Prompts4.2.2 Chain4.2.3 Agent4.2.4 Memory4.2.5 Embedding4.2.6 Models4.2.7 Indexes 五.实战案例5.1 背景需求5.2 数据准备5.…

抖音seo矩阵系统源码是什么?

抖音SEO矩阵系统源码是一款功能强大的营销工具&#xff0c;能够帮助用户进行抖音视频的SEO优化&#xff0c;使其在抖音平台上获得更高的曝光度和流量。该系统结合了SEO的相关算法和技巧&#xff0c;提供了完整的优化方案&#xff0c;可帮助用户提高视频的曝光率、获得更多的点赞…

阻塞队列原理及Java实现

目录 1.阻塞队列 1.举例&#xff1a;包饺子 1.通过多线程来实现 2.通过阻塞队列来实现 2.消息队列 1.解耦 2.削峰填谷 用消息队列来解决 3.异步操作 3.实现一个阻塞队列 使用循环数组 4.实现生产者和消费者模型 完整代码 5.虚假唤醒 1.概念及原因 2.解决方法 1…

关于GD32替换STM32(pin to pin)搭载rt-thread操作系统,需要注意的问题总结

1、SystemInit()函数 该函数位于启动文件中的Reset_Handler中(具体实现在GD32位于system_gd32f4xx.c&#xff0c;STM32位于system_stm32f4xx.c中&#xff0c;几乎所有的文件&#xff0c;你只要把gd换成st就能找到对应的文件)&#xff0c;gd的叫startup_gd32Fxxx.s&#xff0c;…

4.HIVE函数

1.hive函数 1.1 空值替换 两个输入&#xff1a;nvl(col,default_num) : 如果colum不为null&#xff0c;返回col.否则返回default_num 多个输入&#xff1a;coalesce(col1, col2, col3, ....) &#xff1a;从左到右找第一个不为null的值 例如&#xff1a;求所有员工的平均薪…

【操作系统】总结

依旧是小林coding 的内容 存储架构 现代 CPU 都是多核心的&#xff0c;线程可能在不同 CPU 核心来回切换执行&#xff0c;这对 CPU Cache 不是有利的&#xff0c;虽然 L3 Cache 是多核心之间共享的&#xff0c;但是 L1 和 L2 Cache 都是每个核心独有的&#xff0c;如果一个线…

VMWare安装windows7虚拟机提示Operating System not found

前提&#xff1a;下载windows7 Gost并创建虚拟机&#xff0c;启动报错&#xff1a;Operating System not found 解决办法 用微PE工具制作iso系统&#xff0c;对虚拟机进行分区 下载地址&#xff1a;https://www.wepe.com.cn/ 制作方法&#xff0c;双击安装程序&#xff0c;选…

最困难的也是最简单的,做好这两点不盈利天理难容

投资者应该时刻记住&#xff0c;在外汇交易中复杂的方法并不总是最好的。Forexclub发现交易中最困难的是正确识别进场点和出场点。 从技术上来说&#xff0c;进入交易是非常容易的&#xff0c;你只需要点击一个按钮&#xff0c;你就在那里交易。但是你会从中获利吗?没人能回答…

【Linux Network】网络编程套接字(代码练习)—UDP

目录 1. 常用接口 2. C/S 回声模拟 3. C/S myshell 的制作 Linux网络编程✨ 1. 常用接口 socket&#xff1a;创建套接字&#xff1a; // 创建 socket 文件描述符 int socket(int domain, int type, int protocol); 返回值&#xff1a; 套接字创建成功返回一个文件描述符 &…

GAMMA电源维修直流高压电源模块RR300-1P

美国GAMMA高压电源维修参数&#xff08;RR分离式&#xff09;&#xff1a; 输入&#xff1a;220VAC 或 380VAC&#xff08;视型号而定&#xff09; 输出电压&#xff1a;550KV&#xff0c;功率&#xff1a;0-10KW或定制 纹波率0.01 &#xff1b;稳定度0.01/1H 控制部分19英…

(只需两步)让ChatGPT帮你制作出漂亮的PPT

目录 第一步&#xff1a;生成 PPT 代码 第二步&#xff1a;将代码转化为 PPT 还在为制作PPT而烦恼吗&#xff1f; 让ChatGPT来帮您&#xff01; 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式&#xff0c;省时省力又专业&#xff01; &#xff08;真的只需两步&#xf…