我有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"
]
}
答案 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中可能要花几秒钟。