繁体   English   中英

在十亿个节点的无向​​图中无循环地从正好k个边的源节点中找到目标节点的算法/方法

[英]Algorithm/Approach to find destination node from source node of exactly k edges in undirected graph of billion nodes without cycle

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

键=源节点
值= hash_table {node1,node2,node3}

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

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

例如。 键='1'
值= {'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. 使用邻居节点的哈希表更深一层,找到目标节点的值,直到找到节点
  4. 如果在k深度上找不到节点,则停止
&nbsp1
|
{2 5 11}
| | |
{3,6,7} {nodes} {nodes} ....个连接的节点
| | | | |
{nodes} {nodes} {nodes} ....百万个连接的节点。


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

正如您所暗示的,这将在很大程度上取决于系统的数据访问特性。 Trincot所言 ,如果您仅限于单元素访问,那么您将真正陷入困境 但是,如果您可以管理块访问,那么就有机会进行并行操作。

但是,我认为这超出了您的控制范围:哈希函数拥有邻接特征-实际上,可能会“悲观”(与“优化”相反)该特征。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM