稀疏数组

稀疏数组

使用范围,多数的值相同时只需要记录少数的数据

采用坐标的方式,记录下不同的数据

该数组的第一行记录需要存储的数组的行数,列数,需要记录的数据个数

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();
		}
	}

}
posted @ 2020-05-08 00:23  成为海贼王的男人  阅读(134)  评论(0)    收藏  举报