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 微信小程序实时获取定位信息,小程序打开即可持续获取定…

sql查询当前值到最大值中间的数据

方法一 select * from cmp where id >1 and id < max(id)很明显这样做是错的 会报错 invalid use of group function 原因是 max是聚合函数&#xff0c; where条件中不能使用聚合函数 为什么呢 这是一个很有意思的问题&#xff0c;仔细地想一下其实很有道理。我们知道…

Python web实战之Django URL路由详解

概要 技术栈&#xff1a;Python、Django、Web开发、URL路由 Django是一种流行的Web应用程序框架&#xff0c;它采用了与其他主流框架类似的URL路由机制。URL路由是指将传入的URL请求映射到相应的视图函数或处理程序的过程。 什么是URL路由&#xff1f; URL路由是Web开发中非常…

【如何使用cv::erode()函数对图像进行腐蚀操作】

文章目录 `cv::erode()`函数主要用途`cv::erode()`函数的参数卷积核cv::erode()函数主要用途 cv::erode()函数主要用于进行图像的腐蚀操作。这是一种图像处理技术,通常用于消除图像中的噪声、分离两个连接在一起的物体、或者使物体的边界变得更加明显。 腐蚀操作的基本思想是…

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;作用…

用栈实现队列(JS)

用栈实现队列 题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int…

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

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

.net core 中间件

先说一下 管道 这个概念&#xff1a; 在ASP.NET Core中&#xff0c;管道&#xff08;Pipeline&#xff09;是一个由多个中间件组成的处理请求和生成响应的机制。请求从第一个中间件开始&#xff0c;经过一系列中间件的处理&#xff0c;然后生成最终的响应。 每个中间件都会处…

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;在原始的…

Tailwind css优于Bootstrap 7个原因

在某些情况下&#xff0c;Tailwind css 比 Bootstrap 更好&#xff0c;因为它是一个低级 CSS 框架&#xff0c;可让您根据需要构建自己的自定义组件。如果使用得当&#xff0c;它非常注重性能&#xff0c;可以显着减少 CSS 负载并确保更快的渲染。如果 Web 性能和自定义是您的首…

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

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

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

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

HTML <section> 标签

实例 文档中的区段&#xff0c;解释了 PRC&#xff1a; <section><h1>PRC</h1><p>The Peoples Republic of China was born in 1949...</p> </section>定义和用法 <section> 标签定义文档中的节&#xff08;section、区段&#x…

【枚举+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/…

GitHub的基本使用教程

GitHub是一个基于web的版本控制和协作平台。它允许开发人员将他们的代码存储库存储在云中&#xff0c;并与其他人一起进行工作。GitHub还提供了各种工具和功能来帮助开发人员管理和组织他们的代码项目&#xff0c;包括拉出请求、问题跟踪、代码评论等等。此外&#xff0c;它托管…