所有文章不设限,我们相遇偶然,相散坦然,互不打扰,各自安好,向阳而生
首先,我们对于稀疏数组做一个解释!
稀疏数组是一种数据结构,它主要用于存储存在大量重复元素的数组。与普通数组不同的是,稀疏数组只存储非零元素的值和它们的位置,而对于其它所有位置的值认为是默认值(通常是0),以此减少存储空间的占用。
举个例子,如果一个普通数组中有10000个元素,但其中只有100个元素的值不为0,那么使用稀疏数组就可以只存储这100个元素的值和位置,而不必存储剩余的9900个元素,从而节省了存储空间。
稀疏数组通常以三元组的形式来表示:(i, j, val),其中 i 和 j 分别是非零元素的行和列索引,val 是该位置上的值。可以使用一个二维数组来存储这些三元组。
将一个二维数组转换为稀疏数组的步骤如下:
-
遍历整个二维数组,统计非零元素的数量,得到稀疏数组中的行数。通常是稀疏数组中的第一行记录原始数组的行数、列数和非零元素的数量。
-
根据第一步得到的非零元素的数量,创建稀疏数组,并对其进行初始化,包括第一行和其它行。
-
再次遍历整个二维数组,将所有非零元素的值和索引存储到稀疏数组的剩余行中。
-
最后得到的稀疏数组就是原始二维数组的稀疏形式。
接下来,我们代码演示
//构建初始数组
int arrOrigin[][] = new int[11][11];
//数值填充
arrOrigin[1][2] = 1;
arrOrigin[4][5] = 2;
//输出原始数组
for (int i = 0; i < arrOrigin.length; i++) {
for (int j = 0; j < arrOrigin.length; j++) {
System.out.printf("%d\t", arrOrigin[i][j]);
}
System.out.println();
}
System.out.println("==================================================================");
//转换为稀疏数组
int sum = 0;
for (int i = 0; i < arrOrigin.length; i++) {
for (int j = 0; j < arrOrigin.length; j++) {
if (arrOrigin[i][j] != 0) {
sum++;
}
}
}
int newArrOrigin[][] = new int[sum + 1][3];
//稀疏数组赋值
newArrOrigin[0][0] = arrOrigin.length;
newArrOrigin[0][1] = arrOrigin.length;
newArrOrigin[0][2] = 2;
int count = 0; //计数器
for (int i = 0; i < arrOrigin.length; i++) {
for (int j = 0; j < arrOrigin.length; j++) {
if (arrOrigin[i][j] != 0) {
count++;
newArrOrigin[count][0] = i;
newArrOrigin[count][1] = j;
newArrOrigin[count][2] = arrOrigin[i][j];
}
}
}
//稀疏数组输出
for (int i = 0; i < newArrOrigin.length; i++) {
for (int j = 0; j < newArrOrigin.length; j++) {
System.out.printf("%d\t", newArrOrigin[i][j]);
}
System.out.println();
}
然后我们再看,如何将稀疏数组转换为二维数组,我们举一反三,理解透彻
将稀疏数组转换为二维数组的步骤如下:
-
读取稀疏数组的第一行,得到原始二维数组的行数、列数和非零元素的数量。
-
根据原始二维数组的行数、列数和非零元素的数量,创建新的二维数组,并初始化所有元素为0。
-
读取稀疏数组的剩余行,将非零元素的值存储到新的二维数组对应的位置上。
-
最后得到的二维数组就是原始稀疏数组所表示的二维数组。
下面是一个示例代码
//稀疏数组转换为二维数组
int chessArr[][]=new int[newArrOrigin[0][0]][newArrOrigin[0][1]];
for (int i = 1; i < newArrOrigin.length; i++) {
chessArr[newArrOrigin[i][0]][newArrOrigin[i][1]]=newArrOrigin[i][2];
}
//输出转化后的数组
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
System.out.printf("%d\t", chessArr[i][j]);
}
System.out.println();
}
这样,我们就完成了稀疏数组——二维数组之间的转换