磁盘上的无向图

时间:2015-03-01 10:25:27

标签: algorithm graph graph-algorithm

从磁盘处理未定向图的最有效方法是什么?

我有以下问题陈述 -
对于每个人实体X,我都有关于X的朋友的所有人实体Y1,Y2,Y3....的信息 我需要找到所有与Y1,Y2,Y3.....成为朋友但不是X的朋友的人实体。

这可以表示为内存中的无向图。

但是,考虑到需要为此问题加载的边缘可能非常大;服务器在给定时间容忍的类似请求的数量也是如此 - 我们如何处理二级存储的此问题?

我们非常感谢您提出任何建议或意见。

2 个答案:

答案 0 :(得分:0)

为此,您只需使用BFS的两个步骤:

  • 从您的节点X开始并加载{​​{1}}的所有边缘,访问其每个邻居,将其放入列表并标记为已访问。
  • 创建了列表并将其命名为X
  • 对于访问列表中的每个节点:
    • 加载它的边缘,访问它的邻居:
    • 对于您访问过的每个节点,如果它未标记为已访问,请将其放入friends of friends列表,并标记已访问的节点。
    • 卸载为此节点加载的边。

如果有任何歧义,请告诉我。

答案 1 :(得分:0)

一种方法是按排序顺序存储朋友列表(例如按ID排序)。

然后,为了找到一个人X的答案,你为X的每个朋友Y构建一个FIFO。

然后算法将按以下方式工作:

  1. 从每个Y FIFO中读取第一个人并跟踪看到的最大ID(M)
  2. 如果id小于M,则继续读取每个Y FIFO中的元素;如果id较大,则更新M.如果id与M匹配,则转到下一个fifo。
  3. 如果一个fifo变空,那么我们就完成了。
  4. 如果我们在不增加M的情况下检查了所有的fifos,那么我们就停止循环(我们已经找到了要输出的东西)
  5. 如果此过程在没有清空fifo的情况下停止,我们知道我们在所有Y朋友列表中找到了一个人M.

    如果此人不是X的朋友,则输出M.

    接下来将M增加1,然后返回步骤2.

    请注意,当您返回到步骤2时,FIFO不会复位,因此此过程只会读取每个Y FIFO一次。

    您需要有足够的内存来存储每个Y FIFO中的位置。 如果列表存储在磁盘上,您可能希望在单个磁盘访问中读取多个条目以提高性能。