如何找到对象数组中两个节点之间的最短路径?

时间:2019-04-03 12:57:48

标签: javascript database graph shortest-path dijkstra

我有10,000多个数据(Users)来自JSON格式的API,并且有两个节点(即2个Users),我想找到两个{{1}之间的最短路径}。

当我意识到要找到最短的路径时,可以使用Dijkstra的算法,但是要做到这一点,我必须创建一个图表,该图表不足以容纳10,000多个数据。

例如,我发出一个API请求

Users

每个用户都是对象

fetch('https://jsonplaceholder.typicode.com/users')
  .then(res => res.json())
)

问题是要根据他们所服务的公司来查看两个用户之间的关系

我根本无法开始,因为数据非常庞大。我只想知道,我们该怎么做?我们是否可以创建图并应用Dijkstra的算法?

我要做的就是真正遍历每个用户并检查公司数组。

  {
    "name": "Leanne Graham",
    "address": {...}
    },
    "website": "hildegard.org",
    "company": [
      "Romaguera-Crona",
      "Google",
      "Facebook"
    ]
  }

1 个答案:

答案 0 :(得分:0)

据我所知,这是您简化为How to create edges between nodes that have similarities中问题的原始问题。您的减少是有用的,但是在不知道数据性质的情况下(即它代表一个工作人员所在的公司),问题变得更加普遍。因为这是真实数据,所以我们可以假设一些事情,例如平均每个用户的工作条目不超过10个,而且并非所有用户都在同一家公司工作。这意味着该图将非常稀疏。

要构建用户图,您可以采纳另一篇文章中的第二条建议:

  • 从公司名称到为该公司工作的所有用户的集合建立映射

  • 遍历公司名称,遍历为每个公司工作的所有用户对,并在尚未连接的情况下将其与边缘连接

这仍然是一个相当大的图表:对于1万名用户,如果平均每个用户与100个其他用户一起工作,则最终可能会有一百万个边缘。但是,现代计算机无法将其存储在RAM中。我不确定Java的内存效率如何-如果您愿意切换到性能更高的语言,则可以考虑使用该选项。

现在您有了一个图,并且希望找到两个节点之间的最短路径(我想重复一次)。请注意,由于您的图形没有权重,因此不需要Djikstra的算法。您可以运行O(N+M)时间运行的BFS,其中N是用户数,M是边数。对于一百万个边缘,它可以在Java中轻松地在一秒钟内运行,但在Javascript中可能要花几秒钟。