java稀疏数组与二维数组的切换
本文选自尚硅谷java数据结构与算法,jdk8,eclipse环境
稀疏数组定义
所谓稀疏数组,通常指的是一个二维数组中,其大部分元素都为0或者都为同一个数x,仅有少数几个元素与其不同,那么在内存存储的时候为了避免内存浪费,将原二维数组转换为稀疏数组来进行存储。
- 稀疏数组将记录少数几个非零元素(或者非x的数值)的所在行,列,以及个数
- 稀疏数组的首行是记录原二维数组的行数和列数,以及非零(或者x)元素的个数
- 稀疏数组总共有非零(或者x)元素的个数+1行,三列
以尚硅谷的图片为例:
代码演示
先随意创建一个11行11列的二维数组
public class SparseArray {
public static void main(String[] args) {
int[][] sparseArr = new int[11][11];
sparseArr[1][2] = 1;
sparseArr[2][3] = 2;
sparseArr[3][5] = 2;
sparseArr[4][4] = 1;
for(int[] arr:sparseArr){
for(int arr1:arr){
System.out.printf("%d\t",arr1);
}
System.out.println();
}
}
输出结果为
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 2 0 0 0 0 0 0 0
0 0 0 0 0 2 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 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 0 0 0 0 0 0 0
说明一点,语句
for(int[] arr:sparseArr){
for(int arr1:arr){
其中用的是foreach遍历数组,有点类似于python的遍历,冒号相当于python中的for循环中的in。
for(type var x:obj){
引用了x的java语句
}
其中,var x是一个形参,type是形参的类型,obj是遍历对象。这儿第一个for循环把sparseArr某一行给了arr,第二个for循环把行arr中的每个元素给了arr1.
将二维数组转化为稀疏数组
然后将其转化为稀疏数组
//把数组转换为稀疏数组
int sum = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0)
sum++;
}
}
System.out.println("sum= "+sum);
int sparseArr1[][] =new int[sum+1][3];
sparseArr1[0][0] = 11;
sparseArr1[0][1] = 11;
sparseArr1[0][2] = sum;
int count = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0){
count++;
sparseArr1[count][0] = i;
sparseArr1[count][1] = j;
sparseArr1[count][2] = sparseArr[i][j];
}
}
}
System.out.println("稀疏数组为:");
for(int[] arr:sparseArr1){
for(int arr1:arr)
System.out.printf("%d\t",arr1);
System.out.println();
}
这儿首先要求出非零(或者x)元素的个数,再进行稀疏数组的绘制。
其中,输出语句也可以写为
for(int i = 0;i <= sum;i++){
System.out.printf("%d\t%d\t%d\n",sparseArr1[i][0],sparseArr1[i][1],sparseArr1[i][2]);
}
这样写输出效果一样,但更为简洁。
运行结果为:
sum= 4
稀疏数组为:
11 11 4
1 2 1
2 3 2
3 5 2
4 4 1
将稀疏数组转化为二维数组
代码如下
//将稀疏数组转换为原始数组
System.out.println("原始数组为:");
int sparseArr2[][] = new int[sparseArr1[0][0]][sparseArr1[0][1]];
for(int i = 1;i <= sum;i++){
sparseArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
}
for(int[] arr:sparseArr2){
for(int arr1:arr)
System.out.printf("%d\t",arr1);
System.out.println();
}
运行结果为原二维数组。
总的代码如下
package com.atguigu.sparsearray;
public class SparseArray {
public static void main(String[] args) {
int[][] sparseArr = new int[11][11];
sparseArr[1][2] = 1;
sparseArr[2][3] = 2;
sparseArr[3][5] = 2;
sparseArr[4][4] = 1;
for(int[] arr:sparseArr){
for(int arr1:arr){
System.out.printf("%d\t",arr1);
}
System.out.println();
}
//把数组转换为稀疏数组
int sum = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0)
sum++;
}
}
System.out.println("sum= "+sum);
int sparseArr1[][] =new int[sum+1][3];
sparseArr1[0][0] = 11;
sparseArr1[0][1] = 11;
sparseArr1[0][2] = sum;
int count = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0){
count++;
sparseArr1[count][0] = i;
sparseArr1[count][1] = j;
sparseArr1[count][2] = sparseArr[i][j];
}
}
}
System.out.println("稀疏数组为:");
// for(int[] arr:sparseArr1){
// for(int arr1:arr)
// System.out.printf("%d\t",arr1);
// System.out.println();
// }
//输出语句可以换为:
for(int i = 0;i <= sum;i++){
System.out.printf("%d\t%d\t%d\n",sparseArr1[i][0],sparseArr1[i][1],sparseArr1[i][2]);
}
//将稀疏数组转换为原始数组
System.out.println("原始数组为:");
int sparseArr2[][] = new int[sparseArr1[0][0]][sparseArr1[0][1]];
for(int i = 1;i <= sum;i++){
sparseArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
}
for(int[] arr:sparseArr2){
for(int arr1:arr)
System.out.printf("%d\t",arr1);
System.out.println();
}
}
}
运行结果为
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 2 0 0 0 0 0 0 0
0 0 0 0 0 2 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 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 0 0 0 0 0 0 0
sum= 4
稀疏数组为:
11 11 4
1 2 1
2 3 2
3 5 2
4 4 1
原始数组为:
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 2 0 0 0 0 0 0 0
0 0 0 0 0 2 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 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 0 0 0 0 0 0 0