图算法 图的表示(邻接表和邻接矩阵)和拓扑排序

本文介绍了图的两种表示方法——邻接矩阵与邻接表,并详细解释了它们的空间需求。此外,还探讨了如何对有向无环图进行拓扑排序,包括计算顶点的入度和维护入度为0的顶点队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的表示

图有两种表示方法,分别是邻接矩阵和邻接表。这里以有向图为例说明。


邻接矩阵

邻接矩阵是一个二维数组A。对于每条边 (u,v),置A[u][v]等于true;否则,数组元素为false。

如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。

它的空间需求为Θ(|V|^2)。


邻接表

大多数情况,图都是比较稀疏的,那么用邻接表表示更为合适。

对每一个顶点,使用一个表存放所有邻接的顶点。这样的空间需求为Θ( |E| + |V| )。

邻接表是图的标准表示方法。可以为每个顶点数据结构增加一个邻接表域才存储这个表。


拓扑排序

拓扑排序是对有向无圈图顶点的一种排序,是的如果存在一条从vi到vj的路径,那么在排序中vj就出现在vi后面。注意:只保证先后顺序,不保证相邻顶点挨着出现。

做法是:对每个顶点,除了保持邻接表,还有入度(indegree,定义为边(u,v)的条数),拓扑编号(topNum)。

使用一个队列存储入度为0的顶点。

1,对每个顶点计算它的入度,将所有入度为0的顶点放在一个初始为空的队列;

2,当队列不空时,删除一个顶点v,并将于v邻接的所有顶点的入度减1。

3,只要一个顶点的入度降为0,就将该顶点放入队列中。

4,此时,拓扑排序就是顶点入队的顺序。

	//伪代码,可以很方便改写为Java代码
	void topsort( ){
		//哪个队列实现类的都可以
		Queue<Vertex> q = new Queue<Vertex>( );
		int counter = 0;
		
		for each Vertex v
			if( v.indegree == 0 )
				q.enqueue( v );
		
		while( !q.isEmpty( ) ){
			Vertex v = q.dequeue( );
			v.topNum = ++counter;
		
			for each Vertex w adjacent to v
				if( --w.indegree == 0 )
					q.enqueue( w );
		}
		
		if( counter != NUM_VERTICES )
			print("Circle exists!");
    }


