当前位置: 首页 > news >正文

数据结构图的基础概念

1、图的概念

图(Graph):是由顶点的有穷非空集合和顶点之间边的集合组成。
顶点(Vertex):图中的数据元素。
边(Edge):顶点之间的逻辑关系,边可以是有向的或无向的,也可以带有权重(可以表示距离,花费等)
无向边:若顶点之间的边没有方向,则称这条边为无向边
有向边:若从顶点 vi 到 νj的边有方向,则称这条边为有向边(一条无向边可以用两条有向边来表示)

无向图

图中任意两个顶点之间的边都是无向边,无向边表示从节点1可以到节点2,也可以从节点2到节点1
203f4472814137b3a06686ed16217bad.png

有向图

图中任意两个顶点之间的边都是有向边  图中的方向都是朝向一个方向的,并不是有向图都是朝向一个方向,只是为了方便,有向图可以理解为路径是有方向的,只能按着箭头的方向
a80c9ba9f1a09fbad0955fcb2085427b.png

2、图的存储

图的存储常用的邻接矩阵和邻接表
邻接矩阵存储查询简单方便,缺点当遇到的图是稀疏图时会浪费大量空间
邻接表相对邻接矩阵复杂点,优点节省空间,但当图时稠密图时它的优点就不明显了

邻接矩阵

数组(i,j)表示从i到j是否连通,0表示不联通,不为0表示联通

无向图存储

将一条有向边转化为两条有向边,比如 顶点1和顶点2这条无向边转化为顶点1到顶点2和顶点2到顶点1两条有向边08b830c3a1176dfae173d4012a2450a2.png

有向图存储

50273bd040989184dd29d91876d1c6d3.png
有向图二维数组.png

邻接表

