使用Java 将二维数组转化为稀疏矩阵
先说一下思路.
在传统的二维数组进行信息存储时,如果有大量的零,也需要进行存储,这就造成了内存空间的浪费,稀疏矩阵可很好弥补该缺点.
在稀疏矩阵中,第一行为属性信息,一次表示原数组的行 列 总存储个数
如图红框所示:

在上述稀疏矩阵中
第一行的1 3 表示该元素为 原数组中 一行三列(注意数组下标从0开始),而最后的 1 则表示该位置上存放的值为1.
稀疏矩阵中内层数组的大小是固定的 为3, 既为稀疏矩阵的三个属性
而外层数组的大小则取决于 原数组的 非零数值个数 也就是下文中sum的值
大小问题解决后就是矩阵的填充,
在这里可以通过对二维数组进行遍历,通过if语句筛选出非零值,
然后将非零值以及非零值的行列数填入稀疏矩阵 此处注意i j可赋值给矩阵的第一二列
由于第0行表示了属性 所以要从第一行开始填写 这里可以设置计数器控制行数
最近在学习数据结构有关知识,代码技术仍有待提高,仅提供解决代码以供参考.
/**
*
* 二维数组--->稀疏数组
*/
import org.junit.Test;
public class Demo0318 {
@Test
public void test01(){
//创建一个原始的二维数组11*11
//0:表示没有棋子 1表示黑子 2 表白子
int chessArr1[][] = new int[11][11];
chessArr1[1][3] = 1;
chessArr1[2][8] = 2;
chessArr1[5][10] = 2;
int sum = 0;//记录非零值
System.out.println("二维数组:");
for (int[] arr:chessArr1
) {
for (int element:arr
) {
if (element!=0){
sum++;//遍历找到数组中的非零值
}
System.out.print(element+"\t");
}
System.out.println();
}
System.out.println(sum);
//将二维数组转化为稀疏矩阵
//确定新矩阵的行数以及列数
int[][] arr_2 = new int[sum+1][3];
int count = 0;
arr_2[0][0] = chessArr1.length;
arr_2[0][1] = chessArr1.length;
arr_2[0][2] = sum;
System.out.println("稀疏数组为:");
System.out.println(arr_2[0][0]+"\t"+arr_2[0][1]+"\t"+arr_2[0][2]+"\t");
for (int i = 0; i < chessArr1.length ; i++) {
for (int j = 0; j <chessArr1.length ; j++) {
if (chessArr1[i][j] != 0) {
count++;
arr_2[count][0] = i;
arr_2[count][1] = j;
arr_2[count][2] = chessArr1[i][j];
System.out.println(arr_2[count][0]+"\t"+arr_2[count][1]+"\t"+arr_2[count][2]+"\t");
}
}
}
//稀疏矩阵--->二维数组
System.out.println("二维数组:");
int[][] arr_3 = new int[arr_2[0][0]][arr_2[0][1]];
for (int i = 1;i< arr_2.length;i++){
arr_3[arr_2[i][0]][arr_2[i][1]] = arr_2[i][2];
}
for (int[] arr_4:arr_3
) {
for (int element:arr_4
) {
System.out.print(element+"\t");
}
System.out.println();
}
}
}
本人在转化稀疏矩阵时,在匹配位置信息时花费较长时间,没有将二维数组与稀疏矩阵之间的联系找清楚,应注意对二维数组进行遍历时,可通过 for循环中的 i j 确定二维数组中各项元素的位置信息.

本文介绍如何使用Java实现二维数组到稀疏矩阵的转换,通过遍历原数组获取非零元素并将其行列及值存入稀疏矩阵,再还原为二维数组。
1243

被折叠的 条评论
为什么被折叠?



