数据结构与算法--002-稀疏数组
原创
©著作权归作者所有:来自51CTO博客作者靠谱的大钊的原创作品,请联系作者获取转载授权,否则将追究法律责任
稀疏数组
当一个数组中的很多值默认是0,因此记录了很多没有意义的数据,因而需要稀疏数组
基本介绍:
当一个数组中大部分是由零,或者为同一个值的数组时,可以使用稀疏数组.
稀疏数组处理方法:
- 记录数组中一共有几行几列,有多少个不同的值
- 把具有不同的元素的行列以及值记录在一个小规模中,从而缩小程序的规模
二维数组转化稀疏数组的思路
- 遍历原始数组的二维数组,得到有效数据的个数sum
- 根据sum就可以创建sparseArrayint[sum+1][3]
[sum+1]:表示行数,第一行用来存放原始数组的行列数,和一共有多少个值
- 列数
- 将二维数组的有效数据存入到稀疏数组
稀疏数组转化为原始数组的思路
- 先读取稀疏数组的第一行,根据第一行的存放原始数组的行列数,创建二维数组
- 在读取稀疏数组后几行的数据,赋值给二维数组
package day1.work;
public class SparseArray {
public static void main(String[] args) {
int allNum = 10;//总行数和总列数
int[][] array = new int[allNum][allNum];
//创建一个原始数组
array[1][1] = 2;
array[2][3] = 3;
array[5][5] = 1;
System.out.println("原始的二维数组:");
for (int[] a : array) {
for (int data : a) {
System.out.print(data + "\t");
}
System.out.println();
}
//二维数组转换到稀疏数组
//遍历非零的个数
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
sum++;
}
}
}
//创建稀疏数组
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = allNum;//行
sparseArray[0][1] = allNum;//列
sparseArray[0][2] = sum;//数的数量
//遍历二维数组给稀疏数组赋值
int countNum = 0;//记录一共及格数字
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
countNum++;
sparseArray[countNum][0] = i;
sparseArray[countNum][1] = j;
sparseArray[countNum][2] = array[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组为");
System.out.println("行\t列\t值");
for (int[] a : sparseArray) {
for (int data : a) {
System.out.print(data + "\t");
}
System.out.println();
}
//将稀疏数组转换称为正常数组
int[][] array2 = new int[sparseArray[0][0]][sparseArray[0][0]];
for (int i = 1; i < sparseArray.length; i++) {
/*
行 列 值
10 10 3
1 1 2
2 3 3
5 5 1
*/
// 行 列 值
array2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
System.out.println("转换后的正常组");
for (int[] a : array2) {
for (int data : a) {
System.out.print(data + "\t");
}
System.out.println();
}
}
}
输出: