C++数据结构:图结构入门

news2025/1/9 5:25:01

C++数据结构

线性顺序表(数组)
线性顺序表(链表)
Python风格双向链表的实现
散列表简单实现(hash表)
栈和队列的应用
二叉树之一(数组存储)
二叉树之二(二叉搜索树)
二叉树之三(二叉搜索树扩展)
图结构入门


图结构入门

  • C++数据结构
  • 前言
  • 一、图是什么?
  • 二、图的存储(二维数组)
  • 三、图的存储(邻接链表)
  • 总结


前言

前面系列文章介绍了线性结构和树形结构,线性结构的前驱与后续非常清晰,很明确的一对一的关系。树形结构是层次分明的结构,同时树形结构的父节点可以有一个或多个(二叉树为两个)子节点,叶子节点没有子节点,这是一种一对多的关系。而图结构更加复杂,是多对多的关系,这种结构在现实生活中应用很广泛,比如公交线路图,计算机的网络结构等等。


一、图是什么?

我们还是先用数学来解释一下,图可以认为是点和边的集合。设存在集合V(n>0,n表示顶点的数量)、集合E(表示点与点之间的关系),那么图就是G={V, E}。如下图左,点与点之间的关系没有方向,我们称之为无向图。如下图右,点与点之间是有方向的,表示只能从箭头方向到达另一个点,这种称为有向图。
在这里插入图片描述

  • 图也有度的概念,度表示一个点连接了几条边。
  • 路径,表示二个点之间有连接,如上两图中1点和2点之间都有直接连接线,称之为存在直接路径,而1和5之间也都可以到达,它们之间也存在路径。因为右图是有方向的,右图的2到1之间在规则内无法从2到达1,则说明右图不存在从2到1的路径。
  • 在无向图中,如果所有点之间都存在路径,我们称之为连通图。如上图左就是连通图。
  • 特别的在有向图中,如果所有点之间都存在路径,称之为强连通图。上图右不是强连通图。
  • 如果图中只有部分点之间是连通的,则连通的这部分称为连通子图。可以表示为G1={V1, E1 } ,G1⊆G

二、图的存储(二维数组)

树形结构有数组和链表的存储方式,图也是一样的。用数组的方式存储,往往采用二维数组,以数组下标表示二个点,以值0表示不存路径,以1表示存在路径。如上左图可以表示为:S=

{ {0,1,1,0,1}       //代表点1与各点的关系
, {1,0,0,0,1}       //代表点2与各点的关系,下同
, {1,0,0,1,1}
, {0,0,1,0,1}
, {1,1,1,1,0} }
  • 如上,S[i][j] 给示了二个点间的关系。i、j 之间是否存在直接路径就用0、1表示。
  • 上面的点1和点1本身之间标注了0,如果标注1,表示这里存在回环,或称环、回路。
  • 在抽像表示中,点和点之间的边往往存在不同的权重,比如用于表示路网时,路的距离是不同的,那么我们可以把存在直接路径的边记为权重值,用于表示路网中不同路的距离。也就是不用1表示它们之间存在直接路径,而直接标注路径的距离。

好了,描述得这么清晰,至于写一个 class 来对这个数组进行增、删、改、查就太没必要了,以后用到的时候再写。

三、图的存储(邻接链表)

从上面的数组存储中,我们可以看出,这个存储方式和二叉树的数组存储方式一样存在问题。对于很多点,且点之间联系并不紧密的情况太浪费空间。比如我们要表示全国14亿人口之间的亲戚关系,那这个14亿行,14亿列的数组中13.9999…亿都是0。虽然现在内存不值钱,也不能这么整是吧。

所以我们又想到链表了,我们用一个数组存储所有的点。以数组的下标表示节点号,存储链表的头节点指针。

如果是加权图,我们就要为顶点单独设计一个节点,以便增加权重、链表指针等存储。如果是有向图存储也是一样的,只是没有反方向的边。要根据实际灵活运用了。

在这里插入图片描述


总结

图的基本结构并不复杂,构建起来不比二叉树难,要是有人看,我继续写这个系列文章后续的算法部分肯定会有图相关的内容。

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

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

相关文章

驱动开发:内核PE结构VA与FOA转换

本章将继续探索内核中解析PE文件的相关内容,PE文件中FOA与VA,RVA之间的转换也是很重要的,所谓的FOA是文件中的地址,VA则是内存装入后的虚拟地址,RVA是内存基址与当前地址的相对偏移,本章还是需要用到《驱动开发&#x…

