24考研数据结构-图的基本操作

目录

  • 6.6. 图的基本操作
    • 1. Adjacent(G,x,y)边的存在
    • 2. Neighbors(G,x):列出图G中与结点x邻接的边
    • 3. InsertVertex(G,x):在图G中插入顶点x
    • 4. DeleteVertex(G,x):从图G中删除顶点x
    • 5. AddEdge(G,x,y):若无向边(x,y)或有向边<x,y>不存在,则向图G中添加该边。
    • 6. FirstNeighbor(G,x):求图G中顶点的第一个邻接点
    • 7. NextNeighbor(G,x,y):
      • 8. get_edge_value,set
      • 其他操作总结
        • 1. 添加节点(顶点)
        • 2. 删除节点(顶点)
        • 3. 添加边
        • 4. 删除边
      • 图的遍历
        • 深度优先搜索(DFS)
        • 广度优先搜索(BFS)
      • 时间与空间复杂度

6.6. 图的基本操作

无向图
在这里插入图片描述
有向图==(稀疏图也挺方便)==
在这里插入图片描述

1. Adjacent(G,x,y)边的存在

(无向边)<有向边>

  • 思路:
    ①无向图:邻接矩阵,判断aij是否为1,邻接表,i点的邻接表是否有j点;
    ②有向图类似

  • 时间复杂度
    在这里插入图片描述

2. Neighbors(G,x):列出图G中与结点x邻接的边

  • 思路:
    ①无向图:邻接矩阵,罗列出x点的行为1的所有点,邻接表,遍历x的链表的所有结点;
    ②有向图:邻接矩阵,出边遍历行,入边遍历列,邻接表,(出边)遍历x的链表,(入边)遍历所有的结点查看哪个结点值是x。
  • 时间复杂度
    在这里插入图片描述

3. InsertVertex(G,x):在图G中插入顶点x

  • 思路:
    ① 无向图:邻接矩阵,给矩阵增加一个x行增加一个x列;邻接表,给表的最后一行增加x项,不接任何一个结点,指向NULL。
    ② 有向图:类似
  • 时间复杂度
    在这里插入图片描述

4. DeleteVertex(G,x):从图G中删除顶点x

  • 思路:
    ① 无向图:邻接矩阵,将x的所有行列全部清空为-1,在顶点集中x的值表示为-1或false;邻接表,将所有与x有关的信息删除,需要遍历所有的结点
    ② 有向图:邻接矩阵,与无向图类似,邻接表,删出边需要将x的链表都删除,删入边,需要遍历所有的结点。
  • 时间复杂度
    在这里插入图片描述

5. AddEdge(G,x,y):若无向边(x,y)或有向边<x,y>不存在,则向图G中添加该边。

  • 思路:
    ① 无向图,邻接矩阵,将axy的值由0改为1=,邻接表,将x的链表后或前加上结点y==,最好使用头插法
    ② 有向图,类似。
  • 时间复杂度在这里插入图片描述

6. FirstNeighbor(G,x):求图G中顶点的第一个邻接点

  • 思路
    ① 无向图:邻接矩阵,扫描x的一行第一个为1的元素,可能第一个就是也可能到最后一个都没有;邻接表,查看x链表的第一个结点
    ② 有向图:邻接矩阵,找x有关的行列(出边入边),也就是出边入边的第一个邻接点,邻接表,出边寻找简单,但是入边需要遍历所有的边
  • 时间复杂度
    在这里插入图片描述

7. NextNeighbor(G,x,y):

假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
在这里插入图片描述

8. get_edge_value,set

在这里插入图片描述

其他操作总结

图是一种重要的数据结构,用于表示不同对象之间的关系。图由节点(也称为顶点)和边组成,节点表示对象,边表示对象之间的连接关系。图的基础操作包括节点的添加、删除,边的添加、删除,以及图的遍历等。

1. 添加节点(顶点)

向图中添加一个新节点(顶点)。节点的添加是一个简单的操作,只需要将新节点添加到节点集合中即可。

适合处理的数据:图适合处理对象之间具有关系的数据,例如社交网络中的用户和用户之间的关注关系,地图中的城市和城市之间的道路连接等。

时间复杂度:添加节点的时间复杂度为O(1),因为只需在节点集合中添加一个节点。

代码示例:

class Graph:def __init__(self):self.nodes = set()def add_node(self, node):self.nodes.add(node)

2. 删除节点(顶点)

从图中删除一个节点。删除节点时,需要同时删除与该节点相关联的所有边。

适合处理的数据:图适合处理对象之间具有关系的数据,删除节点可能涉及删除一些关联的边,例如社交网络中删除一个用户可能涉及删除其与其他用户的关注关系。

时间复杂度:删除节点的时间复杂度取决于与该节点相关联的边的数量,假设为O(E),其中E为边的数量。

代码示例:

class Graph:def __init__(self):self.nodes = set()self.edges = {}def add_node(self, node):self.nodes.add(node)def remove_node(self, node):if node in self.nodes:self.nodes.remove(node)if node in self.edges:del self.edges[node]for key in self.edges:if node in self.edges[key]:self.edges[key].remove(node)

