常用数据结构图--拓扑排序

本文介绍了图数据结构的基础概念,包括有向图和无向图,并详细阐述了图的两种存储方式:邻接矩阵和邻接表。重点讨论了拓扑排序,它是对有向无环图的顶点进行排序的方法,确保路径方向的正确性。文中给出了拓扑排序的两种算法,包括时间复杂度分析,并提供了代码示例。
摘要由CSDN通过智能技术生成

常用数据结构图–拓扑排序

在数学中,一个图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。

图是十分重要的数据结构,常常被应用于实际生活的应用之中。生活中常见的问题例如交通路线图、任务指定分配、工期计算、航空网络等,都可以使用图相关的理论来建立模型。

下面是《数据结构与算法分析》对图的若干定义

一个图(Graph)G = (V, E)由顶点(vertex)集和边(Edge)集E组成。每一条边就是一个点对(v,w),其中v,w属于集合V。有时也把边Edge叫做弧(arc)。如果点对是有序的,那么图就叫做是有序的(directed)。有向的图有时候叫做有向图。顶点v和w邻接(adjacent)当且仅当(v,w)属于E。在一个具有边(v,w)从而具有边(w,v)的无向图中,w和v邻接且v和w也邻接。有时候边还具有第三种成分,叫做权(weight)或值(cost)。

图的存储

一种简单存储图的方式时采用一个被称为邻接矩阵的二维数组a[i][j],数组的大小为n * nn 为图的顶点个数。其中如果顶点i到顶点j连通,那么a[i][j] = 1,否则a[i][j] = 0。这种存储方式的优点是简单直观,实现方便。缺点也很明显,所需要的存储空间巨大。

当含有n个顶点的图G中大多数顶点都不是连通,那么意味中n * n 邻接矩阵中有大量的元素为0,即此时邻接矩阵是稀疏矩阵。

另一种常见的存储方式称为邻接表(adjacent list),这种方式是申请一个大小为n 的数组head,数组元素head[i],存放着由顶点i的所有邻接顶底组成的链表的头地址。此种存储方式的优点显而易见,相比于前一种方式,存储空间的大小明显减小。但是缺点是不直观,编码有难度。

拓扑排序

拓扑排序是对又向无圈图的顶点的一种排序,它使得如果存在一条从ViVj 的路径,那么在排序中Vj 必须出现在 Vi 的后面。

一种简单的求拓扑排序的算法先是找出任意一个入度为0的顶点。然后我们输出该顶点,并将它和它的边一起冲图中删除。然后,将其邻接的顶点的入度减去1。然后重复上述过程,直达图被完全删除。

不难看出,此种算法首先是外层循环 n 次,其次是内部循环中在选取入度为0 的顶点时候,会内部循环n次。因此总的时间复杂度会达到n * n

另一种较好的改进方法是,将所有入度为0的顶点压入某个栈,然后每一次输出顶底元素A后,再将A的所有邻接顶点的入度减去1,如果某个邻接顶点的入度此时为0,那么将其继续入栈。重复上诉操作指导栈空。

可以看出,对每一个入度为0的顶点入栈的操作执行了n 次,n 为顶点数。对出栈的元素A,将其邻接顶点的入度减1,然后入栈的操作,最多执行了 m 次, m 为图边的条数。因此总的时间复杂度就会是线性的 O(n)

代码示例


                
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值