密集和稀疏的运行时间

时间:2014-12-05 20:10:32

标签: java algorithm graph sparse-matrix

我正在尝试创建一个在图中找到最短路径的程序。例如,我再制作100个顶点和100个边,然后再制作100个顶点和500个边,并测量它们的运行时间。

我的问题是如何理解这是密集还是稀疏?

2 个答案:

答案 0 :(得分:1)

密度是图表中边缘数量与具有相同顶点集的完整图表中边缘数量的比率。

这两个图都相当稀疏,但第一个是稀疏的。

图表的密度通常用于决定用于表示图表的数据结构

  • adjacency matrix对于密集图表有意义,其中枚举出站边缘不是常见操作。
  • Edge lists对稀疏图表或频繁完成枚举出站边缘的位置有意义。

但这是一种权衡。邻接图随着顶点计数的缩放而占用更多内存,但获取两个顶点之间的边的列表很快。扫描所有出站边缘的速度很慢。

边缘列表随着顶点数量的增加占用更少的内存,因此查找两个顶点之间的边缘较慢,但枚举输出边缘的速度很快。

答案 1 :(得分:0)

不幸的是#34;密集"和"稀疏"不容易应用于单个图表。通常,稀疏图是边密度为o(n ^ 2)的图,而密集图是边密度不是o(n ^ 2)的图。但是,这不能应用于单个图形,只是一系列图形,其大小正在增长到无穷大。

A"启发式"您可以使用的是:如果我在n个顶点(或n个顶点上的一系列图形)上有图形,我是否有c * n个边(c是常数,相对较小),例如2n个边缘,或3n个边缘,或7n个边缘?如果是,那么你有一个稀疏图。否则,我有1/2 n ^ 2边缘的东西吗?或1/3 n ^ 2边?或1/10 n ^ 2边?如果是,它是密集的。

在你的例子中,100个顶点和500个边缘非常稀疏,因为5 * n边缘似乎更多"合理"超过1/200 n ^ 2.