<think>嗯,用户这次想深入理解网络协议中"收敛"的核心概念。之前讨论过eNSP中OSPF的具体收敛过程,现在用户希望跳出具体协议,从理论层面把握这个关键术语的定义意义。用户引用的三段材料很有价值:第一段提到区域划分优化收敛速度[^1],第二段描述RIP协议通过周期更新达到收敛[^2],第三段说明OSPF用链路状态数据库构建全网拓扑[^3],这些恰好展示了不同协议实现收敛的典型方式。 用户可能是网络工程学习者或备考认证的学员,ta在掌握具体协议操作后,开始思考背后的理论框架。需要帮ta建立三层认知:基础定义(what)、必要性(why)、实现原理(how)。特别要注意区分距离矢量协议(如RIP)链路状态协议(如OSPF)在收敛机制上的本质差异——前者依赖邻居间迭代传递路径矢量,后者依靠同步拓扑数据库后独立计算。 关于数学表达,收敛时间的公式需要规范呈现:$$T_{convergence} = T_{detection} + T_{propagation} + T_{computation}$$ 这个模型能清晰分解影响收敛的关键阶段。用户引用的RIP收敛描述[^2]其实隐含了"好消息传得快,坏消息传得慢"的问题,可以借此说明不同协议收敛速度的差异根源。 用户可能后续会追问具体协议的收敛对比或优化方案,所以在相关问题里预设了BGP收敛OSPF优化等方向。最后补充的"泛洪算法"[^3]"区域划分"[^1]引用要自然融入正文,突出这些技术如何服务于收敛目标。</think>在网络协议中,"收敛"(Convergence)指网络中的所有路由器**完成路由信息交换计算,达到对网络拓扑认知一致且路由表稳定的状态**。这是动态路由协议的核心目标,其定义、意义及实现原理如下: --- ### 一、收敛的定义 1. **技术定义** 当网络拓扑变化时,路由器通过协议报文(如OSPF的LSA、RIP的路由表)交换信息,最终所有路由器满足: - **链路状态数据库(LSDB)完全同步**(如OSPF)或 **路径矢量信息一致**(如RIP) - **独立计算出最优路径**,并更新路由表 - **全网路由表不再变化**,形成稳定转发路径 此过程耗时称为 **收敛时间**(Convergence Time)。 2. **数学表达** 收敛过程可建模为: $$T_{convergence} = T_{detection} + T_{propagation} + T_{computation}$$ 其中: - $T_{detection}$:故障检测时间(如OSPF的Dead Timer) - $T_{propagation}$:路由信息泛洪时间(依赖LSA/LSU洪泛[^3]) - $T_{computation}$:SPF算法计算时间(如Dijkstra算法) --- ### 二、收敛的意义 1. **避免路由黑洞环路** - 未收敛时:部分路由器可能使用过时拓扑,导致数据包被错误丢弃(黑洞)或循环转发(环路)。 - **示例**:若RIP路由器未收敛,可能持续向失效链路发送流量[^2]。 2. **保障网络可用性** - 快速收敛(如毫秒级)是金融、实时通信等场景的刚性需求。 - **数据**:传统RIP收敛需分钟级,OSPF优化后可降至秒级[^1]。 3. **优化资源利用率** - 收敛后流量按最优路径转发(如OSPF基于Cost选路),避免拥塞。 - **对比**:静态路由无法动态适应拓扑变化,可能长期使用次优路径。 4. **支持大规模网络扩展** - 分层设计(如OSPF区域划分)通过压缩LSDB规模[^1],显著提升收敛效率。 - **公式推导**: 设区域内有 $n$ 台路由器,全网SPF计算复杂度为 $O(n^2)$;划分 $k$ 个区域后降至 $O(\frac{n}{k})^2 \times k = O(\frac{n^2}{k})$。 --- ### 三、不同协议的收敛机制对比 | **协议类型** | **收敛原理** | **收敛速度** | **典型场景** | |--------------|---------------------------------------|--------------------|-------------------| | **链路状态协议**<br>(如OSPF, IS-IS) | 洪泛链路状态信息[^3],独立构建全网拓扑图后计算SPF树 | 快(秒级) | 大型企业网、运营商 | | **距离矢量协议**<br>(如RIP, EIGRP) | 邻居间周期交换路由表,迭代更新路径距离[^2] | 慢(分钟级) | 小型网络 | | **路径矢量协议**<br>(如BGP) | 通过UPDATE报文通告AS路径,路径策略复杂 | 极慢(分钟~小时) | 互联网骨干 | --- ### 四、加速收敛的关键技术 1. **快速检测机制** - BFD(双向转发检测):毫秒级故障探测,替代协议Hello计时器。 - **示例**:OSPF Dead Timer默认40秒,结合BFD可降至50毫秒。 2. **计算优化** - **iSPF(增量SPF)**:仅重计算受拓扑变化影响的路径子树。 - **PRC(部分路由计算)**:针对非拓扑变化(如Cost调整)跳过SPF。 3. **泛洪优化** - OSPF Smart LSA Throttling:抑制频繁变化的LSA泛洪。 - **公式效果**:将突发LSA的泛洪间隔从 $T_0$ 动态调整为 $\min(2^k T_0, T_{max})$。 4. **分层设计** - OSPF多区域架构:限制LSA在区域内传播,减少SPF计算范围[^1]。 - **数据**:单区域100台路由器的SPF计算耗时可达500ms,分区域后降至50ms。 --- ### 五、收敛问题典型案例 - **案例1:RIP的"计数到无穷"** 因慢收敛导致环路,RIP设置最大跳数15跳强制终止[^2]。 - **案例2:OSPF DR选举失败** 广播网络中未选出DR,导致DROther间无法建立邻接,部分路由缺失。 - **解决方案**: ```bash interface GigabitEthernet0/0/1 ospf dr-priority 100 # 强制指定DR优先级 ``` --- ### 总结 收敛是动态路由协议的"稳态终点",直接决定网络的**鲁棒性****效率**。优化收敛需结合: 1. **协议选择**(OSPF优于RIP) 2. **分层设计**(区域划分[^1]) 3. **算法加速**(iSPF/PRC) 4. **硬件辅助**(BFD+快速重路由) 最终目标是将 $T_{convergence}$ 最小化,满足业务对高可用的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值