数据结构补强——图

图基础

图的定义

图G顶点集V边集E组成,记为G = (V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V = {v1,v2,…,vn},则用|V|表示图G中顶点的个数,也称为图G的阶,E = {{u,v} | u∈V,v∈V},用|E|表示图G中边的条数
注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集
数据结构补强——图_第1张图片

无向图、有向图

若E是无向边(简称)的有限集合时,则图G为无向图。边是顶点的无序对,记为(v,w)或(w,v),因为(v,w)=(w,v),其中v、w是顶点。可以说顶点w和顶点v互为邻接点,边(v,w)依附于顶点w和v,或者说边(v,w)和顶点v、w相关联

若E是有向边(也称)的有限集合时,则图G为有向图。弧是顶点的有序对,记为,其中v、w是顶点,v称为弧尾,w称为弧头称为从顶点v到顶点w的弧,也称v邻接到w,或w邻接自v。 !=

简单图、多重图

数据结构补强——图_第2张图片

顶点的度、入度、出度

数据结构补强——图_第3张图片

顶点-顶点的关系描述

数据结构补强——图_第4张图片

连通图、强连通图

数据结构补强——图_第5张图片
连通图最少有n-1条边是因为n个节点两两相连
非连通图最多有的情况是当其他n-1个节点两两相连,而最后一个节点一个都不连

子图

数据结构补强——图_第6张图片
生成子图是拥有原图所有点的子图

连通分量

用于描述无向图
数据结构补强——图_第7张图片

强连通分量

用于描述有向图
数据结构补强——图_第8张图片

生成树

n个顶点有n-1条边,再多就会形成回路
数据结构补强——图_第9张图片

生成森林

数据结构补强——图_第10张图片

边的权、带权图/网

数据结构补强——图_第11张图片

几种特殊形态的图

数据结构补强——图_第12张图片

数据结构补强——图_第13张图片
数据结构补强——图_第14张图片

图的存储结构

  • 邻接矩阵:数组实现的顺序存储,空间复杂度高O(n²),不适合存储稀疏图
  • 邻接表:找有向图的入度不方便,删除顶点、删除边的时间复杂度高
  • 十字链表:存储有向图
  • 邻接多重表:存储无向图

邻接矩阵法

数据结构补强——图_第15张图片
数据结构补强——图_第16张图片

如何求顶点的度、入度、出度

数据结构补强——图_第17张图片
带权图:
数据结构补强——图_第18张图片

性能分析

数据结构补强——图_第19张图片
数据结构补强——图_第20张图片

邻接矩阵的性质

行*列
数据结构补强——图_第21张图片

邻接表

数据结构补强——图_第22张图片
数据结构补强——图_第23张图片
数据结构补强——图_第24张图片
数据结构补强——图_第25张图片

十字链表法

只能用于有向图
数据结构补强——图_第26张图片

性能分析

数据结构补强——图_第27张图片

邻接多重表

只用于存储无向图
数据结构补强——图_第28张图片

总结

数据结构补强——图_第29张图片

图的操作

数据结构补强——图_第30张图片

判断图中是否有某条边

无向图:
数据结构补强——图_第31张图片
有向图:
数据结构补强——图_第32张图片

列出图中与结点邻接的所有边

无向图:
数据结构补强——图_第33张图片
有向图:
数据结构补强——图_第34张图片

在图中插入顶点

数据结构补强——图_第35张图片

在图中删除顶点

无向图:
数据结构补强——图_第36张图片
有向图:
数据结构补强——图_第37张图片

向图中添加一条边

数据结构补强——图_第38张图片

求图中顶点x的第一个邻接点

无向图:
数据结构补强——图_第39张图片
有向图:
数据结构补强——图_第40张图片

假设图中顶点x的一个邻接点y,返回除y之外顶点x 的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1

无向图:
数据结构补强——图_第41张图片

获取并设置图中边的权值

数据结构补强——图_第42张图片

图的遍历

  • 广度优先遍历
  • 深度优先遍历

广度优先遍历

数据结构补强——图_第43张图片

代码实现

数据结构补强——图_第44张图片

遍历序列的可变性

数据结构补强——图_第45张图片

算法改进

因为如果是非连通图,则无法遍历完所有结点
数据结构补强——图_第46张图片

复杂度分析

数据结构补强——图_第47张图片

广度优先生成树

数据结构补强——图_第48张图片

广度优先生成森林

数据结构补强——图_第49张图片

练习

数据结构补强——图_第50张图片

深度优先遍历

数据结构补强——图_第51张图片

算法改进

数据结构补强——图_第52张图片

复杂度分析

空间复杂度:
数据结构补强——图_第53张图片
时间复杂度:
数据结构补强——图_第54张图片

深度优先生成树

数据结构补强——图_第55张图片

深度优先生成森林

数据结构补强——图_第56张图片

图的遍历和图的连通性

无向图:
数据结构补强——图_第57张图片
有向图:
数据结构补强——图_第58张图片

总结

数据结构补强——图_第59张图片

图的最小生成树(MST)

概念

数据结构补强——图_第60张图片
数据结构补强——图_第61张图片

Prim算法(普里姆)

数据结构补强——图_第62张图片

Kruskal算法(克鲁斯卡尔)

数据结构补强——图_第63张图片

两种算法对比

数据结构补强——图_第64张图片

Prim算法的实现思想

数据结构补强——图_第65张图片

Kruskal算法的实现思想

数据结构补强——图_第66张图片
数据结构补强——图_第67张图片

图的最短路径问题

数据结构补强——图_第68张图片

BFS求无权图的单源最短路径

BFS实际上的结果就是单源最短路径
缺点:只能用于不带权的图

代码实现

数据结构补强——图_第69张图片

数据结构补强——图_第70张图片

Dijkstra(迪杰斯特拉)算法

数据结构补强——图_第71张图片

步骤

  • 初始:
    数据结构补强——图_第72张图片
  • 第一轮:
    数据结构补强——图_第73张图片
  • 第二轮:
    数据结构补强——图_第74张图片
  • 第三轮:
    数据结构补强——图_第75张图片
  • 第四轮:
    数据结构补强——图_第76张图片

如何使用数组信息

数据结构补强——图_第77张图片

时间复杂度

数据结构补强——图_第78张图片

对比Prim算法的实现思想

数据结构补强——图_第79张图片

用于负权值带权图

数据结构补强——图_第80张图片

Floyd算法

数据结构补强——图_第81张图片
数据结构补强——图_第82张图片

步骤

数据结构补强——图_第83张图片
数据结构补强——图_第84张图片
数据结构补强——图_第85张图片
数据结构补强——图_第86张图片
数据结构补强——图_第87张图片

数据结构补强——图_第88张图片

数据结构补强——图_第89张图片

练习

数据结构补强——图_第90张图片

不能解决的问题

数据结构补强——图_第91张图片

总结

数据结构补强——图_第92张图片

有向无环图描述表达式

数据结构补强——图_第93张图片
数据结构补强——图_第94张图片
数据结构补强——图_第95张图片
数据结构补强——图_第96张图片
数据结构补强——图_第97张图片

拓扑排序

AOV网

数据结构补强——图_第98张图片

概念

数据结构补强——图_第99张图片
数据结构补强——图_第100张图片
数据结构补强——图_第101张图片

代码实现


数据结构补强——图_第102张图片
数据结构补强——图_第103张图片

逆拓扑排序

数据结构补强——图_第104张图片
数据结构补强——图_第105张图片
数据结构补强——图_第106张图片

关键路径

AOE网

数据结构补强——图_第107张图片
数据结构补强——图_第108张图片

概念

数据结构补强——图_第109张图片
数据结构补强——图_第110张图片

数据结构补强——图_第111张图片
数据结构补强——图_第112张图片
数据结构补强——图_第113张图片

求所有事件的最早发生时间

数据结构补强——图_第114张图片

求所有事件的最迟发生时间

数据结构补强——图_第115张图片

求所有活动的最早发生时间

数据结构补强——图_第116张图片

求所有活动的最迟发生时间

数据结构补强——图_第117张图片

求所有活动的时间余量

数据结构补强——图_第118张图片

求得关键活动、关键路径

数据结构补强——图_第119张图片

关键活动、关键路径的特性

数据结构补强——图_第120张图片
数据结构补强——图_第121张图片

你可能感兴趣的:(数据结构,java,面试,开发语言)