算法找出范围内的所有位置

时间:2014-02-25 13:45:07

标签: java performance graph graph-algorithm graph-databases

我需要处理一个包含超过10,000个节点的非常大的道路网络图。假设我在图中有一个源节点'S',它代表一个具有特定经度和纬度的地点或特定位置。现在我的应用程序需要找出图中“S”所代表的位置周围现实世界中5 km区域内存在的所有位置。假设我的图形非常密集,并且如上所述,在该5km区域内的图形中可能存在表示各种位置/位置的数百个节点。

节点表示位置,边缘权重表示范围从100米到100千米的两个相邻节点之间的距离。所以我的问题是 -

1)如何有效地找出所有节点,以便使用更少的内存和运行时间?是否使用任何特殊的数据结构或算法?

2)如果我在Java应用程序中使用neo4j图形数据库那么如何解决问题?代码段,neo4j +适当理论的密码查询将不胜感激。

*请考虑大规模网络提供解决方案。

编辑:在我的应用程序中,很可能一次又一次地处理节点,即;假设在一个实例中找到源节点“S”的所需节点,并且稍后在另一个实例中,对于与“S”相邻的另一节点“S1”执行相同的过程。因此,可能发生为“S”情况处理的节点,其中大部分被再次处理/遍历“S1”,因为“S”和“S1”是相邻的。那么有没有办法缓存结果,以便不再一次处理节点?任何有效的算法,而不是Dijkastra或BFS?在BFS中甚至可以进行任何缓存吗?

2 个答案:

答案 0 :(得分:0)

如果您使用Neo4j或其他表示图形的方式,您应该从源节点S执行BFS(广度优先搜索)。

在Neo4j中,您可以使用已经实现BFS的Traversal

如果你在问题上投入更多精力,你会得到更好的答案。如果不为你做所有的工作,几乎不可能给你一个更好的答案。

答案 1 :(得分:0)

我会使用Dejsktras算法修改,它在最坏的情况下使用O(n)操作

来自Wikipedia

  
      
  1. 为每个节点分配一个暂定距离值:为我们的初始节点设置为零,为所有其他节点设置为无穷大。
  2.   
  3. 标记未访问的所有节点。将初始节点设置为当前节点。创建一组未访问的节点,称为unvisited set,由all组成   节点。
  4.   
  5. 对于当前节点,考虑所有未访问的邻居并计算其暂定距离。比较新计算的   到当前指定值的暂定距离并指定   较小的一个。例如,如果当前节点A标有a   距离为6,与邻居B连接的边缘长度   2,那么到B(通过A)的距离将是6 + 2 = 8.如果B是   之前标记的距离大于8,然后将其更改为8。   否则,保持当前值。
  6.   
  7. 当我们考虑当前节点的所有邻居时,将当前节点标记为已访问并将其从中删除   未经审查的集合。永远不会再次检查访问过的节点。
  8.   
  9. 如果目标节点已标记为已访问(在规划两个特定节点之间的路由时)或最小暂定时间   未访问集合中的节点之间的距离是无穷大(当   计划完整的遍历;没有连接时发生   在初始节点和剩余的未访问节点之间),然后停止。   算法已经完成。
  10.   
  11. 选择标记有最小暂定距离的未访问节点,并将其设置为新的"当前节点"然后回去   到第3步。
  12.   

进行以下修改:

  

在第6点,如果距离超过给定范围则停止   算法,以及标记小于或等于给定的所有市场节点   范围是您要查找的节点

(注意:不清楚问题......我假设你有一个图,每个边都有两个相邻节点之间的距离......)