稀疏数组
稀疏数组
-
当一个数组中的元素大部分为零或者为同一值时,可以使用稀疏数组来保存这个数组
-
稀疏数组的处理方式:
记录数组一共有几行几列,有多少个不同值
把具体不同值的元素和行列及至值记录在一个小规模的数组中,从而缩小程序的规模
稀疏数组可以理解为对于零或者大都相同的数据不作记忆,对于特别的数据运用简单的数组单独记忆,包括 行 列 值,三部分。
- 先确定元素个数,由元素个数定义简单数组的行(要+1,第零行需要记录原数组的行数 列数 非零元素个数) 列。一般为三列,分别记录非零元素的横坐标,纵坐标,元素本身的值。
- 运用循环对元素进行筛选,对于满足的元素存入行 列 值,注意需要定义一个值count用来记录存入到了第几行了
-
eg:
原始数组:
0 0 0 22 0 0 15
0 11 0 0 0 17 0
0 0 0 -6 0 0 0
0 0 0 0 0 39 0
91 0 0 0 0 0 0
0 0 28 0 0 0 0
稀疏数组:
行 / 列 /**** 值
[0] 6 7 8
[1] 0 3 22
[2] 0 6 15
[3] 1 1 11
[4] 1 5 17
[5] 2 3 -6
[6] 3 5 39
[7] 4 0 91
[8] 5 2 28
举例:
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 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
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 11*11的棋盘,1代表黑棋,2代表白棋
存入稀疏数组内,先使用普通数组存储。
import java.util.Arrays;
public class Array04 {
public static void main(String[] args) {
int[][] array=new int[11][11];
for (int i = 0; i <array.length ; i++) { //普通的二维数组存储
for (int j = 0; j < array[0].length; j++) {
array[i][j]=0;
}
}
array[1][2]=1;
array[2][3]=2;
for (int i = 0; i <array.length; i++) {
System.out.println(Arrays.toString(array[i])); //打印
}
System.out.println("**********************************");//稀疏数组!
int sum=0;
int count=0;
for (int i = 0; i <array.length ; i++) { //计算非零值个数
for (int j = 0; j < array[0].length; j++) {
if (array[i][j]!=0)
sum++;
}
}
int[][] array2=new int[sum+1][3]; // sum代表非零元素的个数,
// 这里的sum稀疏数组的控制行数,每一列分别代表 行 列 值
array2[0][0]=11; //存入总共的行数
array2[0][1]=11; //存入总共的列数
array2[0][2]=sum; //存入非零值个数
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
count++; //控制第几个数,存第几行,0行已经被存入了总数据,总共11行 11列,2个数据
array2[count][0] = i; //存行
array2[count][1] = j; //存列
array2[count][2] = array[i][j];//存值
}
}
}
for (int i = 0; i < array2.length; i++) {
System.out.println(Arrays.toString(array2[i]));
}
}
}
由稀疏数组转普通数组!
eg:
package shiyan1;
import java.util.Arrays;
public class Arra {
public static void main(String[] args) //稀疏数组 转 普通数组
{
int[][] array=new int[3][3];
array[0][0]=11; array[1][0]=1;
array[0][1]=11; array[1][1]=2;
array[0][2]=2; array[1][2]=1;
array[2][0]=2;
array[2][1]=3;
array[2][2]=2;
int count=1;
int[][] array01=new int[array[0][0]] [array[0][1]];
for (int i = 0; i < array[0][0]; i++) {//初始化普通数组
for (int j = 0; j <array[0][1] ; j++) {
array[i][j]=0;
}
}
l: for (int i = 0; i < 11; i++) {
for (int j = 0; j <11 ; j++) {
if(i==array[count][0]&&j==array[count][1]) //横纵坐标都相等,存入相应位置
{
array01[i][j]=array[count][2];
count++;
if(count>2) //count=3时所有数据已经转入,继续循环会产生越界
break l;
}
}
}
for (int i = 0; i < 11 ; i++) {
for (int j = 0; j <11 ; j++) { //输出
System.out.print(array01[i][j]+"\t");
}
System.out.println();
}
}