在 Java 中创建图形数组(时间演变)

Creating an array of graphs (time evolving) in Java

我是 Java 的新手,正在处理图表。我有一个时间演化图(例如,同一图在不同时间实例的 5 个快照),我需要计算一些基本的网络指标,如密度、大小、中心性等。我想知道我可以使用哪些基本数据结构来存储每个图并对其执行计算。我尝试使用邻接矩阵,但节点大小太大且动态导致效率低下。我遇到了几个库,特别是 JgraphT 来保存无向图

    UndirectedGraph<String, DefaultEdge> G =
          new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);

但这是一张图表。有没有办法创建这些无向图的数组或我缺少的任何其他方式来存储时间演化图?

几个选项:

(1) 您可以像创建任何其他对象一样创建图形数组(或列表、集合等)。如果所有的时间步长都能轻松地放入内存中(比如 100 个时间步长,每个时间步长 1000 nodes/edges),那么这应该可以正常工作。下面是一个使用 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) 如果整个图是相对静态的,你可以存储原始图,然后存储每个时间步的deltas(added/removed个节点或边)。这可能 space 效率更高,但需要您重建步骤 1-n 以便查看时间 n+1 时的状态。

(4) 最后,您可以使用单个图形,用它出现的时间间隔注释每个 node/edge,并在您想要将算法应用于图。