Java数据结构(1)----二维数组和稀疏数组的互相转化

二维数组和稀疏数组的互相转化

代码如下:

//二维数组转化为稀疏数组  稀疏数组恢复为二维数组
public class SparseArrayTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		//定义一个二维数组arrayone(原生二维数组)
//		Scanner aScanner = new Scanner(System.in);
//		System.out.println("输入棋盘行列数(行列数相同,棋盘为正方形):");
//		int index = aScanner.nextInt();
//		int[][] arrayone = new int[index][index];
		int[][] arrayone = new int[9][9];
		//对二维数组进行写值,其他部分为0;
		//0为未下子 1为下黑子 2为下红子
		arrayone[2][3] = 1;
		arrayone[4][5] = 2;
		//遍历二维数组
		for (int[] row:arrayone) {
			for (int data:row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		//遍历二维数组得到非0的数据个数
		int sum = 0;
		for (int i = 0; i < arrayone.length; i++) {
			for (int j = 0; j < arrayone.length; j++) {
				if(arrayone[i][j] != 0) {
					sum++;
				}
			}
		}
		System.out.println("非0个数为:"+sum);
		
		//创建稀疏数组arraytwo(由原二维数组演化)
		int[][] arraytwo = new int[sum+1][3];//3为确定列数为3
		//往稀疏数组中存入值
		arraytwo[0][0] = 9;
		arraytwo[0][1] = 9;
		arraytwo[0][2] = sum;
		//遍历二维数组 将二维数组中不为0的数存入稀疏数组
		int count = 0;
		for (int i = 0; i < arrayone.length; i++) {
			for (int j = 0; j < arrayone.length; j++) {
				if (arrayone[i][j] != 0) {
					//不为0则说明是下的黑子或者红子 此时count++ 
					//count为此时稀疏数组的行数
					//因为第0行为二维数组总行数总列数以及非0数个数
					//所以count开始从稀疏数组的第1行开始
					count++;
					arraytwo[count][0] = i;
					arraytwo[count][1] = j;
					arraytwo[count][2] = arrayone[i][j];
				}
			}
		}
		System.out.println("变化后的稀疏数组为");
		//赋值完毕开始遍历稀疏数组
		for (int[] row:arraytwo) {
			for (int data:row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
		//将稀疏数组重新转化为二维数组
		//定义一个新的二维数组为稀疏数组恢复后的数组arraythree
		int[][] arraythree = new int[arraytwo[0][0]][arraytwo[0][1]];
		
		for (int i = 1; i < arraytwo.length; i++) {
			arraythree[arraytwo[i][0]][arraytwo[i][1]] = arraytwo[i][2];
		}
		
		for (int i = 0; i < arraythree.length; i++) {
			
		}
		System.out.println("恢复后的二维数组为");
		for (int[] row:arraythree) {
			for (int data:row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}

}

输出结果为:
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 0 0 0 0 0 0 0 0
0 0 0 0 0 2 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个数为:2
变化后的稀疏数组为
9 9 2
2 3 1
4 5 2
恢复后的二维数组为
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 0 0 0 0 0 0 0 0
0 0 0 0 0 2 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的值的个数sum;
2.根据得到的不为0的个数的sum再创建一个新的稀疏数组[sum+1][3]
3.在进行遍历原始二维数组将其中不为0的数存入稀疏数组中。
4.遍历稀疏数组

稀疏数组转化为二维数组;
1.创建新的二维数组,然后读取稀疏数组的第0行,为新的二维数组分配行列
2.再读取稀疏数组除第0行的数据后的几行,将数据赋给新二维数组
3.遍历新二维数组,和原数组一样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要计算二维数组的行列式,可以使用行列式的定义来计算。假设给定一个二维数组A,其行数为n,列数为m,则该二维数组可以表示为A = [a_ij],其中i表示行索引,j表示列索引。 对于一个2x2的二维数组,其行列式计算公式为: |a b| |c d| = ad - bc 对于一个大于2x2的二维数组,可以使用余子式和代数余子式来计算其行列式。具体步骤如下: 1. 选择一行或一列作为基准,假设选择第一行。 2. 将基准行或列的每个元素看作一个小矩阵的左上角元素,然后计算这个小矩阵的行列式。这个小矩阵的行列式称为该元素的余子式。 3. 对于每个余子式,乘以该元素的代数余子式,得到一个数值。奇数行奇数列的元素代数余子式为该元素的余子式的相反数,偶数行偶数列的元素代数余子式为该元素的余子式。 4. 将所有数值相加得到最终的行列式的值。 下面是Java代码实现该算法的示例: ```java public static int determinant(int[][] A) { int n = A.length; int m = A[0].length; if (n != m) { throw new IllegalArgumentException("Matrix is not square."); } int det = 0; if (n == 2) { det = A[0][0] * A[1][1] - A[0][1] * A[1][0]; } else { for (int j = 0; j < m; j++) { int[][] M = new int[n - 1][m - 1]; for (int i = 1; i < n; i++) { for (int k = 0; k < m; k++) { if (k < j) { M[i - 1][k] = A[i][k]; } else if (k > j) { M[i - 1][k - 1] = A[i][k]; } } } int sign = (j % 2 == 0) ? 1 : -1; det += sign * A[0][j] * determinant(M); } } return det; } ``` 该算法的时间复杂度为O(n!),其中n为二维数组的大小。如果需要计算更大的二维数组的行列式,可以考虑使用高斯消元或LU分解等更高效的算法。 ### 回答2: 矩阵乘法是线性代数中的基础运算之一,也是计算机科学中经常用到的运算之一。在Java中,使用二维数组表示矩阵,可以通过循环嵌套实现矩阵乘法。 矩阵乘法的原理是将矩阵A的行与矩阵B的列对应相乘再求和,得到矩阵C中对应位置的值。具体实现过程如下: 1. 定义两个二维数组表示矩阵A和矩阵B。 ```java int[][] A = {{1, 2, 3}, {4, 5, 6}}; int[][] B = {{7, 8}, {9, 10}, {11, 12}}; ``` 2. 创建一个二维数组表示矩阵C,其行数等于矩阵A的行数,列数等于矩阵B的列数。 ```java int[][] C = new int[A.length][B[0].length]; ``` 3. 循环嵌套计算矩阵乘法。外层循环控制行数,内层循环控制列数。 ```java for(int i = 0; i < A.length; i++) { for(int j = 0; j < B[0].length; j++) { for(int k = 0; k < A[0].length; k++) { C[i][j] += A[i][k] * B[k][j]; } } } ``` 4. 输出矩阵C的值。 ```java for(int i = 0; i < C.length; i++) { for(int j = 0; j < C[0].length; j++) { System.out.print(C[i][j] + " "); } System.out.println(); } ``` 完整代码如下: ```java public class MatrixMultiplication { public static void main(String[] args) { int[][] A = {{1, 2, 3}, {4, 5, 6}}; int[][] B = {{7, 8}, {9, 10}, {11, 12}}; int[][] C = new int[A.length][B[0].length]; for(int i = 0; i < A.length; i++) { for(int j = 0; j < B[0].length; j++) { for(int k = 0; k < A[0].length; k++) { C[i][j] += A[i][k] * B[k][j]; } } } for(int i = 0; i < C.length; i++) { for(int j = 0; j < C[0].length; j++) { System.out.print(C[i][j] + " "); } System.out.println(); } } } ``` 以上就是Java数组之二维数值数组之矩阵乘的实现过程。矩阵乘法虽然简单,但重要性不容忽视,尤其在计算机视觉、图像处理、机器学习等领域应用广泛。 ### 回答3: 矩阵乘是矩阵运算中的一种基本操作,也是数值计算中十分重要的一个问题。在Java中,我们可以通过二维数组来实现矩阵乘法。下面,我们就来看看如何通过Java数组练习矩阵乘法。 首先,我们需要了解矩阵乘法的相关知识。设有两个矩阵A和B,它们的维度分别为m*n和n*p,则它们的乘积C为一个m*p的矩阵,其中C[i][j]的值为A[i][0]*B[0][j]+A[i][1]*B[1][j]+...+A[i][n-1]*B[n-1][j]。 根据这个公式,我们可以写出Java代码来实现矩阵乘法。 例如,假设我们要计算矩阵A和B的乘积C,代码可以如下所示: ``` public static int[][] matrixMul(int[][] A, int[][] B) { int m = A.length; int n = A[0].length; int p = B[0].length; int[][] C = new int[m][p]; for (int i = 0; i < m; i++) { for (int j = 0; j < p; j++) { for (int k = 0; k < n; k++) { C[i][j] += A[i][k] * B[k][j]; } } } return C; } ``` 在这段代码中,我们首先定义了矩阵A、B和C的相关维度,然后用一个三重循环遍历每一个C[i][j]的值,并根据矩阵乘法公式计算出每个C[i][j]的值。 示例: ``` int[][] A = {{1, 2, 3}, {4, 5, 6}}; int[][] B = {{7, 8}, {9, 10}, {11, 12}}; int[][] C = matrixMul(A, B); //输出结果 for (int i = 0; i < C.length; i++) { for (int j = 0; j < C[0].length; j++) { System.out.print(C[i][j] + " "); } System.out.println(); } ``` 执行以上代码,会输出如下结果: ``` 58 64 139 154 ``` 这就是矩阵A和B的乘积C。 总之,通过这段代码的理解和实践,我们可以更好地掌握Java数组的使用,以及矩阵乘法的实现方法。同时,在实际工作中,我们也可以根据类似的思路,来解决一些涉及二维数组的数值计算问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼爱吃柚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值