数据结构图的基础概念

news2024/11/26 0:54:31

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->2
        Edge 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.coloradmin.cn/o/587590.html

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

相关文章

GaussDB云数据库SQL应用系列-视图管理

一、前言 GaussDB是一款基于云计算技术的高性能关系型数据库&#xff0c;支持多种数据模型和分布式架构。在GaussDB中&#xff0c;视图管理是非常重要的一项功能&#xff0c;它可以帮助用户更方便地管理和查询数据。 数据库视图管理是指对数据库中的视图进行创建、修改、删除…

美债危机现曙光,比特币再破2万8

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在小号“刘教链Pro”发表了一篇《常常自律&#xff0c;偶尔放纵》&#xff0c;谈了一下关于意志力和自制力的非同寻常的科学研究结论&#xff0c;及其对投资方法的启迪&#xff0c;欢迎关注“刘教链Pro”并阅读。 * *…

AI专业教您保姆级在暗影精灵8Windows11上本地部署实现AI绘画:Stable Diffusion(万字教程,多图预警)

目录 一、Stable Diffusion介绍 二、Stable Diffusion环境搭建 1.Anaconda下载与安装 2.Pycharm&#xff08;IDE&#xff09;下载与安装 3.CUDA、CuDNN下载与安装 三、Stable Diffusion的本地部署 1.克隆项目到本地 2.初始化打开项目 3.安装环境所需库 4.运行代码…

《逆袭进大厂》之C++篇49问49答

它是在 github 上的 clone 下来的仓库笔记 自己看书理解到的知识点 网上相关问题的博客总结这几大基础上慢慢总结形成的&#xff0c;并不仅仅只是简单的收集整理&#xff0c;没有加入自己思考的笔记没有灵魂。 在接下来的十篇文章里我会陆陆续续将自己的秋招笔记整理出来&…

家政服务预约APP的系统设计与实现

摘 要&#xff1a;针对家政行业蓬勃发展&#xff0c;老套的家政服务方式已经跟不上互联网时代的步伐这个问题。基于Android移动平台的分析和设计过程、C/S模式、Eclipse平台&#xff0c;采用Java语言进行开发设计&#xff0c;设计了基于MVC架构的实现方案。安卓客户端与服务器…

solr教程

一&#xff1a;安装配置 下载完成之后&#xff0c;解压solr文件&#xff0c;解压tomcat 1.1 在tomcat安装solr,并且建立solrCore 把solr5.5目录下的server/solr-webapp/webapp 重命名为solr,并且放置到tomcat/webapp的目录下。 打开tomcat/webapp/solr/WEB-INF/web.xml新建…

【入门必看,MySQL从0到1系列- 数据库保姆级图解教程:轻松掌握数据库管理技能】+福利网盘分享MySQL从0到1资料+课程教程+视频+源码

​​​​​​​ 福利&#xff1a;最新MySQL从0到1资料课程教程视频源码网盘 文末有分享哦 前言 MySQL 是全球最流行的用于管理关系数据库的开源数据库软件。除了具有强大的功能外&#xff0c;它还比 Microsoft SQL Server 和 Oracle 数据库快速、可扩展且更易于使用。因此&am…

【分布族谱】卡方分布和F分布之间的关系

文章目录 正态分布和卡方分布F分布 正态分布和卡方分布 正态分布&#xff0c;最早由棣莫弗在二项分布的渐近公式中得到&#xff0c;而真正奠定其地位的&#xff0c;应是高斯对测量误差的研究&#xff0c;故而又称Gauss分布。。测量是人类定量认识自然界的基础&#xff0c;测量…

项目经理提高绩效的10个目标

作者 | Fred Wilson 一、项目经理的目的和目标是什么&#xff1f; 项目经理是任何团队的重要成员。他们孜孜不倦地工作&#xff0c;以确保项目按时、在预算范围内完成&#xff0c;并达到尽可能高的标准。 然而&#xff0c;有一些目标可以帮助提高项目经理管理团队和组织工作流…

Python编程快速入门

Python编程环境设置 Python是一种解释性语言&#xff0c;它使用解释器来解释和执行代码&#xff0c;这对用户来说省去了C或C之类语言的编译步骤&#xff0c;直接从源代码即可运行&#xff0c;因此更容易编写和调试。工欲善其事&#xff0c;必先利其器。在学习Python编程之前&a…

ThreadLocal精讲

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

并行编程解决什么问题?

多线程爬虫是指通过多个线程并发地请求网页和解析响应&#xff0c;以提高爬虫的效率和速度。在 Python 中可以使用 threading、Queue 和 requests 等模块来实现。 并行编程是一种利用多个处理器/内核/线程来同时执行代码的编程方式。它可以解决以下几个问题&#xff1a; 提升程…

python卸载和安装

python卸载 进入电脑控制面板&#xff0c;点击卸载程序 搜索python,如果之前是安装成功的并且没用安装其它相关软件&#xff0c;应该会出现下图所示的两个&#xff0c;分别点击卸载 等待其卸载完毕 卸载结束 python下载 进入官网鼠标放在downloads下出现选项框后选择对应型号…

静态链接库顺序问题

前言 最近遇到了一个非常奇怪的问题&#xff0c;编译时竟因为链接库的顺序不同&#xff0c;就有完全不同的结果。代码非常简单如下所示&#xff1a; #include "muduo/net/EventLoop.h"int main() {muduo::net::EventLoop loop1;muduo::net::EventLoop loop2;return…

Tomcat之多JAVA环境JVM版本查看及使用优先级

一、前言 业务系统包含PC端和移动端&#xff0c;移动端为微信小程序。在小程序客户端发送消息未得到回应&#xff0c;查询系统后台日志发现报错日志。JDK或者JRE中自带的“local_policy.jar ”和“US_export_policy.jar”是支持128位密钥的加密算法&#xff0c;而当我们要使用2…

Linux开发工具vim篇

文章目录 &#x1f447;0. 前言&#x1f449;1.yum软件包管理器&#x1f44f;1.1 yum三板斧&#x1f44c;查看&#x1f44c;安装&#x1f44c;卸载 &#x1f44f;1.2 拓展yum源 &#x1f44d;2. vim编辑器&#x1f90f;2.1 vim基本概念&#x1f90f;2.2 vim基本操作&#x1f90…

电路仿真软件LTspice 使用教程

一、LTspice 特点 1、免费 2、电源快速仿真 3、涵盖大量ADI产品模型 二、获取方式 LTspice信息中心 | 亚德诺半导体 如下图所示&#xff0c;根据操作系统&#xff0c;下载对应的安装包安装即可。 软件打开界面如图&#xff1a; 三、运行演示电路 一、官网下载 LTspice演…

一文读懂kubernetes部署:网关部署

部署网关 如您需要创建SSL(HTTPS)站点请先参考SSL证书的创建创建好secret 修改Ingress配置域名 首先我们要先根据域名情况更改ingress配置情况&#xff1a; 非SSL站点 vi/opt/kubernetes/gateway/ingress.yaml SSL站点 创建secret kubectl-nns-javashopcreatesecrettlsxxx-se…

Caffeine本地缓存

1、Caffine简介 简单说&#xff0c;Caffine 是一款高性能的本地缓存组件 由下面三幅图可见&#xff1a;不管在并发读、并发写还是并发读写的场景下&#xff0c;Caffeine 的性能都大幅领先于其他本地开源缓存组件 2、常见的缓存淘汰算法 2.1、FIFO 它是优先淘汰掉最先缓存的数据…