图上
图(上)
第一讲
一.什么是图
图其实是一种很抽象的东西,它可以表示很多东西,举个例子,就你的朋友圈而言,你所交的朋友就可以构成一个图,生活中有很多很多的例子,因此图是比较复杂的,它表示的是“多对多"的关系。
回到数据结构,图一般包含两个要素:
一组顶点:通常用V表示顶点集合;
一组边:通常用E表示边的集合;
边是顶点对:(v,w)属于E,其中圆括号表示无向边,类似于一个这样的东西,——,双行线。
有向边<v,w>表示v——>w,它是单行线。
我们不考虑重边和自回路,重边容易理解,自回路是什么呢?自回路其实就是一个由自己指出的边然后又指回自己,这就是自回路。
二.图的表示方法
作为程序员的我们,怎么用程序来表示一个图呢?
这里我们要引出一个新的概念叫邻接矩阵。
邻接矩阵其实就是存放关系的矩阵,有关系则为1,没有关系则为0;当然数值不一定用01表示,你可以用任何数。这里来放一个图就一目了然了
在图中,我们很清楚的看到,如果v1与v2有关系,则为1,没有关系就为0,然后图中的一条红线,红线经过的数字全为0,这是为什么呢,因为我们没有自回路,也就是没有自己指向自己的。而且以红线为轴,两边是对称的,因为我们是无向边,很好理解。
同时我们会发现既然是对称的,那么我们就没必要存放两个一样的东西,这样会浪费了一半的空间呀,与此同时,完善的方法就诞生了。
我们可以用一个长度为N(N+1)/2的一维数组存储,存储的顺序是按照从上至下,从左至右的,
那么i与j的关系如何呢,通过计算也就是规律,可得 数组的下标为(i*(i+1)/2+j),然后我们看它对应的数组元素的值,就可以判断有无关系了。
邻接矩阵的缺点:很明显,浪费空间,但是也是相对而言的,对于稀疏图,也就是顶点很多,边很少,显然很浪费空间也浪费时间,但是对于稠密图,特别是对于完全图(一个点和所有点都有关系),还是很合算的。
看完了邻接矩阵,看看邻接表吧
邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素,也就是说只存有关系的。
大概就长这个样子吧!让我们想一想,它真的比邻接矩阵要好吗?
我们仔细分析,一个结点既要存指针,还要存有关系的下标,就占了两个域了,然后每一个结点都有,所以也无法避免重复的情况,因此它也是浪费空间的。但是,它很方便找出所有的相邻的点,比邻接矩阵还是要节约一些空间的,但也存在浪费。
相关文章: