图算法 - 只需“五步” ,获取两节点间的所有路径(非递归方式)

本文介绍了如何使用非递归方式,通过双栈算法获取图中两个节点之间的所有路径。详细解释了算法过程,包括建栈、继续建栈、削栈、获取第一条路径和获取所有路径的步骤,并提供了伪代码。该算法适用于无向图和有向图,可避免JS中的递归栈溢出问题。
摘要由CSDN通过智能技术生成

在实现 “图” 数据结构时,会遇到 “获取两点之间是所有路径” 这个算法问题,网上的资料大多都是利用递归算法来实现(见文末的参考文章)。

我们知道在 JS 中用递归算法很容易会让调用栈溢出,为了能在生产环境中使用,必须要用非递归方式的去实现。

经过一番探索,实现的思路主要来自文章 《求两点间所有路径的遍历算法》 ,只是该文中并没有给出具体的实现细节,需要自己去实现;最终本文的实现结合类似《算法 - 调度场算法(Shunting Yard Algorithm)》 中所提及的双栈来完成。

1、算法过程

以计算下图为例, 节点 3节点 6 所有路径所有可能的路径为 8 条:

allpathallpath

我们具体讲一下如何获取这 8 条路径的过程。

首先准备两个栈,分别称为 主栈辅栈

  • 主栈:每个元素是单个节点(Vertex),用于存放当前路径上的节点;
  • 辅栈:每个元素用于存放主栈对应元素的 相邻节点列表(Vertex Array);该栈是用来辅助 主栈 的,其长度和 主栈 一致;

Step 1: 建栈

v3节点3)放到主栈,同时将 v3 节点的邻接节点列表 [v1, v7] 放到辅栈中:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值