从磁盘处理未定向图的最有效方法是什么?
我有以下问题陈述 -
对于每个人实体X
,我都有关于X的朋友的所有人实体Y1,Y2,Y3....
的信息
我需要找到所有与Y1,Y2,Y3.....
成为朋友但不是X的朋友的人实体。
这可以表示为内存中的无向图。
但是,考虑到需要为此问题加载的边缘可能非常大;服务器在给定时间容忍的类似请求的数量也是如此 - 我们如何处理二级存储的此问题?
我们非常感谢您提出任何建议或意见。
答案 0 :(得分:0)
为此,您只需使用BFS
的两个步骤:
X
开始并加载{{1}}的所有边缘,访问其每个邻居,将其放入列表并标记为已访问。X
friends of friends
列表,并标记已访问的节点。如果有任何歧义,请告诉我。
答案 1 :(得分:0)
一种方法是按排序顺序存储朋友列表(例如按ID排序)。
然后,为了找到一个人X的答案,你为X的每个朋友Y构建一个FIFO。
然后算法将按以下方式工作:
如果此过程在没有清空fifo的情况下停止,我们知道我们在所有Y朋友列表中找到了一个人M.
如果此人不是X的朋友,则输出M.
接下来将M增加1,然后返回步骤2.
请注意,当您返回到步骤2时,FIFO不会复位,因此此过程只会读取每个Y FIFO一次。
您需要有足够的内存来存储每个Y FIFO中的位置。 如果列表存储在磁盘上,您可能希望在单个磁盘访问中读取多个条目以提高性能。