algorithm - 在路径中查找先前的“阻塞点”
问题描述
我有一个类似“树”的节点结构,我试图找出一种算法,当给出结束节点时,它会找到以前的“阻塞点”。这是一张更好地演示的图片:
- 所以当15被指定为结束节点时,我想找到7
- 如果7被指定为结束节点,我想找到1
- 但是在上面的示例中,如果将 7,15 或 16 以外的任何其他内容指定为端节点,则找到的节点是前一个节点,因为这是唯一连接到端节点的节点。
所以我要搜索的节点是所有路径必须经过才能到达末端节点的前一个节点。
我尝试了一种算法,我从结束节点开始并向后退(使用广度优先),并且我发现每个具有 2 个或更多输出的节点都添加到一个新列表中,并且我跳过具有一个输出的节点。例如,如果以 15 作为结束节点,我最终会将 10 和 7 添加到潜在节点列表中,但我不确定如何从那里开始。因为我不应该继续从 7 开始。
是否有潜在的算法已经可以做到这一点,如果没有,我怎么能做到这一点?
解决方案
拓扑排序是图的排序,使得每个箭头都与顺序一致。例如,在您的示例中,我们可能会提出以下命令:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 15
使用任何O(n)
算法对其进行拓扑排序。
接下来,我们遍历图并跟踪每个节点有多少传入边。
最后,我们按照排序顺序遍历图,并跟踪我们看到了一端但没有看到另一端的边,以及有多少节点没有传入边。任何时候我们到达一个所有出边都没有结束并且每个未来节点都有入边的节点,这就是一个阻塞点。
之后,我们可以准备两张地图。首先是从每个节点到它的拓扑顺序。第二个是阻塞点所在位置的平衡二叉树。
前面的分析是O(n)
。实际查找现在是O(log(n))
.
推荐阅读
- excel - 如何自动更新由列表验证的不同工作表上的单元格?
- excel - 我们是否应该总是/有时在“For Each”循环中使用“.Cells”属性
- javascript - 打开新标签后如何修复setInterval延迟(手机也是如此)
- zeromq - 如何防止 PUB/SUB 的缓冲/延迟?
- javascript - 如何将jquery动态数据发送到控制器
- c# - 多区域项目中特定区域的多文化
- mongodb - 如何搜索mongodb集合映射JSON
- asp.net - Azure Functions 是否启动可使用 OpenTelemetry .NET 检测的活动?
- javascript - 切换i18n语言的按钮
- properties - 如何让 log4j.properties 读取环境变量