551bfc02c48a233613c5a61922c83235.png
有向图邻接表.png
//顶点 class POS{public POS(int head) {this.head = head;}public  int head;//这个值指向的是边}
//边class Edge{public int v;public  int next;}//图的初始化
top =0;//用来记录边的位置
posList =new ArrayList<>();//顶点
edgeList =new ArrayList<>();//边的列表
for(int i = 0;i<=posSize;i++){posList.add(new POS(-1));//初始化hadVisted[i] =false;//初始化}
//添加边邻接表,添加一条从u到v的边public void Add_Edge(int u, int v) {//  1 -> 4->3->2Edge edge =new Edge();edge.v =v;edge.next =posList.get(u).head;posList.get(u).head =top;edgeList.add(edge);top++;}

3、图的搜索

深搜

深搜就是一个递归 1、从顶点1开始遍历,遍历到顶点2,然后从顶点2开始遍历a3c6378273932d92fab51789d0159ee2.png2、由顶点2遍历到顶点5,顶点5遍历到顶点8

d687a0423c6a59e1e6fdc4d3e996d70d.png3、到顶点8,没有路径回溯到顶点5,然后回溯到顶点2,遍历顶点6, 由顶点6遍历到顶点7f9278d164b2481689dfa80fc4fb7c5b3.png4、顶点8已遍历,回溯6,然后回溯到2,然后回溯到1f756f4b7d850fa9d34e2bdea17fb3255.png5、遍历顶点3,4a15e74c9ebecde8587622e9823480699.png

//深搜public void dfsVist(int u){for(int i = posList.get(u).head;i!=-1;i=edgeList.get(i).next){Edge edge = edgeList.get(i);if(!hadVisted[edge.v]){System.out.println("访问节点:"+edge.v);hadVisted[edge.v] =true;vist(edge.v);}}}

广搜

广搜需要一个队列来辅助 从1开始9d43f06f3059ef532b81ec7787751b9c.png将与1相连的 2,3,4加入队列,同时1出列d5900009aacf7e64dc421e2dd6795db5.png从队列开头取出顶点2,将与2相连的5,6加入队列,2出列75f74f491dae23b1b85cc62ef131aedd.png取出3,与3相连的都访问了,取出4,3,4出列,7进入队列58e6b576af86764b895860869e7561af.png取5,将与5相连的8加入队列,5出列6451e8628e516af1c1cebaaf390d5b1f.png接下来取出6,7,8,因为都访问过了,等列表为空,遍历结束

public void bfsVist(int u){Queue queue = new LinkedList();queue.add(u);//加入队列System.out.println("访问节点="+u);while (!queue.isEmpty()){//直至列表为空Integer p = (Integer) queue.poll();//取出列表里元素for(int i = posList.get(p).head;i!=-1;i=edgeList.get(i).next){Edge edge = edgeList.get(i);if(!hadVisted[edge.v]){hadVisted[edge.v] =true;System.out.println("访问节点="+edge.v);queue.add((Integer)edge.v);}}}}

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

5f2aa06f84db051e174290ce3bc84545.png

相关文章:

数据结构图的基础概念

1、图的概念 图(Graph)&#xff1a;是由顶点的有穷非空集合和顶点之间边的集合组成。顶点(Vertex)&#xff1a;图中的数据元素。边(Edge)&#xff1a;顶点之间的逻辑关系,边可以是有向的或无向的&#xff0c;也可以带有权重&#xff08;可以表示距离&#xff0c;花费等&#xf…...

一场九年前的“出发”:奠基多模态,逐鹿大模型

原创&#xff1a;谭婧 全球AI大模型的技术路线&#xff0c;没有多少秘密&#xff0c;就那几条路线&#xff0c;一只手都数得过来。 而举世闻名的GPT-4浑身上下都是秘密。 这两件事并不矛盾。为什么呢&#xff1f; 这就好比&#xff0c;回答“如何制造一台光刻机&#xff1f;”。…...

什么是url跳转漏洞?

什么是url跳转漏洞 简介原因&#xff1a;如何防止 简介 URL跳转漏洞是一种Web应用程序安全问题&#xff0c;指的是在应用程序处理URL跳转时&#xff0c;由于程序员的疏忽或设计不当&#xff0c;攻击者可能通过构造恶意URL来实现对应用程序的攻击。 原因&#xff1a; 跳转条件…...

生物学经典blast比对算法,R语言和Python如何实现?

Blast比对算法原理与实现方式 做生物的同学肯定听说过blast比对这个方法&#xff0c;一般在NCBI等网站上可以在线进行比对&#xff0c;也可以在本地服务器进行比对&#xff0c;那么blast算法究竟是怎么实现对不同序列的比对呢&#xff1f; 本文分享经典blast算法的基础原理&…...

Android 开机动画支持mp4格式视频播放

前 言 Android系统在启动的过程中&#xff0c;最多可以出现三个画面&#xff0c;每一个画面都用来描述一个不同的启动阶段。无论是哪一个画面&#xff0c;它们都是在一个称为帧缓冲区&#xff08;frame buffer&#xff0c;简称fb&#xff09;的硬件设备上进行渲染的。 自定义…...

软考A计划-试题模拟含答案解析-卷十

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…...

Kafka入门(安装和SpringBoot整合)

文章目录 一、Docker安装Kafka1. 创建网络2. 安装zookeeper3. 安装Kafka 二、Kafka介绍1. Kafka简介 三、SpringBoot整合Kafka1. 引入pom依赖2. application.propertise配置3. Hello Kafka(Producer)4. Consumer Kafka5. 带回调的生产者6. 自定义分区器7. kafka事务提交8. 指定…...

gitLab相关命令

gitLab相关命令 1) 远程仓库相关命令 git clone 远程仓库地址 #检出仓库git remote -v #查看远程仓库git remote add [name][url] #添加远程仓库&#xff0c;git remote add origin 远程仓库地址git remote rm [name] #删除远程仓库&#xff0c;git remote rm origingit remo…...

一些查看日志时的常用命令

文章目录 1、grep -r 搜索内容 *2、l * 关键字 *3、tail -f 文件名4、tail -n X 文件名5、cat 文件名 | grep "关键字" -C X同理可得&#xff0c;-A同理可得&#xff0c;-B 一些查看日志时的常用命令 1、grep -r 搜索内容 * 作用&#xff1a;在一堆文件里&#xff0…...

Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

执行环境有全局执行环境和函数执行环境之分&#xff0c;每次进入一个新执行环境&#xff0c;都会创建一个搜索变量和函数的作用域链。函数的局部环境不仅有权访问函数作用于中的变量&#xff0c;而且可以访问其外部环境&#xff0c;直到全局环境。全局执行环境只能访问全局执行…...

CRDT协同算法

CRDT的英文全称是Conflict-free Replicated Data Type&#xff0c;最初是由协同文本编辑和移动计算而发展的&#xff0c;现在还被用作在线聊天系统、音频分发平台等等。当前CRDT算法在富文本编辑器领域的协同依旧是典型的场景&#xff0c;常用于作为实现文档协同的底层算法&…...

近代中国的三次思想文化运动

1、戊戌变法中维新派顽固派论战 第一次思想解放潮流是1898年维新派与顽固势力的论战。论战的内容有&#xff1a;要不要变法&#xff0c;要不要兴民权、实行君主立宪&#xff0c;要不要提倡西学、改变教育制度。此次论争是资本主义思想同封建主义思想的正面交锋&#xff0c;此后…...

《地铁上的面试题》--目录

第一部分&#xff1a;基础 数据结构与算法 1.1 数组和链表 1.2 栈和队列 1.3 树和图 1.4 排序和搜索算法 1.5 动态规划和贪心算法 操作系统 2.1 进程与线程 2.2 内存管理 2.3 文件系统 2.4 进程同步与通信 2.5 虚拟化和容器化技术 计算机网络 3.1 TCP/IP协议 3.2 HTTP和HTTPS…...

在VIVADO下烧写ZC706板载FLASH的操作步骤

1&#xff0c;原理图分析 首先看原理图&#xff0c;我们兼容ZC706的板子有两片 FLASH&#xff0c;型号是S25FL128A,连接方式如下&#xff1a; 可以看到两片是分别接在了XC7Z045芯片的引脚上&#xff0c;是互不相干的并联方式&#xff0c;每个FLASH芯片支持X4模式&#xff0c;也…...

第二期:链表经典例题(两数相加,删除链表倒数第N个节点,合并两个有序列表)

每道题后都有解析帮助你分析做题&#xff0c;答案在最下面&#xff0c;关注博主每天持续更新。 PS&#xff1a;每道题解题方法不唯一&#xff0c;欢迎讨论&#xff01; 1.两数相加 题目描述 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式…...

ESP32设备驱动-SHT35湿度传感器驱动

SHT35湿度传感器驱动 1、SHT35介绍 SHT35 数字温湿度传感器基于 Sensirion SHT35 传感器 IC。 得益于Sensirion的CMOSens技术,高度集成的电容式湿度传感元件和带隙温度传感元件,SHT35具有高可靠性和长期稳定性,功耗低,响应速度快,抗干扰能力强。 传感器支持IIC通信,兼容…...

如何快速判断GitLab 是否出现 OOM

查看系统日志&#xff1a; 使用 dmesg 命令来查看系统日志&#xff0c;搜索 Out of memory 关键字&#xff1a; sudo dmesg | grep -i "out of memory"如果输出结果中包含 Out of memory 或 oom-killer 等关键字&#xff0c;则表示系统出现了 OOM。 查看 GitLab 日…...

Word查找和替换通配符(完全版)

Word查找栏代码通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# 任意数字&#xff08;单个&#xff09; [0-9] 3 任意英文字母 ^$ 任意英文字母 [a…...

Linux下socketpair系统API调用使用说明

目录 1.socketpair函数说明 2.socketpair使用举例 在阅读nginx源码时&#xff0c;发现其调用socketpair来实现master和worker进程之间进行数据交互。其代码如下&#xff1a; 思考&#xff1a;master和worker进程是父子关系&#xff0c;有亲属关系的进程通过pipe/pipe2&#x…...

【Netty】Future 源码分析(十六)

文章目录 前言一、JDK 的 Future 接口二、Netty 的 Future 接口三、ChannelFuture 接口总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概述&#xff08;三&#xff09;Netty Channel…...

5月《中国数据库行业分析报告》正式发布,首发时序、实时数据库两大【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…...

【计算机视觉 | 目标检测】术语理解6:ViT 变种( ViT-H、ViT-L ViT-B)、bbox(边界框)、边界框的绘制(含源代码)

文章目录 一、ViT & ViT变种1.1 ViT的介绍1.2 ViT 的变种 二、bbox&#xff08;边界框&#xff09;三、边界框的绘制 一、ViT & ViT变种 1.1 ViT的介绍 ViT&#xff0c;全称为Vision Transformer&#xff0c;是一种基于Transformer架构的视觉处理模型。传统的计算机视…...

为kong网关添加限流插件

限流用于控制发送到上游服务的请求速率。 它可用于防止 DoS 攻击、限制网络抓取和其他形式的过度使用。 如果没有速率限制&#xff0c;客户可以无限制地访问您的上游服务&#xff0c;这可能会对可用性产生负面影响。 一、全局范围内的限流 1、启用限流 [rootmin ~]# curl -i…...

Python接口自动化—接口测试用例和接口测试报告模板

简介 当今社会在测试领域&#xff0c;接口测试已经越来越多的被提及&#xff0c;被重视&#xff0c;而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试&#xff0c;很多测试人员在接触到接口测试的时候&#xff0c;也许对测试执行还可以比较顺利的上…...

C++无锁队列

C无锁队列是一种多线程编程技术&#xff0c;它可以在不使用锁的情况下实现线程安全的队列。它可以提高多线程程序的性能。 无锁队列的主要思想是让多个线程同时访问队列&#xff0c;而不需要使用锁来保护共享资源。这可以避免锁竞争和死锁等问题&#xff0c;从而提高程序的效率…...

MySQL 5.7 修改账号密码

MySQL 5.7 修改账号密码 1、概述2、更改密码2.1、寻找命令2.2、补充 3、总结 1、概述 大家好&#xff0c;我是欧阳方超。 MySQL数据库安装后设置的密码太简单了&#xff0c; 近期安全检查&#xff0c;这种弱密码全部得修改&#xff0c;好吧那就开始改吧 2、更改密码 2.1、寻…...

ARM实验6-基于中断的按键处理程序实验

一、实验名称:基于中断的按键处理程序实验 二、实验目的: 1.掌握ARM处理器的中断处理过程。 2.掌握ARM处理器中断服务程序的编写方法。 3.通过该编程实验,进一步巩固和强化学生ARM汇编编程的能,ARM应用程序框架,培养学生实际应用的能力。 三、实验内容: 按下面电路图,…...

安全认证:

1. 认证概述 为什么要有认证&#xff1f; 防止非法路由器接入企业内网的ospf路由器&#xff0c;保护内网安全 2. 认证方式 认证方式分为接口认证和区域认证&#xff0c;接口认证和区域认证没有本质的区别&#xff0c;接口认证是当区域内链路过多的情况下&#xff0c;接口认证…...

C++11新特性:decltype类型推导

上一节所讲的 auto&#xff0c;用于通过一个表达式在编译时确定待定义的变量类型&#xff0c;auto 所修饰的变量必须被初始化&#xff0c;编译器需要通过初始化来确定 auto 所代表的类型&#xff0c;即必须要定义变量。若仅希望得到类型&#xff0c;而不需要(或不能)定义变量的…...

linux下DD 命令常用操作 —— 筑梦之路

DD命令介绍 dd命令是LINUX下的一个命令行工具&#xff0c;用于数据转换和处理。dd代表“数据复制”&#xff0c;它可以从一个设备或文件中读取数据&#xff0c;然后将数据写入到另一个设备或文件中。dd命令可以用于多种用途&#xff0c;包括以下几个方面&#xff1a; 磁盘备份…...