我是Java的新手,正在使用图形。我有一个随时间变化的图形(例如,同一图形在不同时间实例中的5个快照),我需要在每个图形上计算一些基本的网络指标,例如密度,大小,中心度等。我想知道我可以使用哪些基本数据结构来存储和执行每个图。我尝试使用邻接矩阵,但是节点大小太大且动态,这导致效率低下。我遇到了几个库,特别是JgraphT来保存无向图
UndirectedGraph<String, DefaultEdge> G =
new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);
但这是一张图。有没有一种方法可以创建这些无向图的数组,或者我缺少其他任何方法来存储时间演化图?
一些选择:
(1)您可以像创建任何其他对象一样创建图的数组(或列表或集合等)。如果所有时间步长都容易放入内存中(例如100个时间步长,每个时间步长为1000个节点/边缘),那么这应该可以正常工作。这是一个使用JUNG的示例:
List<Graph<V, E>> graphList = new ArrayList<>(); // Java 7 syntax
Graph<V, E> graph = new DirectedSparseGraph<V, E>();
// populate 'graph'
graphList.add(graph);
(2)如果每个图中的节点都相同(即,只是边缘在变化),则将节点存储一次,并存储一组边缘集的列表,每个时间步长一组。
(3)如果整个图是相对静态的,则可以存储原始图,然后存储每个时间步的增量(添加/删除的节点或边)。这可以大大节省空间,但是需要重构步骤1-n才能看到时间n + 1的状态。
(4)最后,您可以使用一个图,用出现的间隔注释每个节点/边缘,并在您想对图应用算法时随时应用过滤器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句