数据结构与算法(图)

 1>提出问题,,如何理解图,微博,qq好友之间的好友关系是怎么存储的?带着这个问题我们今天来讲一下图这种数据结构

       之前我们讲了树是一种非线性结构,另外今天我们讲的图也是一种比较复杂的非线性结构,

      之前我们讲的树中的元素我们称之他为节点,图中的元素我们叫做顶点,图中,我们可以和顶点与顶点之间建立更加复杂的关系,我们称之为边,废话不多说,我们看下图

  

       解释:我们生活中有很多这种应用来用图来进行表示,比如qq好友与qq好友之间的关系,就单纯的讲,我们如果只是建立好友与好友之间的关系,我们可以把每个好友包括自己看作一个点,好友与自己建立一条边,这种关系就可以用图来表示,其中我们有多少好友,就建立多少个边,对应在图中,就是这个顶点的度.就是跟这个顶点相连的边数.

                        我们在用微博举另一个场景:在微博中,有一种好友与好友的关注,就是怎么来建立关系的呢?比如说,用户A对用户B进行了关注,我们可以画一条A指向B的箭头,如果同时B也同时指向了A的箭头,那么我们即要有从A指向B的箭头,也需要画一条从B指向A的箭头,像这种图形,我们叫做有向图,以此类推,我们把没有方向的图,我们叫做无向图

             刚刚我们讲了,在无向图中有这个概念,而在有向图中有入度出度这个概念,所谓入度是指都多少顶点指向该顶点,所谓出度是指从该顶点出发,指向了多少个顶点,

       我们在举一个列子,还是之前qq的好友之间的关系,但是除了qq与好友之间的关系,qq好友之间存在着亲密度的说法,这里就要用到另外一种图,带权图,哎带权图中,每条边都有一个权重,我们可以通过这个权重来表示qq好友间的亲密度

   2>图的存储

                 领接矩阵法:这种存储方法底层依赖的是一个二维数组,对于无向图来说,如果顶点A与顶点B之间有边,我们就将a[i][j]和a[j][i]标记为1,对于有向图来说,如果A指向的是B那么,我们就标记为A[i][j]为1,如果是B指向的A,那么久标记A[]j[i]为1,对于有权图,数组中就存储的对应的权重

  解释:用领接矩阵,虽然简单,直观,但是比较浪费存储空间,

          对于无向图来说,如果a[i][j]=1.那么a[j][i]也等于1,实际上我们只要存储一个1就可以了,这样就可以表示A和B之间的关系,是比较浪费空间的,

      用于矩阵来进行表示,我们可以用矩阵来计算某种关系.比如后面的最小距离,都是用矩阵来进行计算的

 领接表存储法,针对上面那种的领接矩阵存储法师比较浪费空间的,

         解释:其实猛的一看,像散列表的存储方式,每个顶点对应一条链表,链表中存储的是与这个点链接的其他顶点,其中/表示互相指向,其实右边就是基于链表的,链表在寻找遍历是比较消耗性能,我们将链表结构改造为跳表结构,有序动态数组等等,用二分法来进行查找

猜你喜欢

转载自blog.csdn.net/w5201314ws6123/article/details/86501494