【问题标题】:How to find a list of unique shortest paths in a list of paths?如何在路径列表中找到唯一最短路径的列表?
【发布时间】:2019-04-10 18:16:34
【问题描述】:

假设我有一个如下所示的树形图,其中一个节点可以有多个子节点,依此类推..(一个节点只能有一个父节点)。如果我有一个沿该图的路径列表,我如何找到这些路径中唯一且最短的子集?

示例输入(路径列表):

[1, 2, 3]
[1, 2]
[1, 7]
[1, 8, 9, 10]

预期输出:

[1, 2]
[1, 7]
[1, 8, 9, 10]

[1, 2, 3] 路径被忽略,因为它比 [1, 2] 长,而 [1, 8, 9, 10] 路径被保留,因为它是唯一的。

【问题讨论】:

  • [1, 2, 3] [1, 2, 4] 的预期输出是什么?
  • @Cid 如果 [1] 或 [1,2] 不存在,则两者都应该出现在输出中,因为它们是唯一的。
  • 所以基本上如果存在前缀,那么你删除那个元素?
  • @WillemVanOnsem 它看起来像。问题变得非常简单,术语 graphtree 可以忽略,因为整个“道路”作为输入发送。不需要解析树,这只是数组处理。 最短路径在这里,在我看来,使用不当
  • @Cid: 好吧,我们可以在这里为每个项目更新前缀树,但实际上,它在 graphtree 方面更简单i>.

标签: algorithm tree graph-theory shortest-path


【解决方案1】:

首先,按长度对输入路径进行排序。维护一组叶节点。这将包含每个有效路径的最后一个节点。添加叶节点后,我们将禁止任何包含该叶节点的路径。添加路径时,请根据叶节点集检查其每个成员。如果匹配,则路径无效,否则有效,应将其最后一个元素添加到叶节点集。

列表数量为 O(n log n),所有列表中的元素数量呈线性关系。

【讨论】:

  • 假设最长路径的长度s和路径的数量n,复杂度实际上是O(n*log n*s)
  • @Emadpres 说 n 是路径数,m 是元素数。那么这是 O(n log n) + O(m)。我不明白你为什么认为 n*s 涉及到它。
  • @Dave 我认为@Emadpres 是对的。尝试这些路径的算法:[1,2,3],[1,4,5],[1,6,7],[1,8,9]
  • @nightfury1204 好吧,如果所有路径的长度都相同,那么 m = s*n 所以我同意这种情况,但通常情况并非如此。也许不清楚我所说的 m 是什么意思?我的意思是路径长度的总和,而不是唯一元素的数量。
【解决方案2】:

尝试使用这些路径构建一棵树。对于每条路径,通过设置edge为连续节点,尝试从路径的第一个节点遍历到路径的最后一个节点。遍历完每条路径后,将路径的最后一个节点标记为叶子节点。如果在遍历路径时发现任何标记为叶子的节点,您将停止遍历。同时删除标记为叶节点的节点的子节点。最终树中从根节点到叶节点的每条路径都是您的答案。更多说明请参见下图:

复杂度将是所有路径长度的总和。

【讨论】:

  • 同时删除标记为叶节点的节点的子节点”是什么意思?
  • @Emadpres 见图。在After path 3 节点2 中有子34After path 4 [1,2] 删除节点 2 的子节点。
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多