3. 添加边

向图中添加一条边,将两个节点之间建立连接。边可以是有向的(箭头指向一个方向)或无向的(没有箭头,表示双向连接)。

适合处理的数据:图适合处理对象之间具有关系的数据,添加边可以表示对象之间的连接关系,例如社交网络中用户之间的关注关系。

时间复杂度:添加边的时间复杂度为O(1),因为只需要在边集合中添加一条边。

代码示例:

class Graph:def __init__(self):self.nodes = set()self.edges = {}def add_node(self, node):self.nodes.add(node)def add_edge(self, node1, node2):if node1 not in self.edges:self.edges[node1] = set()self.edges[node1].add(node2)

4. 删除边

从图中删除一条边,断开两个节点之间的连接。

适合处理的数据:图适合处理对象之间具有关系的数据,删除边可以断开对象之间的连接关系,例如社交网络中取消用户之间的关注关系。

时间复杂度:删除边的时间复杂度为O(1),因为只需要在边集合中删除一条边。

代码示例:

class Graph:def __init__(self):self.nodes = set()self.edges = {}def add_node(self, node):self.nodes.add(node)def add_edge(self, node1, node2):if node1 not in self.edges:self.edges[node1] = set()self.edges[node1].add(node2)def remove_edge(self, node1, node2):if node1 in self.edges and node2 in self.edges[node1]:self.edges[node1].remove(node2)

图的遍历

图的遍历是一种查看图中所有节点和边的方法。常见的图的遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索(DFS)

DFS是一种递归的遍历算法,它从图中的某个节点开始,递归地访问该节点的所有邻居节点,然后再递归地访问邻居节点的邻居节点,依此类推。DFS能够遍历图中的所有节点和边,但是可能会陷入死循环,因此需要设置一个访问标记来避免重复访问。

时间复杂度:DFS的时间复杂度取决于图的大小,假设为O(V+E),其中V为节点数量,E为边数量。

代码示例:

class Graph:def __init__(self):self.nodes = set()self.edges = {}def add_node(self, node):self.nodes.add(node)def add_edge(self, node1, node2):if node1 not in self.edges:self.edges[node1] = set()self.edges[node1].add(node2)def dfs(self, node, visited):if node not in visited:visited.add(node)print(node)if node in self.edges:for neighbor in self.edges[node]:self.dfs(neighbor, visited)def depth_first_search(self):visited = set()for node in self.nodes:self.dfs(node, visited)

广度优先搜索(BFS)

BFS是一种使用队列的遍历算法,它从图中的某个节点开始,依次访问该节点的所有邻居节点,然后将邻

居节点入队,再依次访问队列中的节点的邻居节点,依此类推。BFS能够遍历图中的所有节点和边,且不会陷入死循环。

时间复杂度:BFS的时间复杂度取决于图的大小,假设为O(V+E),其中V为节点数量,E为边数量。

代码示例:

from collections import dequeclass Graph:def __init__(self):self.nodes = set()self.edges = {}def add_node(self, node):self.nodes.add(node)def add_edge(self, node1, node2):if node1 not in self.edges:self.edges[node1] = set()self.edges[node1].add(node2)def breadth_first_search(self, start):visited = set()queue = deque([start])while queue:node = queue.popleft()if node not in visited:visited.add(node)print(node)if node in self.edges:queue.extend(self.edges[node])

时间与空间复杂度

  • 添加节点:时间复杂度为O(1),空间复杂度为O(1)。
  • 删除节点:时间复杂度为O(E),空间复杂度为O(1)。
  • 添加边:时间复杂度为O(1),空间复杂度为O(1)。
  • 删除边:时间复杂度为O(1),空间复杂度为O(1)。
  • 图的遍历(DFS和BFS):时间复杂度为O(V+E),空间复杂度为O(V)。

图是一种非常重要的数据结构,在实际应用中有着广泛的应用。通过合理选择数据结构和算法,可以高效地处理图中的数据,实现各种复杂的操作。无论是在社交网络、地图导航还是其他领域,图的基础操作都是构建更高级功能的关键。

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

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

相关文章

智能视觉新时代:探索Intewell-Hyper II在机器视觉芯片检测中的独特魅力

随着科技的不断进步&#xff0c;芯片制造业正在经历前所未有的快速发展。为了确保芯片的品质和可靠性&#xff0c;机械视觉芯片检测技术逐渐成为行业内的重要环节。作为机器视觉领域的重要部分&#xff0c;Intewell操作系统在打造高效、精确的检测方案方面发挥着关键作用。 基…

GraphGT: Machine Learning Datasets for Graph Generation and Transformation

一、文章来源 > Du Y, Wang S, Guo X, et al. Graphgt: Machine learning datasets for graph generation and transformation[C]//Thirty-fifth Conference on Neural Information Processing Systems Datasets and Benchmarks Track (Round 2). 2021.二、概述 1、文章提出…

uniapp 持续获取定位(登录状态下才获取)(不采用定时器)(任意页面都可监听定位改变)

基于上次文章做了优化和改良,保证在登录状态下才获取定位信息 uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)_uniapp小程序定位_前端小胡兔的博客-CSDN博客本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定…

