我正在处理一个非常大的无向图(公司的电子邮件网络)。
对于如何选择最适合的电子邮件网络无向图技术,我有点困惑。在该网络中,顶点表示电子邮件地址,边表示两个地址之间在一个方向上至少有一封电子邮件。
是否有人知道表示算法的最佳技术?
我使用的是一个大的邮件无向图,那么哪个表示法是好的呢邻接表还是邻接矩阵?
最佳答案
这取决于相互发送电子邮件的人数以及在图表上执行的操作。
如果两个人互相发电子邮件的可能性很高,那么你应该使用邻接矩阵。
另一方面,如果边的数量(2个人谁发电子邮件给对方至少一个)比你应该去的邻接列表电子邮件地址的数量小。
另一件要看的事情是你在图上做什么类型的操作。
因此,如果大多数操作都是查询两个节点之间是否有边,那么邻接矩阵将是最佳选择。
另一方面,如果大多数操作是遍历图或查询连接到给定节点的节点列表,那么邻接列表会更好。
如果同时执行这两种类型的查询,则可以将图形表示为哈希表数组。因此,它将是使用哈希表而不是列表的邻接列表表示。
更新
请检查这个question的答案。它们详细解释了邻接表和邻接矩阵之间的区别。
为了找出边的数目
我会运行一个程序来计算边的数目。如下所示:
mp = hash_table
for email in emails
if !mp[email.sender][email.receiver]
mp.insert({email.sender, email.receiver})
end
end
return mp.size
如果程序崩溃了,那么你可能已经超出了内存,并且与电子邮件地址的数目相比,边缘的数目很大(因为电子邮件地址的数目是数百万[如注释中所述]),你可能想使用邻接列表。
如果你真的想找到确切的边缘数,你可以将每个部分都由同一发件人的电子邮件组成的电子邮件进行分段,然后在每个部分上运行上面的程序,最后的答案将是结果的总和