【问题标题】:Vertex representation of a weighted unidirectional graph加权单向图的顶点表示
【发布时间】:2012-04-20 14:49:57
【问题描述】:

我正在使用邻接矩阵来表示我的加权单向大图的所有顶点。在该图中,没有边将顶点连接到自身。这使得我的邻接矩阵null 的所有对角元素。由于我的图很大,所以在邻接矩阵中我不需要在左三角形中保存任何元素。下面是一个带有邻接矩阵的小样本图。

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

【问题讨论】:

    标签: java data-structures graph adjacency-matrix


    【解决方案1】:

    Java 并没有真正的二维数组,尽管有用于分配数组数组的语法糖。

    你可能只是想要:

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

    这将分配你想要的三角形。然后只需索引行 r, col c at weight[r][c-r-1]。

    另一种选择是使用单个数组

    int[] weight = new int[N*(N-1)/2];
    

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

    【讨论】:

    • 是的....这就是我想要的。我现在必须考虑一维数组中的索引计算。谢谢。
    • int[][] weight = new int[N][]; for (int i = 0; i &lt; N; i++) weight[i] = new int[N-1-i]; 很酷。
    • 经过一番头脑风暴后,我终于可以使用维度为n(n-1)/2 的一维array 并且可以通过以下公式访问任何元素-index=n*row+col-(row+1)(row+2)/2 这里index 是一维数组的索引,并且rowcol 属于二维数组,维度为 n*n
    【解决方案2】:

    您可以使用锯齿状数组。

    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 也许我在这里搞砸了一些界限,但你还是应该明白重点:)

    【讨论】:

    • 我有一个问题。如果我设计了一个array[m][n]。我只为它的一些元素赋值。那么这个数组中存在的剩余元素呢?它们会占用内存空间吗?
    • 这里的重点是您为每一行分配您需要的数量。第一行例如 5,第二行 4,最后一行 1 元素。它不是一个普通的二维数组。它被称为之字形或锯齿形阵列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多