go-zero超强工具goctl的常用命令api,rpc,model及其构建的服务解析

goctl api 详情移步&#xff1a; go-zero的路由机制解析 基于go-zero的api服务刨析并对比与gin的区别 goctl rpc goctl支持多种rpc&#xff0c;较为流行的是google开源的grpc&#xff0c;这里主要介绍goctl rpc protoc的代码生成与使用。 protoc是grpc的命令&#xff0c;作用…

ELK日志分析系统概述及部署

ELK 平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kibana 三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求。 一、ELK概述 1、组件说明 ①ElasticSearch ElasticSearch是基于Lucene&#xff08;一个全文…

Spring Cloud Gateway

一 什么是Spring Cloud Gateway 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 Zuul 来说&#xff0c;Spring Clo…

vue项目实战-脑图编辑管理系统kitymind百度脑图

前言 项目为前端vue项目&#xff0c;把kitymind百度脑图整合到前端vue项目中&#xff0c;显示了脑图的绘制&#xff0c;编辑&#xff0c;到处为json&#xff0c;png&#xff0c;text等格式的功能 文章末尾有相关的代码链接&#xff0c;代码只包含前端项目&#xff0c;在原始的…

一百四十六、Xmanager——Xmanager5连接Xshell7并控制服务器桌面

一、目的 由于kettle安装在Linux上&#xff0c;Xshell启动后需要Xmanager。而Xmanager7版本受限、没有免费版&#xff0c;所以就用Xmanager5去连接Xshell7 二、Xmanager5安装包来源 &#xff08;一&#xff09;注册码 注册码&#xff1a;101210-450789-147200 &#xff08…

车载软件架构 —— 闲聊几句AUTOSAR OS(十)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces 题意&#xff1a; 思路&#xff1a; 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问&#xff0c;都去字典树上dfs 注意到字符集只有3&#xff0c;因此如果发现有不同的字符&#xff0c;去枚举新的字符 Code&#xff1a; #in…

Excel功能总结

1&#xff09;每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如&#xff1a;固定第1~2行&#xff0c;设置成“$1:$2” 2&#xff09;将页面内容打印在一页【缩印】 1.选好需要打印的区域&#xff0c;“页面布…

AOSP开发——APN配置文件路径

Android1~9&#xff0c;APN配置文件路径&#xff1a; vendor/sprd/telephony-res/apn/apns-conf_8.xml Android10~12&#xff0c;APN配置文件路径&#xff1a; /vendor/sprd/telephony-res/apn/apns-conf_8_v2.xml Android13&#xff0c;APN配置文件路径&#xff1a; /vendor/…

Android安卓实战项目(8)---自行车fitting计算软件(源码在文末)

Android安卓实战项目&#xff08;8&#xff09;—自行车fitting计算软件&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 【bilibili演示地址】 https://www.bilibili.com/video/BV1eu4y1B7yA/?share_sourcecopy_web&vd_sourceb2e9b9ed746ac…

0101docker mysql8镜像主从复制-运维-mysql

1 概述 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 Mysql支持一台主库同时向多台从库进行复制&#xff0c;从库同时可以…

ubuntu调整路由顺序

Ubuntu系统跳转路由顺序 1、安装ifmetric sudo apt install ifmetric2、查看路由 route -n3、把Iface下面的eth1调到第一位 sudo ifmetric eth1 0命令中eth1是网卡的名称&#xff0c;更改网卡eth1的跃点数&#xff08;metric值&#xff09;为0&#xff08;数值越小&#xf…

读发布!设计与部署稳定的分布式系统(第2版)笔记29_控制层下

1. 配置服务 1.1. 配置服务本身就是分布式数据库 1.1.1. 像ZooKeeper和etcd这样的配置服务 1.1.2. 受CAP定理和亚光速通信的限制 1.1.3. 可实现容量扩展&#xff0c;但不具备资源可伸缩性 1.1.4. 也会遭受相同的网络创伤 1.2. 信息并不仅仅从服务流向客户端实例&#xff…

mysql统计近7天数据量,,按时间戳分组

可以使用以下 SQL 语句来统计近7天的数据量&#xff0c;并按时间戳分组。如果某一天没有数据&#xff0c;则将其填充为0。 SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp), %Y-%m-%d) AS date,COUNT(*) AS count FROM table_name WHERE timestamp > UNIX_TIMESTAMP(DATE_SUB…

python调用pytorch的clip模型时报错

使用python调用pytorch中的clip模型时报错&#xff1a;AttributeError: partially initialized module ‘clip’ has no attribute ‘load’ (most likely due to a circular import) 目录 现象解决方案一、查看项目中是否有为clip名的文件二、查看clip是否安装成功 现象 clip…

乍得ECTN(BESC)申请流程

根据TCHAD/CHAD乍得法令&#xff0c;自2013年4月1日起&#xff0c;所有运至乍得的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请&#xff0c;将被视为触犯乍得的条例&#xff0c;并在目的地受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称&#xff1b;…

基于Java+SpringBoot+Vue的人事管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…