【发布时间】: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 级,并找到目标节点的值,直到找到节点
- 如果在 k 深度上找不到节点,则停止
  |
{2        5           11}
   |        |             |
{3,6,7} {nodes} {nodes} .... 连接节点
  |  |  |       |             |
{nodes} {nodes} {nodes} .... 百万个连接节点。
请提出建议。上面实现的类似于 BFS 的算法需要 3 个多小时来搜索所有可能的键值关系。可以用其他搜索方法减少吗?
【问题讨论】:
-
为什么说您的naive 解决方案效率不高?如果有数以百万计的候选人,除了在其中寻找之外别无他法。
-
这似乎是最简单的如何搜索元素的解决方案。我确实说这是一个幼稚的解决方案,因为可能存在我不知道的并行搜索或多线程搜索的可能性。
标签: python algorithm graph shortest-path breadth-first-search