稀疏数组与普通数组转换
Posted 高、远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稀疏数组与普通数组转换相关的知识,希望对你有一定的参考价值。
【1】稀疏数组概述
疏数组是一种压缩后的数组,为什么要进行压缩存储呢?
-
原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
-
压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率
【2】转换思想
- 转换为
n
行3
列的数组- 第一行保存原始数组的行列数以及有用的数值数量
- 第二行就保存第一个有效数据的行列数及具体数值
- 以此类推
。。。。
。。。。
。。。。
【3】代码实现:
package algorithm.sparseArray;
public class Main {
public static void main(String[] args) {
//数组转稀疏数组 0表示没用的数据
int sum = 0;
int[][] array = new int[6][7];
array[0][1] = 1;
array[1][3] = 3;
//输出数组结果
for (int[] a : array) {
for (int t : a) {
System.out.printf("%d\\t", t);
}
System.out.println();
}
/**
* 将普通数组转换为稀疏数组
*/
//找有多少个有用的元素
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
if (array[i][j] != 0)
sum++;
}
}
//创建稀疏数组
int[][] sparseArr = new int[sum + 1][3];
//从第二行开始赋值
int count = 1;
//稀疏数组第一行的值
sparseArr[0][0] = array.length;
sparseArr[0][1] = array[0].length;
sparseArr[0][2] = sum;
//为稀疏数组第二行后面进行赋值
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
if (array[i][j] != 0) {
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = array[i][j];
count++;
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:~~~~~~~~~~");
for (int[] a : sparseArr) {
for (int t : a) {
System.out.printf("%d\\t", t);
}
System.out.println();
}
/**
* 将稀疏数组转换为普通数组
*
*/
int [][]arr = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i <= sparseArr[0][2]; i++) {
arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//打印还原后的数组
System.out.println("还原后的数组");
for (int[] a : arr) {
for (int t : a) {
System.out.printf("%d\\t", t);
}
System.out.println();
}
}
}
以上是关于稀疏数组与普通数组转换的主要内容,如果未能解决你的问题,请参考以下文章