【问题标题】:Algorithm/Approach to find destination node from source node of exactly k edges in undirected graph of billion nodes without cycle在无环的十亿节点的无向​​图中从恰好k条边的源节点中找到目标节点的算法/方法
【发布时间】:2016-11-18 22:14:41
【问题描述】:

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

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

输入值来自
from,to
形式的文本文件 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. 使用邻居节点的哈希表深入 1 级,并找到目标节点的值,直到找到节点
  4. 如果在 k 深度上找不到节点,则停止
&nbsp1
&nbsp&nbsp|
{2 &nbsp&nbsp&nbsp&nbsp &nbsp 5 &nbsp&nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp 11}
&nbsp&nbsp | &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp| &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp |
{3,6,7} {nodes} {nodes} .... 连接节点
&nbsp |&nbsp | &nbsp| &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp| &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp |
{nodes} {nodes} {nodes} .... 百万个连接节点。


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

【问题讨论】:

  • 为什么说您的naive 解决方案效率不高?如果有数以百万计的候选人,除了在其中寻找之外别无他法。
  • 这似乎是最简单的如何搜索元素的解决方案。我确实说这是一个幼稚的解决方案,因为可能存在我不知道的并行搜索或多线程搜索的可能性。

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


【解决方案1】:

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

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

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

【讨论】:

  • 嗨@Prune,我了解维护列表中的访问节点,但您能否详细说明按位置聚集节点的组织方式?
  • 大数据访问速度的问题之一是数据分布在不同的存储块之间。如果你对你的存储介质了解一点,你可以解决这个问题。维护要检查的节点列表。更改您的优先方法以按存储邻域而不是检测顺序获取它们。
  • 是不是和B Tree相关的数据结构有关?因为如果我没记错的话,你描述的方法似乎是 B Tree 所做的
  • 不,这不是那种关系。我认为您将节点 data 与节点 address 混淆了。 B-tree 对数据进行平衡。您的问题在于优化数据读/写,这取决于地址。
猜你喜欢
  • 2016-04-12
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多