数据结构_study(六)

news2024/11/15 20:28:55

顶点的有穷非空集合和顶点之间边的集合

G(V,E),G:图,V:顶点集合,E:边的集合

顶点:图中的数据元素,有穷,非空
:顶点之间的逻辑关系,边集合可以是空的
多对多:任意两个顶点之间都有可能有关系

无向边:顶点之间的边没有方向,无序偶对表示(vi,vj)
无向图:图中任意两个顶点之间的边都是无向边
无向完全图:任意两个顶点之间都存在边,n个顶点,n*(n-1)/2条边

有向边(弧):顶点之间的边有方向,有序偶对表示<vi,vj>
弧尾:vi弧头:vj,vi->vj不可逆序
有向图:任意两个顶点之间的边都是有向边
有向完全图:任意两个顶点之间都存在方向互为相反的弧,n个顶点,n*(n-1)条边

简单图:不存在顶点到其自身的边,同一条边不重复出现

稀疏图:很少条边或弧的图
稠密图

:图的边或弧相关的数
:带权图

子图:假设有两个图 G=(V,{E})和 G’=(V’,{E’}),如果 V’是V真子集 且 E’是E的真子集,则称 G’为G的子图(Subgraph)在这里插入图片描述

顶点和边的关系

1、 无向图:
邻接点:两点相连组成的边在图中,两点互为邻接点
边(v,v’)依附于顶点v,v’
边(v,v’)与顶点v,v’相关联

顶点的度:和顶点关联的边的数目,TD(v)
图的边数=各顶点度数之和/2

2、有向图:
<v,v’>属于图时,v邻接到v’,v’邻接自v
弧<v,v’>和顶点v,v’相关联

出度:以顶点为尾的弧的数目,OD(v)
入度:以顶点为头的弧的数目,ID(v)
顶点的度:TD(v)=ID(v)+OD(v)
图的边数=入度和=出度和

顶点v到顶点v’的路径:顶点序列,经过的每条边都是图内的边,不唯一
有向图路径也有方向
路径长度:路径上的边数或弧数
简单路径:路径中顶点不重复出现

在这里插入图片描述

回路(环):第一个顶点到最后一个相同顶点的路径
简单回路(环):除了第一个和最后一个顶点,其余顶点不重复
在这里插入图片描述

连通:顶点间有路径
连通图:任意顶点间都有路径
连通分量:连通子图,含有极大顶点数,包含依附子图顶点的所有边

强连通图:有向连通图,每个顶点间都存在路径
强连通分量:极大连通子图
在这里插入图片描述
连通图的生成树:
生成树:极小连通子图,含有图中全部的n个顶点,连接n个顶点的n-1条边
有向树:有向图的一个顶点入度为0(根节点),其余顶点入度为1
一个有向图的生成森林:若干棵有向树,含有图中全部顶点,只有构成树的弧
在这里插入图片描述

抽象数据定义

ADT 图(Graph)
Data
顶点的有穷非空集合和边的集合。
Operation
CreateGraph(*G, V,VR); // 按照顶点集V和边弧集VR的定义构造图G。
DestroyGraph(*G); // 图G存在则销毁。
LocateVex(G, u); // 若图G中存在顶点u,则返回图中的位置。
GetVex(G, v); // 返回图G中顶点v的值。
PutVex(G, v, value); // 将图G中顶点v赋值value。
FirstAdjVex(G, *v); // 返回顶点v的一个邻接顶点,若顶点在G中无邻接顶点返回空
NextAdjVex(G, v, *w); // 返回顶点v相对于顶点w的下一个邻接顶点,若w是v的最后 一个邻接点则返回“空
InsertVex(*G, v); // 在图G中增添新顶点v。
DeleteVex(*G, v); // 删除图G中顶点v及其相关的弧。
InsertArc(*G, v, w); // 在图G中增添弧<v, W>,若G是无向图,还需要增添对称弧<w, v>。
DeleteArc(*G, v, w); // 在图G中删除弧<v, w>,若G是无向图,则还删除对称弧 o
DFSTraverse(G); // 对图G中进行深度优先遍历,在遍历过程对每个顶点调用。
HFSTraverse(G); // 对图G中进行广度优先遍历,在遍历过程对每个顶点调用。
endADT

存储结构

任意2顶点都可能存在联系,物理位置不可用
度数相差很大时,多重链表不可用

邻接矩阵

一维数组存n个顶点
邻接矩阵:n*n的二维数组存边/弧

对称矩阵:n阶矩阵中a[i][j]=a[j][i]

信息
判定两顶点之间有无边,a[i][j]==1?
顶点的度,某行1的个数
某顶点的所有邻接点,某行1的列下标

适合稠密图,读存数据多,结构修改少

array[i][j]=1;顶点i到顶点j的边存在,
array[i][j]=0;不存在
在这里插入图片描述
网图:边上带有权
array[i][j]=Wij;(顶点i到顶点j的边存在且权值为Wij
array[i][j]=0;(i=j)
array[i][j]=不可能的极限值;(其他情况)
在这里插入图片描述

创建时间复杂度O(n+n2+e),其中矩阵初始化O(n2)
对于边数很少的图浪费空间

邻接表

一维数组存顶点,和单链表头指针
单链表,每个顶点的所有邻接点构成一个线性表,在无向图中顶点vi的边表,在有向图中vi作为弧尾的出边表

逆邻接表:以vi作为弧头的表

信息:
顶点的边表中结点的个数=顶点的度
顶点之间有无边、弧:边表中有无结点
顶点的所有邻接点
有向图的出度、入度在这里插入图片描述
网图,增加weight数据域,存储权值信息

在这里插入图片描述

创建时间复杂度O(n+e)

十字链表

邻接表,有向图,出度入度不可共存

邻接表和逆邻接表结合

顶点表:
data数据
firstin:入边表头指针
firstout:出边表头指针

边表结构
tailvex:弧起点在顶点表的下标
headvex:弧终点在顶点表的下标
headlink:指向终点相同的下一条边
taillink:指向起点相同的下一条边

在这里插入图片描述

邻接多重表

邻接表,无向图删除结点复杂

ivex、jvex:某条边的两个顶点下标
ilink:依附顶点ivex的下一条边
jlink:依附顶点jvex的下一条边
在这里插入图片描述

边集数组

两个一维数组,存储顶点信息,存储边的信息
边数组的数据元素:起点下标begin,终点下标end,权weight
适合对边的操作
在这里插入图片描述

遍历

从图中某一顶点出发访问图中其余所有顶点,且每个顶点只访问一次
访问数组 visited[n],n个顶点,访问过的顶点打上标记,初值0,访问过1

深度优先类似树的前序遍历
广度优先类似树的层序遍历

深度优先搜索DFS

递归+回溯

从图中的某个顶点v出发,访问此结点,从v的未被访问的邻接点出发深度优先遍历,直到所有和v有路径相通的顶点全部被访问
非连通图,一次深度优先后,若图中有顶点未被访问,选图中一个未曾被访问的顶点做起始点

n个顶点,e条边的图
邻接矩阵是二维数组,找邻接点O(n2)
邻接表,找邻接点O(n+e)
在这里插入图片描述

广度优先搜索BFS

结点A入队,A所有的邻接点入队,A出队

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

最小生成树

网:带权值的图
最小成本:n个顶点,n-1条边,连接成连通图,权值的和最小
最小生成树:连通网的最小代价生成树

普里姆Prim算法

假设 N=(P,{E})是连通网,TE是N上最小生成树中边的集合。
算法:
初始状态:U={u0}(u0∈V),TE={}
循环:在所有u∈U,v∈V-U的边(u,v)∈E找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。
此时 TE中必有 n-1条边,则T=(V,{TE})为N的最小生成树。

以某顶点为起点,找顶点上最小权值的边

时间复杂度 O(n2),适合稠密图
在这里插入图片描述
在这里插入图片描述

克鲁斯卡尔Kruskal算法

假设 N=(V,{E})是连通网,
初始状态:只有n个顶点而无边的非连通图 T={V,},图中每个顶点自成一个连通分量。
循环:在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。直至T中所有顶点都在同一连通分量上为止。

图边集内权值最小的边,判断有无环

时间复杂度 O(eloge),适合稀疏图

当(i, j) 加入最小生成树时parent[i] = j
当parent[i] > 0 说明有(i, j) 存在,i=j,直到parent[i]<=0
在这里插入图片描述
在这里插入图片描述

最短路径

最短路径:两顶点之间经过的边权值之和最少的路径
源点:路径上的第一个顶点
终点:路径上的最后一个顶点

迪杰斯特拉Dijkstra算法

某一顶点到其他所有顶点
求出顶点的最短路径,基于已经求出的最短路径基础上,求的更远顶点的最短路径

时间复杂度O(n2)

任意顶点到其他所有顶点的最短路径,对每个顶点做一次Dijkstra,时间复杂度O(n3)
在这里插入图片描述

佛洛依德Floyd算法

所有顶点到所有顶点的最短路径
在这里插入图片描述

有向无环图

拓扑排序

无环有向图

AOV网:有向图+顶点表示活动,的网
顶点表示活动
弧表示活动间的优先关系
不存在回路

重点:优先关系,vi->vj:vi发生之后才可以发生vj

拓扑序列:有向图的顶点序列,序列中vi到vj有一条路径,且在顶点序列中vi在vj前面

拓扑排序:有向图构造拓扑排序的过程
网的全部顶点被输出,不存在环的AOV网
缺少顶点,存在环,不是AOV网

算法
入度为0的顶点全部入栈,栈顶输出,
删除此顶点,删除以此顶点为尾的弧(弧头元素入度-1,入度为0的入栈)
重复直到输出全部,或不存在入度为0的顶点

邻接表
n个顶点e条弧,时间复杂度O(n+e)
O(n)(扫描顶点表加入入度为0)+O(e)(出入栈,入度减一)
在这里插入图片描述
在这里插入图片描述

关键路径

AOE网:带权有向图+边表示活动,的网
顶点表示事件
有向边表示活动
边上的权值表示活动持续时间

源点:没有入边的顶点
终点:没有出边的顶点

AOE网只有一个源点,一个终点

路径长度:路径上各个活动持续的时间和
关键路径:源点到汇点具有最大长度的路径
关键活动:在关键路径上的活动

重点:减少关键路径上关键活动的时间才能减少整个工期

(顶点)最早发生时间
(顶点)最晚发生时间
(弧)最早开工时间
(弧)最玩开工时间

算法
拓扑排序,得出最早发生时间evt,拓扑序列列表stack

当k=0时:etv[k]=0;
当k≠0且< vi,vk >∈ P[k]时: etv[k]=max{etv[i]+len<vi,vk>};在这里插入图片描述

根据evt和stack计算 最晚发生时间:

当k=n-1时:ltv[k]=etv[k];
当k<n-1且<vk,vj >∈ P[k]时: ltv[k]=min{etv[j]+len<vk,vj>};
在这里插入图片描述
活动最早发生时间=起点最早发生时间
活动最晚发生时间=终点最晚发生时间-活动时间
两者相等即为关键活动,关键路径
在这里插入图片描述
时间复杂度O(n+e)

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

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

相关文章

如何编写一个多线程、非阻塞的python代码

一、【写在前面】 最近csdn每天写两篇文章有推广券&#xff0c;趁这个机会写一个python相关的文章吧。 一般我们的任务都可以分为计算密集型任务和IO密集型任务。 python因为全局GIL锁的存在&#xff0c;任何时候只有一个python线程在运行&#xff0c;所以说不能利用多核CPU…

基于人工智能技术开发的一种医疗诊断工具:智慧3D导诊系统源码

概述 智能导诊基于医疗 AI 、自然语言处理技术&#xff0c;覆盖导诊、智能问答、科普宣教等就医服务&#xff1b;智能导诊通过人体图、症状列表等形式进行疾病自测&#xff0c;快速推荐就诊科室、医生推荐。产品可应用于微信线上挂号、互联网医院、区域平台等场景中&#xff0…

【搜索核心技术】经典搜索核心算法:BM25及其变种

随着基于检索增强的生成&#xff08;Retrieval-Augmented Generation—RAG&#xff09;逐渐成为当前大模型落地方案的主流选择&#xff0c;搜索技术在这一过程中扮演着至关重要的角色。然而&#xff0c;仅依赖向量相似性检索往往无法达到理想的效果。因此&#xff0c;为了进一步…

计算机网络之http状态码和https

目录 HTTP协议 TCP/IP协议 TCP/IP的分层管理 各个协议和HTTP之间的关系 了解并区分URI和URL 返回结果的HTTP状态码 2XX 成功 2.1 200 ok 2.2 204 No Content 2.3 206 Partial Content 3xx表示重定向 3.1 301 Moved Permanently 3.2 302 Found 3.3 303 See …

探索全光网技术 | 全光网络技术方案选型建议二 (宿舍场景)

目录 一、场景设计需求二、宿舍场景拓扑三、部署方式四、产品相关规格说明五、方案优势 注&#xff1a;本文章参考资料为&#xff1a;华三官方资料 - “新华三全光网络3.0解决方案&#xff08;教育&#xff09;”与 锐捷官方资料 - “【锐捷】高校极简以太全光3.X方案设计(V1.3…

pinecone向量库的介绍和基本使用(增删改查)

本文来自于【向量库】pinecone向量库的介绍和基本使用&#xff08;增删改查&#xff09; Pinecone是一个实时、高性能的向量数据库&#xff0c;专为大规模向量集的高效索引和检索而设计。它提供亚秒级的查询响应时间&#xff0c;确保用户可以迅速获取所需信息。Pinecone采用高…

SAP与九恒星资金系统集成案例(医药行业)

一、项目环境 江西某药业有限公司是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今&#xff0c;企业经营一直呈现稳健、快速发展的态势集团总销售额超40亿元。 为了帮助企业更好的进行资金流、结算、资金调度和运作管理、风险控制&#xff0c;济民…

计算机毕业设计选题推荐-篮球馆会员信息管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

前端初期知识点回顾

1.跳转&#xff1a;其中target“_blank”意思是跳转会新标签页打开 2.锚点定位&#xff1a;点击文字跳转到对应页面 3&#xff1a;表单 单元格合并 4.input属性变化 前期vue样式 5.画原神&#xff1a; 6.画学生管理系统&#xff1a; 购物车升序降序 累加函数 保留两位小数点 删…

2023年亚太杯A题:果园采摘机器人的图像识别,一二题(题目代码及结果)

问题一&#xff1a;基于附件1中提供的可收获苹果的图像数据集&#xff0c;提取图像特征&#xff0c;建立数学模型&#xff0c;计算每幅图像中的苹果的数量&#xff0c;并绘制附件1中所有苹果的分布直方图。 对于自动采摘机器人&#xff0c;首要的能力就是识别出苹果对象&#…

K3 BOS单据获取制单人工号

新建BOS单据&#xff0c;打印时有时不想在单据上体现制单人姓名&#xff0c;只要打印出工号就行了 新建时&#xff0c;在单据头增加一个“制单人工号”的字段&#xff0c;字段名一定要设置成"FBillerno"&#xff0c; 然后在插件中增加资源中的DLL 效果 套打单据中的…

爬虫:jsonpath模块及腾讯招聘数据获取

目录 jsonpath模块 腾讯招聘数据获取 jsonpath模块 # pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple import jsonpathdata {"store": {"book":[{"category": "reference","author": "Nigel Ree…

电影票竞价系统:揭开神秘代码的面纱

电影票的购买方式也在不断革新。全民邀约电影票竞价系统就是这样一个创新的购票模式。今天&#xff0c;就让我们一起探索这个系统背后的代码秘密&#xff0c;看看竞价购票的代码是如何编写的。 电影票竞价系统的魅力 电影票竞价系统为广大影迷提供了一种全新的购票体验。通过该…

【计算机方向】中科院一区TOP顶刊对比!国人发文友好,“又好又水”!

今天小编带来计算机方向期刊对比&#xff0c;到底那本期刊才是你的“心尖宠”&#xff1f; 速看&#xff01;为你的心上刊打Call&#xff01; 这两本期刊&#xff0c;每个学者主观评价不同。 两本期刊含金量到底如何呢&#xff1f; 今天就跟着小编一起来了解下吧&#xff01;…

FB03 界面新增自定义字段(在业务范围gsber之后)

两个界面都是 一个screen 是1002 一个是1007 两个都要改 代码控制显示 输入 MODULE FRM_MDF_SCREEN OUTPUT.DATA:lmblnr TYPE matdoc-MBLNR.DATA:lmjahr TYPE matdoc-MJAHR.FIELD-SYMBOLS:<FS_MBLNR> TYPE matdoc-MBLNR,<FS_MJAHR> TYPE ANY,<FS_action>…

华为od机试真题:求幸存数之和(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给一个正整数列nums&#xff0c;一个跳数jump&#xff0c;及幸存数量left。运算过程为:从索引为0的位置开始向后跳&#xff0c;中间跳过 J 个数字&#xff0c;命中索引为 J1的数…

private DiscoveryClient discoveryClient 爆红

private DiscoveryClient discoveryClient 爆红 大部分情况是因为导错了包&#xff0c;导成了下面的包 import com.netflix.discovery.DiscoveryClient; 但有个特殊情况导包没有导错&#xff0c;discoveryClient依然爆红 import org.springframework.cloud.client.discovery…

软考系统架构师--第2章 操作系统-2.1 操作系统的类型与结构

目录 第2章 操作系统 2.1 操作系统的类型与结构 2.1.1 操作系统的定义 2.1.2 操作系统分类 第2章 操作系统 本章主要介绍操作系统的基本概念及其形成、发展历史和主要类型&#xff0c;并指出操作系统的 5 大管理功能。掌握操作系统原理的关键在于深入理解“一个观点、两条…

宏定义和内联函数的区别?

在C编程中&#xff0c;宏定义和内联函数都是常用的代码优化方法。它们可以在编译时将代码进行优化&#xff0c;提高程序的执行效率。但是&#xff0c;它们的实现方式和使用方法有所不同。下面将详细介绍宏定义和内联函数的区别。 一、宏定义 宏定义是一种简单的代码替换方式。…

SpringCloud+Vue3一个字段多个存储以及回显

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…