【发布时间】:2016-10-28 15:51:36
【问题描述】:
假设我有一个如下所示的二维数组 (G):
0 0 0 0 0 12 13 0
0 0 6 0 0 0 0 3
0 6 0 4 0 0 0 5
0 0 4 0 10 0 0 7
0 0 0 10 0 11 8 9
12 0 0 0 11 0 1 0
13 0 0 0 8 1 0 2
0 3 5 7 9 0 2 0
我必须遍历这样的数组并找到不为零的最小值。在我找到最小值后,我将它添加到另一个名为 H 的二维数组,它是空的,但与 G 具有相同的大小。一旦我将值添加到 H,然后我将 G 中的值设置为零并再次遍历数组以找到第 2 个最小值,然后是第 3 个,然后是第 4 个,依此类推。当 H 中的每一行都有一个值时,我停止遍历数组。所以对于上面的数组,在我第一次通过时,我会发现 1 是最低值,所以我将它添加到 H 中,如下所示:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0
这是我用java写的:
int numVerts = G.length;
int [][] H = new int[numVerts][numVerts];
while (/*there exists an empty row in H*/){
for (int i = 0; i < numVerts; i++){
for (int j = 0; j < numVerts; j++){
if ((G[i][j] != 0) && (G[i][j] < minWeight)){
minWeight = G[i][j];
k = i;
l = j;
}
}
}
H[k][l] = minWeight;
H[l][k] = minWeight;
G[k][l] = 0;
G[l][k] = 0;
}
所以我可以以任何我想要的方式解决这个问题,这就是我选择解决它的方式。所以我唯一要弄清楚的是,我如何判断 H 中的所有行是否至少有 1 个值,而不是直接遍历 H,因为我已经遍历 G 并在 H 的某些位置添加值。
【问题讨论】:
-
它是空的,但与 G 大小相同:这是矛盾的。根据定义,空数组的大小为 0。H 与 G 具有相同的宽度和高度,但用 0 填充,对吗?除非维度很大,否则不遍历 H 是过早的优化。但是您可以只使用 Set
包含用零填充的行集。每次将非零数字添加到行时,从集合中删除该行。当集合为空时,您就完成了。
标签: java arrays algorithm traversal minimum-spanning-tree