本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,前面的系列文章链接如下:
数据结构基础:P1-基本概念
数据结构基础:P2.1-线性结构—>线性表
数据结构基础:P2.2-线性结构—>堆栈
数据结构基础:P2.3-线性结构—>队列
数据结构基础:P2.4-线性结构—>应用实例:多项式加法运算
数据结构基础:P2.5-线性结构—>应用实例:多项式乘法与加法运算-C实现
数据结构基础:P3.1-树(一)—>树与树的表示
数据结构基础:P3.2-树(一)—>二叉树及存储结构
数据结构基础:P3.3-树(一)—>二叉树的遍历
数据结构基础:P3.4-树(一)—>小白专场:树的同构-C语言实现
数据结构基础:P4.1-树(二)—>二叉搜索树
数据结构基础:P4.2-树(二)—>二叉平衡树
数据结构基础:P4.3-树(二)—>小白专场:是否同一棵二叉搜索树-C实现
数据结构基础:P4.4-树(二)—>线性结构之习题选讲:逆转链表
数据结构基础:P5.1-树(三)—>堆
数据结构基础:P5.2-树(三)—>哈夫曼树与哈夫曼编码
数据结构基础:P5.3-树(三)—>集合及运算
数据结构基础:P5.4-树(三)—>入门专场:堆中的路径
数据结构基础:P5.5-树(三)—>入门专场:File Transfer
文章目录
一、定义
1.1 图的一些应用
图这个词在数据结构第1篇博客中就提到过。就是在那个书店里,如果我们除了想摆书之外,还想统计一下每一本书有什么人买,买这些书的人还买过其他的什么书。这时我们就需要建立一种多对多的关系,这种工具叫做图。
社交网络
最短路径与最小生成树
1.2 图的定义
我们说过图表示的是一种多对多的关系,之所以我们说它强大是因为它把线性表和树全部都包含在内了。我们知道线性关系表示的是一对一的关系,而树表示的是一对多的关系。其实线性表和树全部都可以认为是图的一个特殊情况。
当我们要描述一个图的时候,有两件事情一定要搞清楚:什么是它的顶点和边。
1.3 数据类型与术语
按照惯例,我们在介绍一个结构的时候肯定是先从它的抽象数据类型定义开始。抽象数据类型定义包括三个要素:类型名称、数据对象集、操作集
图的相关术语有很多,我们先介绍几个常见的。
二、邻接矩阵表示法
前面我们说了一些抽象的图的概念,接下来我们要写程序去实现这些图的相关算法。我们怎么在程序里头表示一个图?我们先看第一种最简单的表示方法:邻接矩阵表示法
对于一个无向图的存储邻接矩阵,显然有一半的空间是被浪费掉的。
邻接矩阵表示图的好处:
邻接矩阵表示图的缺点:
三、邻接表表示法
在前面我们知道了邻接矩阵在表示稀疏图的时候是很不方便的,它不仅浪费空间而且浪费时间为了解决这个问题,我们就有了另外一种表示法,叫做邻接表
。邻接表是一个链表的集合,我们首先定义一个指针数组G[N]
,对应矩阵每行一个链表,只存非0元素。
分析:
邻接表的优缺点:
四、小测验
1、有个顶点的无向完全图有多少条边?
A. N(N-1)/2
B. N(N+1)/2
C. N^2
D. N^2-N
答案:A
2、给定有向图的邻接矩阵如下
顶点2(编号从0开始)的出度和入度分别是:
A. 3, 1
B. 1, 3
C. 0, 2
D. 2, 0
答案:C
3、有向图的邻接矩阵一定是不对称的
答案:错误
4、用一维数组G[ ]存储有4个顶点的无向图如下:
G[ ] = { 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 }
则顶点2和顶点0之间是有边的。
答案:正确
5、用邻接表表示有个N顶点、E条边的图,则遍历图中所有边的时间复杂度为:
答案:C