在无循环的十亿节点的无向​​图中从精确k个边缘的源节点中寻找目的节点的算法/方法

时间:2016-11-18 22:14:41

标签: python algorithm graph shortest-path breadth-first-search

考虑我有一个使用哈希表构建的十亿个节点的邻接列表,按以下方式排列:

key =源节点
value = hash_table {node1,node2,node3}

输入值来自文本文件,格式为

1,2
1,5
1,11
......等等

例如。 key ='1'
value = {'2','5','11'}
装置1连接到节点2,5,11

我想知道一种算法或方法,可以在没有周期的十亿个节点的无向​​图中从k个边缘的源节点中找到目标节点

例如。从节点1我想找到节点50直到深度3或直到3边缘。

我的假设算法找到1 - 2 - 60 - 50这是最短的路径,但使用上述邻接列表结构如何有效地进行遍历? 我不想使用Hadoop / Map Reduce。

我在Python中提出了如下的天真解决方案,但效率不高。唯一的事情是在O(1)中的哈希表搜索键,所以我可以直接搜索邻居及其十亿邻居的密钥。以下算法需要很多时间。

  1. 从源节点开始
  2. 使用哈希表搜索查找密钥
  3. 使用邻居节点的哈希表深入1级,并找到目标节点的值,直到找到节点
  4. 如果在k深度找不到节点,则停止
  5. 1
    |
    {2 5 11}
    | | |
    {3,6,7} {nodes} {nodes} ....连接节点
    | | | | |
    {nodes} {nodes} {nodes} ......万个连接节点。


    请建议。上面实现的类似于BFS的算法需要3个多小时才能搜索所有可能的键值关系。可以用其他搜索方法减少吗?

1 个答案:

答案 0 :(得分:0)

正如您所暗示的,这将在很大程度上取决于您系统的数据访问特性。如果您被限制为单元素访问,那么您将真正陷入困境,因为 trincot 会观察到。但是,如果您可以管理块访问,那么您有可能进行并行操作。

然而,我认为会超出你的控制范围:哈希函数拥有邻接特征 - 事实上,可能会“迷恋”(与“优化”相反)这一特征。

我确实看到了一个可能的希望:使用迭代而不是递归,维护要访问的节点列表。在列表中放置新节点时,请获取其哈希值。如果您可以组织按位置聚类的节点,则可以执行块传输,在一次读取操作中访问多个值。