我需要处理一个包含超过10,000个节点的非常大的道路网络图。假设我在图中有一个源节点'S',它代表一个具有特定经度和纬度的地点或特定位置。现在我的应用程序需要找出图中“S”所代表的位置周围现实世界中5 km区域内存在的所有位置。假设我的图形非常密集,并且如上所述,在该5km区域内的图形中可能存在表示各种位置/位置的数百个节点。
1)如何有效地找出所有节点,以便使用更少的内存和运行时间?是否使用任何特殊的数据结构或算法?
2)如果我在Java应用程序中使用neo4j图形数据库那么如何解决问题?代码段,neo4j +适当理论的密码查询将不胜感激。*请考虑大规模网络提供解决方案。
编辑:在我的应用程序中,很可能一次又一次地处理节点,即;假设在一个实例中找到源节点“S”的所需节点,并且稍后在另一个实例中,对于与“S”相邻的另一节点“S1”执行相同的过程。因此,可能发生为“S”情况处理的节点,其中大部分被再次处理/遍历“S1”,因为“S”和“S1”是相邻的。那么有没有办法缓存结果,以便不再一次处理节点?任何有效的算法,而不是Dijkastra或BFS?在BFS中甚至可以进行任何缓存吗?
答案 0 :(得分:0)
如果您使用Neo4j或其他表示图形的方式,您应该从源节点S
执行BFS(广度优先搜索)。
在Neo4j中,您可以使用已经实现BFS的Traversal。
如果你在问题上投入更多精力,你会得到更好的答案。如果不为你做所有的工作,几乎不可能给你一个更好的答案。
答案 1 :(得分:0)
我会使用Dejsktras算法修改,它在最坏的情况下使用O(n)操作
- 为每个节点分配一个暂定距离值:为我们的初始节点设置为零,为所有其他节点设置为无穷大。
- 标记未访问的所有节点。将初始节点设置为当前节点。创建一组未访问的节点,称为unvisited set,由all组成 节点。
- 对于当前节点,考虑所有未访问的邻居并计算其暂定距离。比较新计算的 到当前指定值的暂定距离并指定 较小的一个。例如,如果当前节点A标有a 距离为6,与邻居B连接的边缘长度 2,那么到B(通过A)的距离将是6 + 2 = 8.如果B是 之前标记的距离大于8,然后将其更改为8。 否则,保持当前值。
- 当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从中删除 未经审查的集合。永远不会再次检查访问过的节点。
- 如果目标节点已标记为已访问(在规划两个特定节点之间的路由时)或最小暂定时间 未访问集合中的节点之间的距离是无穷大(当 计划完整的遍历;没有连接时发生 在初始节点和剩余的未访问节点之间),然后停止。 算法已经完成。
- 选择标记有最小暂定距离的未访问节点,并将其设置为新的"当前节点"然后回去 到第3步。
醇>
进行以下修改:
在第6点,如果距离超过给定范围则停止 算法,以及标记小于或等于给定的所有市场节点 范围是您要查找的节点
(注意:不清楚问题......我假设你有一个图,每个边都有两个相邻节点之间的距离......)