第二十篇、基于Arduino uno,获取MFRC-522 RFID射频IC卡模块的信息,并进行识别——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,"卡号"对应的是IC卡的卡号,"1号已进入"表示识别到正确的卡,也就是之前录入的卡号,因此可以应用到门禁。如果是你想要的,可以接着往下看…

OLED和LCD对比

OLED和LCD对比 今天等离子已不复存在,OLED 出现了新的竞争者。在本概述中,我们将了解这两种技术之间的差异、优缺点等。 我们将从简短介绍每种显示技术的工作原理开始。我们将使用术语“面板”,因为显示技术是功能性电视屏幕的一个组成部分…

(字符串 ) 151. 反转字符串中的单词 ——【Leetcode每日一题】

❓151. 反转字符串中的单词 难度:中等 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&…

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

源自网络收集,仅供参考 实验三收集到两份完整报告,这是其一,另一份见本专栏下一篇文章。 实验题目 《面向对象程序设计》 实验三 实验题目:子窗口与控件的基本用法、资源的使用 整体目的:理解、窗口之间的消息传送…

DAY08_JavaScrip

目录 1 JavaScript1.1 JavaScript简介1.2 JavaScript引入方式1.2.1 内联脚本1.2.2 内部脚本1.2.3 外部脚本 1.3 JavaScript基础语法1.3.1 书写语法1.3.2 输出语句1.3.3 变量1.3.4 数据类型1.3.5 运算符1.3.5.1 \和区别1.3.5.2 类型转换 1.3.6 流程控制语句1.3.6.1 if 语句1.3.6…

常见设计模式

单例模式 单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例,优点:不会频繁地创建和销毁对象,浪费系统资源。缺点是没有抽象层,难以扩展。 单例模式的常见写法: 饿汉式单例模式的写法&…

免安装版MySQL数据库的安装和卸载

说明:MySQL早些版本有分安装版和免安装版,可在官网(https://dev.mysql.com/downloads/mysql/)下载,推荐使用最新版本,是免安装版的,下载完配置一下就可以用。 推荐使用最新版本 安装 我这里以…

第3章“程序的机器级表示”:过程

文章目录 3.7 过程3.7.1 栈帧3.7.2 转移控制3.7.3 寄存器使用惯例3.7.4 过程示例3.7.5 递归过程 3.7 过程 一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分…

金融人不能错过的中国人民大学与加拿大女王大学金融硕士,你不能不知道

金融行业是一个发展飞速的行业,越来越多的优秀人士的涌入,让本就卷起来的金融行业变得异常拥挤,怎么办,想留有一席之地只能不断的提升与攀登,金融人不能错过的中国人民大学与加拿大女王大学金融硕士,你不能…

架构EA演进

架构演进 目录概述需求: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve den…

spring cloud搭建(service)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【C++】海量数据处理面试题(位图和布隆过滤器)

都是大厂面试题哦~ 文章目录 一.位图面试题 1.给定100亿个整数,设计算法找到只出现一次的整数 2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 3.1个文件有100亿个int,1G内…

等价类,边界值,场景法的使用方法和运用场景

等价类: 在很多情况下,很多人想到的测试方法是穷举测试,穷举测试是最全面的测试,但是数据量很大的情况下不太现实,测试效率太低,后来为了减少测试人员的工作量和提高测试的效率和以达到最好的测试质量&…

启明星辰集团CEO严望佳:与AI共生,共建以人为本的数字善治生态体系

近日,2023中国国际大数据产业博览会在贵阳成功召开。启明星辰集团董事长兼首席执行官严望佳应邀出席大会“数据安全产业高质量发展”高端对话,发表“主动应对ChatGPT技术冲击,加强数据安全风险防控”主题演讲,同与会人士共探数据安…

32.有序序列插入一个整数(刷题)

描述 有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。 输入描述: 第一行输入一个整数N(0≤N≤50)。 第二行输入N个升序排列的整数,输入用空格分隔的N个…

2023年前端面试题汇总-浏览器原理

1. 浏览器安全 1.1. 什么是 XSS 攻击? 1.1. 1. 概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。 XSS 的本质是因为网站没有对…

企业要从哪些方面着手进行数据安全治理?

什么是数据安全治理? 数据安全治理是指组织基于业务发展与合规要求,制定全面且系统的数据安全策略、流程与技术措施,对数据生命周期中的安全风险进行管控与优化的一系列管理活动。它需要从组织层面建立数据安全管理框架,保证敏感数…

2023-6-2-DIS研究

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

Java 列表导出

一、具体实现 import java.net.URLEncoder; import com.alibaba.excel.EasyExcel;List<实体> targets xxx; response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); String fileName URLEncoder.encode(&…