稀疏数组
稀疏数组
使用范围,多数的值相同时只需要记录少数的数据
采用坐标的方式,记录下不同的数据
该数组的第一行记录需要存储的数组的行数,列数,需要记录的数据个数
| 6 | 7 | 3 |
|---|---|---|
| 1 | 2 | 3 |
| 1 | 5 | 4 |
| 5 | 4 | 4 |
表示原先的数组有6行7列,需要记录的数据有3个
第一个数据在原先数组的1行2列位置,值为3.
最大的个数:n*m/3-1
原始数组要存(n*m)个数据
稀疏数组第一行需要存原始数组的信息,且每行需要存3个数据
package utils;
import org.junit.Test;
@SuppressWarnings(value = "all")
public class SaveAsSparse {
private int[][] sparsearray;
private int sum;
private int temp;
/*转换步骤
* 1.计算需要存入稀疏素组的数据个数
* 2.根据数据个数确定稀疏数组行数为++sum,创建稀疏数组[++sum][3]并给第一行赋值
* 3.寻找需要存入稀疏素组的数据的位置,存入稀疏数组中
* */
public int[][] save(int[][] array,int rowNum,int colNum){
//计算需要存入稀疏素组的数据个数
for (int[] a : array) {
for (int data : a) {
if(data!=0) {
sum++;
}
}
}
//创建稀疏数组
sparsearray = new int[++sum][3];
sparsearray[0][0]=rowNum;
sparsearray[0][1]=colNum;
sparsearray[0][2]=sum;
//寻找需要存入稀疏素组的数据的位置
for (int i=0;i<rowNum;i++) {
for (int j=0;j<colNum;j++) {
if(array[i][j]!=0) {
temp++;
sparsearray[temp][0]=i;
sparsearray[temp][1]=j;
sparsearray[temp][2]=array[i][j];
}
}
}
return sparsearray;
}
@Test
public void Test() {
int[][] array = new int [4][5];
array[1][2]=1;
array[2][3]=1;
int[][] save = save(array,4,5);
for (int[] is : save) {
for (int data : is) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
package utils;
import org.junit.Test;
public class ToArray {
private int[][] array;
/*
* 转换步骤 1.根据稀疏数组第一行创建数组 2.将数据还原到数组中,循环次数为sparsearray[0][2]
* 3.从第二行开始循环稀疏数组,每行的第一列为数据所在数组的行,第二列为数据所在数组的列,第三列为数据
*/
public int[][] changeArray(int[][] sparsearray) {
array = new int[sparsearray[0][0]][sparsearray[0][1]];
for (int i = 1; i < sparsearray[0][2]; i++) {
array[sparsearray[i][0]][sparsearray[i][1]] = sparsearray[i][2];
}
return array;
}
@Test
public void Test() {
int[][] sparsearray = new int[][] { { 4, 5, 3 }, { 1, 2, 1 }, { 2, 3, 1 } };
int[][] array = changeArray(sparsearray);
for (int[] is : array) {
for (int is2 : is) {
System.out.printf("%d\t", is2);
}
System.out.println();
}
}
}

浙公网安备 33010602011771号