Algorithm 哪种技术将用于在计算机程序中表示一个非常大的无向图以进行操作?
我正在处理一个非常大的无向图(公司的电子邮件网络) 我有点困惑于如何选择电子邮件网络无向图的最佳和合适的技术。在该网络中,顶点表示电子邮件地址,边表示两个地址之间在一个方向上至少有一封电子邮件 是否有人知道表示算法的最佳技术Algorithm 哪种技术将用于在计算机程序中表示一个非常大的无向图以进行操作?,algorithm,data-structures,graph,graph-algorithm,undirected-graph,Algorithm,Data Structures,Graph,Graph Algorithm,Undirected Graph,我正在处理一个非常大的无向图(公司的电子邮件网络) 我有点困惑于如何选择电子邮件网络无向图的最佳和合适的技术。在该网络中,顶点表示电子邮件地址,边表示两个地址之间在一个方向上至少有一封电子邮件 是否有人知道表示算法的最佳技术 我使用的是一个大的无向邮件图,那么哪种表示方式好呢?邻接列表或邻接矩阵?它取决于相互发送电子邮件的人数以及在图形上执行的操作 如果两个人很有可能互相发过电子邮件,那么你应该使用邻接矩阵 另一方面,如果边缘的数量(两个人相互至少发送了一封电子邮件)与电子邮件地址的数量相比很小
我使用的是一个大的无向邮件图,那么哪种表示方式好呢?邻接列表或邻接矩阵?它取决于相互发送电子邮件的人数以及在图形上执行的操作 如果两个人很有可能互相发过电子邮件,那么你应该使用邻接矩阵 另一方面,如果边缘的数量(两个人相互至少发送了一封电子邮件)与电子邮件地址的数量相比很小,则应使用邻接列表 另一件需要注意的事情是您在图形上执行的操作类型 因此,如果大多数操作包括查询两个节点之间是否有边,那么邻接矩阵将是最佳选择 另一方面,如果大多数操作都是遍历图或查询连接到给定节点的节点列表,那么邻接列表会更好 如果混合使用这两种类型的查询,则可以将图形表示为哈希表数组。因此,它将是使用哈希表而不是列表的邻接列表表示 更新 请检查这个问题的答案。它们详细解释了邻接列表和邻接矩阵之间的区别 以找出边的数量 我会运行一个程序来计算边的数量。它将如下所示:
mp = hash_table
for email in emails
if !mp[email.sender][email.receiver]
mp.insert({email.sender, email.receiver})
end
end
return mp.size
如果程序崩溃,那么您可能已经超出了内存,并且与电子邮件地址的数量相比,边缘的数量很大(因为电子邮件地址的数量是数百万[,如注释中所述]),您可能希望使用邻接列表
如果你真的想找到确切的边数,你可以对每段由同一发件人的电子邮件组成的电子邮件进行分段,并在每个分段上运行上述程序,那么最终的答案将是结果的总和是否使用邻接矩阵或邻接列表取决于图的密度。代表公司电子邮件网络的图表通常是稀疏的,因为只有一小部分员工需要相互发送邮件。例如,你不会给与你不在同一部门的人发电子邮件。因此,您可以使用邻接列表。答案取决于节点的数量(员工数量)和要发送到数据结构的查询,而且连接数的分布也非常有用(即50%<50,90%<100)。除非你提供这些,否则你只能收到一般性的答案。谢谢:)那么我应该使用邻接列表,因为有大量的电子邮件网络?如果边的数量与它们相比很小,那么是的。我喜欢一个可以解释更多的问题。请检查更新E是一个大型网络,每2个节点之间至少有一条边,那么,我们如何猜测节点中有多少条边?我不知道电子邮件网络的确切数字。@Jennie电子邮件地址是多少。是几百万吗?几十亿?大约几百万