大话数据结构笔记-图

来源:互联网 发布:淘宝关键词提取器 编辑:程序博客网 时间:2024/06/06 02:03

大话数据结构笔记-图

定义

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为
G(V,E),
其中
G表示一个图,
V是图G中的顶点的集合,
E是图G中边的集合。

顶点就是图中的数据元素。

在图中任意两个顶点都可能存在关系,顶点之间的逻辑关系用边来表示。

无向边:若顶点Vi到Vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(Vi,Vj)来表示。

如果图中任意两个顶点之间都是无向边,则称为 无向图

有向边:若顶点Vi到Vj之间的边有方向,则称这条边为有向边,也称为弧(Arc)。

起点是 弧尾,终点为 弧头,

顶点与边的关系

  • 对于无向图G=(V,{E}),如果边(v,v’)包含于E
  • 则称顶点v和v’互为 邻接点(Adjacent),即v与v’相邻接。
  • 边(v,v’)依附于顶点v与v’.或者说(v,v’)与顶点v和v’相关联。
  • 顶点v的度是和v相关联边的数目。记为TD(v).

  • 对于有向图=(V,{E}),如果弧<v,v'>包含于E

  • 则称顶点v和v’互为 邻接点(Adjacent),即v与v’相邻接。
  • <v,v'>依附于顶点v与v’.或者说<v,v'>与顶点v和v’相关联。
  • 顶点v为头的弧的数目称为v的入度,记为ID(v).
  • 顶点v为尾的弧的数目称为v的出度,记为OD(v).
  • 顶点v的度为TD(v)=ID(v)+OD(v)

无向图G=(V,{E})中从顶点v到顶点v’的路径(Path)是一个顶点序列?

路径的长度为路径上的边或弧的数目。

  • 第一个顶点到最后一个顶点相同的路径叫做 回路或环
  • 序列中顶点不重复的路径称为 简单路径
  • 除了第一个和最后一个顶点之外,其余顶点不重复出现的回路,称为 简单回路简单环

连通图相关术语

在无向图G中,如果从顶点v到顶点v’有路径,则称v和v’是 连通的。
如果对于图中任意两个顶点vi,vj属于V,vi,vj都是联通的,则称G为 连通图

无向图中的极大连通子图称为连通分量。
要有子图,
子图是连通的,
连通子图含有极大顶点数,
具有极大顶点数的连通子图包含依附于这些顶点的所有边。

在有向图中,如果对于每一对vi,vj包含于V,vi不等于vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称作有向图的强连通分量。

存储结构

邻接矩阵

  • 图的 邻接矩阵存储方式是用两个数组来表示图。
  • 一个一维数组存储图中顶点的信息,
  • 一个二维数组(邻接矩阵)存储图中的边或弧的信息。
//就是说一个数组存储点:array = [v0, v1, v2, v3]

一个二维数组存储边(弧)的信息:

- v0 v1 v2 v3 v0 0 1 1 1 v1 1 0 1 0 v2 1 1 0 1 v3 1 0 1 0

对于无向图,vi行或列就为vi的度。例如v1的度为2

对于有向图,行为出度,列为入度。

邻接表

数组于链表相组合的储存方法成为邻接表

  • 用一组数组存储顶点,和指针地址,(有些还要存储数据,权值)。
  • 每个数据元素的指针域存储下一个邻接点的指针。
  • 每个顶点构成一个线性表,由于邻接点的个数不定,所以使用单链表存储。
  • 对于有向图,每个顶点都建立以本顶点为弧头的表。

(data, [weight], index)

个人理解,邻接表就是用一组链表表示图。

十字链表

为了补足邻接表的缺陷。

邻接表只能表示出度,想要了解入度需要遍历整个表,所以为了方便获得每个顶点的入度,在每个数据元素中加入了一个指针指向表的入度。

(data, firstin)->(tailvex, headvex, headlink, tailink)

邻接多重表

相对于无向图,如果我们需要删除一条边,我们需要寻找两个节点,为了简化这一操作,我们在每个数据元素上加一个指针指向另一个顶点。

(ivex, ilink, jvex, jlink)

  • ivex和jvex是于某条边依附的两个顶点在顶点表中的下标。
  • ilink指向依附顶点ivex的下一条边。
  • jlink指向依附顶点jvex的下一条边。

边集数组

边集数组是有两个一维数组构成。一个存储顶点信息:另一个存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。

(begin, end, weight)

图的遍历

希望从图的某一顶点出发访遍图中其余顶点,且使每一个顶点仅访问一次,这一过程就叫做图的遍历。

深度优先遍历

深度优先遍历(Depth_First_Search),也有称为深度优先搜索,简称DFS。

就是一棵树一棵树遍历。

从图中某一顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径想通的顶点都被访问到。
若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中全部顶点都被访问到为止。

广度优先遍历

广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS。

就是,一层一层遍历。

最小生成树

我们吧构造联通网的最小代价生成树成为最小生成树。(Minimum Cost Spanning Tree)

普里姆算法

Prim

以某定点为起点,逐步查找个顶点上的最小权值的边来构建最小生产树。

克鲁斯卡尔算法

Kruskal

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

对比两个算法。
- 克鲁斯卡尔算法主要是针对边来展开,边数少时效率会非常高。
- 普里姆算法主要针对稠密图,即边数非常多的情况会更好一些。

最短路径

对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。

迪杰斯特拉算法

按路径长度递增的次序产生最短路径算法。

弗洛伊德算法

如果面临要求所有顶点至所有顶点的最短路径问题,弗洛伊德算法应该是不错的选择。

拓扑排序

在一个表示工程的有向图中,用定点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。
AOV网中的弧表示活动之间存在某种制约关系。
AOV网中不能存在回路。

设G=(V, E)是一个具有n个顶点的有向图,若满足从顶点vi到vj有一条路径,则在顶点序列中顶点vi比在顶点vj之前。则我们称这样的顶点序列为一个拓扑序列。

拓扑排序,其实就是对一个有向图构造拓扑序列的过程。

关键路径

在一个表示构成的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网。

我们把路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径叫 关键路径。在关键路径上的活动叫 关键活动

原创粉丝点击