加权单向图的顶点表示

时间:2012-04-07 07:43:25

标签: java data-structures graph adjacency-matrix

我使用邻接矩阵来表示我的加权单向大图的所有顶点。在此图中,没有边将顶点连接到自身。这使得我的邻接矩阵null的所有对角元素成为可能。因为我的图形很大,所以在邻接矩阵中我不需要保存左三角形中的任何元素。下面是一个带有邻接矩阵的小样本图。 This is the sample small graph with adjacency matrix

在单向图中,左三角形只是直角三角形的镜像。即adjacency_matrix[i][j]adjacency_matrix[j][i]是相同的。那么为什么要存储左三角形呢?对于大图,这个技巧可以节省大量内存。同时,对角线元素也为零,因为没有边缘将顶点连接到自身。即adjacency_matrix[i][i]为零。 但是我该如何实现呢?可以在这里使用2D数组吗?

2 个答案:

答案 0 :(得分:3)

Java并不真正拥有2D数组,尽管存在用于分配数组数组的合成糖。

你可能只想要:

int[][] weight = new int[N][];
for (int i = 0; i < N; i++) weight[i] = new int[N-1-i];

那将分配你想要的三角形。然后只在权重[r] [c-r-1]索引行r,col c。

另一种选择就是使用带

的单个数组
int[] weight = new int[N*(N-1)/2];

索引的计算可能有点复杂,但分配和指针开销较少。

答案 1 :(得分:1)

您可以使用锯齿状阵列。

int[][] matrix = new int[N][];
for (int i = 1; i <= N; i++) {
   matrix[i] = new int[N - i + 1];
   for (int j = 1; j <= N - i + 1; j++)
       matrix[i][j] = edgeValue;
}

基本上,您可以根据需要为每一行分配。

P.S也许我在这里弄乱了一些界限,但你仍然应该得到主要观点:)