假设我有一个二维数组(G),如下所示:
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
我必须遍历这样的数组并找到不为零的最小值。在找到最小值后,我将其添加到另一个名为H的二维数组中,该数组为空但与G具有相同的大小。一旦我将值添加到HI,然后将G中的值设置为零并再次遍历数组以查找第二个最小值,然后是第三个,然后是第四个,依此类推。当H中的每一行都有一个值时,我会停止遍历数组。所以对于上面的数组,在我的第一次传递中,我会发现1是最低值,所以我将它添加到H中,如下所示:
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;
}
这是我在java中写的:
mapPartitions()
所以我可以用任何我想要的方式解决这个问题,这就是我选择解决它的方式。所以我唯一需要弄清楚的是如何判断H中的所有行是否至少有1个值,而不是通过H遍历,因为我已经遍历G并在H中的某些位置添加值。 / p>
答案 0 :(得分:4)
你不想再次遍历H.所以你必须以某种方式存储你在其中放置新值的H行。
你可以将一个布尔数组设为H中行数的大小。然后在每次向H添加内容之后,在布尔数组中将行的值设置为true。然后迭代遍历布尔数组并查看值是否仍为false。如果不是这样,你就完成了。