当前位置: 首页 > 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

http://www.lryc.cn/news/90430.html

相关文章:

  • 一场九年前的“出发”:奠基多模态,逐鹿大模型
  • 什么是url跳转漏洞?
  • 生物学经典blast比对算法,R语言和Python如何实现?
  • Android 开机动画支持mp4格式视频播放
  • 软考A计划-试题模拟含答案解析-卷十
  • Kafka入门(安装和SpringBoot整合)
  • gitLab相关命令
  • 一些查看日志时的常用命令
  • Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收
  • CRDT协同算法
  • 近代中国的三次思想文化运动
  • 《地铁上的面试题》--目录
  • 在VIVADO下烧写ZC706板载FLASH的操作步骤
  • 第二期:链表经典例题(两数相加,删除链表倒数第N个节点,合并两个有序列表)
  • ESP32设备驱动-SHT35湿度传感器驱动
  • 如何快速判断GitLab 是否出现 OOM
  • Word查找和替换通配符(完全版)
  • Linux下socketpair系统API调用使用说明
  • 【Netty】Future 源码分析(十六)
  • 5月《中国数据库行业分析报告》正式发布,首发时序、实时数据库两大【全球产业图谱】
  • 【计算机视觉 | 目标检测】术语理解6:ViT 变种( ViT-H、ViT-L ViT-B)、bbox(边界框)、边界框的绘制(含源代码)
  • 为kong网关添加限流插件
  • Python接口自动化—接口测试用例和接口测试报告模板
  • C++无锁队列
  • MySQL 5.7 修改账号密码
  • ARM实验6-基于中断的按键处理程序实验
  • 安全认证:
  • C++11新特性:decltype类型推导
  • linux下DD 命令常用操作 —— 筑梦之路
  • android 12.0状态栏高度为0时,系统全局手势失效的解决方案