稀疏数组的含义:
如果一个数组大部分的值都是0或者相同的数值, 只有少量位置有特殊需要标记的数值,
那么为了省事,一堆0不用存储,只要存储特殊标记的这几个数字就可以了.
举例 左边是原始数组,右边是稀疏数组
比如这是一个6行7列的数组,其中共有8个有效数据
所以上图右侧第一行[0] 6 7 8 表示[0]归纳总结:这个数组共有6行7列8个有效元素
上图右侧第二行[1] 0 3 22 表示第一个有效数据是第0行 第3列 data值为22
…
具体来说,类似这样
…
开始建立稀疏数组
[6行][7列][8个有效数据]
[0行][3列][data值为22]
[0行][6列][data值为15]
[1行][1列][data值为11]
…
練習:
程序举例
要求随意创建一个数据量不多的数组,并输出这个原始数组
然后输出数组内有效数据的个数,并且输出数组的行数列数
然后输出对应的稀疏数组
最后通过稀疏数组还原到原来的数组
import java.util.Arrays;
public class testjan05{
public static void main(String[] args) {
int [][] nums=new int[7][12];
nums[0][0]=26;
nums[1][1]=2;
nums[4][0]=108;
nums[0][5]=53;
nums[3][5]=28;
nums[6][7]=6;
System.out.println("原数组显示:");
/**原来数组类似下面这样
* [26, 0, 0, 0, 0, 53, 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, 28, 0, 0, 0, 0, 0, 0]
* [108, 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, 6, 0, 0, 0, 0]
*/
for (int[] num : nums) {
System.out.println(Arrays.toString(num)); //打印原数组
}
System.out.println("数组列数"+nums[0].length); //取第0行算出原数组的列数,如果数组有第一行,这里当然也可以选第1行计算数组列数,原理都是一样的
System.out.println("数组行数"+nums.length); //计算数组的行数
System.out.println("稀疏数组显示:");
//这里用的IDEA快捷键,【数组名字.for】 快速生成for循环,主要是用来打印或显示数组内容。
// 本例需要显示多维数组,于是每次将f_num的一整行视为一个整体块输出
// 稀疏数组sparse_matrix
for (int[] f_num : sparse_matrix(nums)) {
System.out.println(Arrays.toString(f_num));
}
System.out.println("原数组反编:");
for (int[] o_num : org_matrix(sparse_matrix(nums))) {
System.out.println(Arrays.toString(o_num));
}
}
public static int[][] sparse_matrix(int nums_in [][]) {
int colume= nums_in.length;//行
int row= nums_in[0].length;//列
int data_num = 0;
int data_con = 0;
//虽然稀疏数组的列数为固定3列,[0]行角标[1]列角标[2]实际数值
//但是不清楚原数组有多少个有效数据,那么就无法判断稀疏数组的实际行数。
//下面的for循环计算出来实际有多少valid data(N), the the final length of sparse matrix should be N+1
//the first line of the sparse matrix should be [0][0]==org colume [0][1]==org_row [0][2]==total valid data(not 0)
for (int m = 0; m < row; m++) {
for (int n = 0; n < colume; n++) {
if (nums_in[n][m] != 0) {
data_con += 1;
}
}
}
int [][] nums_out=new int[data_con+1][3];
nums_out[0][0] = colume;
nums_out[0][1] = row;
nums_out[0][2] = data_con;
for (int j = 0; j < row; j++) {
for (int i = 0; i < colume; i++) {
if (nums_in[i][j]!=0){
data_num+=1;
nums_out[data_num][0]=i;
nums_out[data_num][1]=j;
nums_out[data_num][2]=nums_in[i][j];
}
}
}
return nums_out;
}
public static int[][] org_matrix(int nums_in [][]) {
int [][]nums_out= new int [nums_in[0][0]][nums_in[0][1]];
for (int i = 1; i <= nums_in[0][2]; i++) {
nums_out[nums_in[i][0]][nums_in[i][1]] = nums_in[i][2];
}
return nums_out;
}
}
運行結果:
原数组显示:
[26, 0, 0, 0, 0, 53, 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, 28, 0, 0, 0, 0, 0, 0]
[108, 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, 6, 0, 0, 0, 0]
数组列数12
数组行数7
稀疏数组显示:
[7, 12, 6]
[0, 0, 26]
[4, 0, 108]
[1, 1, 2]
[0, 5, 53]
[3, 5, 28]
[6, 7, 6]
原数组反编:
[26, 0, 0, 0, 0, 53, 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, 28, 0, 0, 0, 0, 0, 0]
[108, 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, 6, 0, 0, 0, 0]