数据结构与算法-图(十字链表 邻接多重表 边集数组 )

前两天我们介绍的邻接矩阵和邻接表是最常用的图的存储结构,可是呢,对于一些算法需要更为精巧的存储方法,哪怕空间复杂度稍微低一点也没关系。今天介绍十字链表和邻接多重表还有边集数组。
首先我们回想一下邻接表,对于有向图的邻接表,由于对于顶点出度的入度分别储存在邻接表和逆邻接表中,对于频繁访问出度的入度的算法很不方便,于是前辈们将邻接表和逆邻接表结合在一起,组成了十字链表,就可以方便的读取出度和入度啦。
对于顶点表的结点,除了他作为弧尾指向弧头的指针,再加一个储存他作为弧头指向弧尾的指针,对于边表结点,我们设置tailvex,headvex,headlink,tailink四个域tailvex弧的起点,headvex存储弧的终点也就是弧头,headlink指向弧头都是该顶点的下一条弧,taillink指向弧尾都是该顶点的下一条弧。如果是网图,在每一个边表结点加上一个数值域weight存储权重就欧克啦。两个表完美结合,十字链表的建立时间复杂度和邻接表相同,是用空间换取时间的典型,对于有向图,是非常好的存储结构。
使用十字链表优化了有向图的存储,那无向图呢?不太公平哦,没关系,下面的邻接多重表就是优化无向图的存储的,对于无向图的邻接表,关注的重点在顶点上,对于边的操作是很复杂的,例如要删除一条边,需要找到两个这个边的边表进行操作,而且是成对操作,很不乐观,所以:仿照十字链表,前辈们发明了邻接多重表,顶点表不变,参照十字链表的边表顶点,设置ivex,ilink,jvex,jlink四个域,ivex和jvex存储边的两个顶点的下标,我们规定,顶点表指向的是ivex,目的是让表更加规范,至于ilink的jlink依然是两个指针域,ilink指向以ivex顶点相连的下一条边,类似的,link指向与lvex相连的下一边,无形中就将所有边联系起来了,指针域若没有指向,就指向null即可。
终于到最后一个啦~,最后一个边集数组,它关注的是边,虽然效率不高,但是应用在克鲁斯卡尔算法十分精妙,思想很简单,用一个一维数组储存顶点信息,用一个二维数组储存边信息,边数组每个元素包含起点下标,终点下标和权三部分组成,想了解更多边集数组点这里:邻接矩阵转化边集数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值