稀疏数组
-
稀疏数组是一种数据结构
-
一个数组中的大部分元素为 0 ,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
-
稀疏数组的处理方式:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的 值 和 行列值记录在一个小规模的数组中
-
如下图:左边是原始数组,右边是稀疏数组。
-
一个例子
- 需求:编写五子棋游戏中,有存盘退出和续上的功能。
-
分析问题:因为该二维数组的很多默认值为 0 ,因此记录了很多没有意义的数据。
-
解决:稀疏数组
package com.wanggenji.array;
public class ArrayDemo08 {
public static void main(String[] args) {
//1. 创建一个二维数组11*11 0:没有棋子 1:黑棋 2:白棋
int[][] array1 = new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//打印原始数组
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("=============这是分割线===========");
//打印压缩之后的数组
for (int[] ints : compress(array1)) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("=============这是分割线===========");
//打印解压还原之后的数组
int[][] a =compress(array1);
for (int[] ints : decompressed(a)) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
//压缩方法的实现
public static int[][] compress(int[][] array) {
int count0 = 0;//零的个数
int count1 = 0;//非零元素个数
//计算值为零的元素的个数和非零元素的个数
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j]==0){
count0++;
}else {
count1++;
}
}
}
//创建稀疏数组
int[][] comperssedArray = new int[count1+1][3];
//稀疏数组第一行赋值
comperssedArray[0][0] = array.length;
comperssedArray[0][1] = array[0].length;
comperssedArray[0][2] = count0;
//特殊元素保存
count1 = 1; //稀疏数组的第二行开始是特殊元素的信息
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j]!=0){
comperssedArray[count1][0] = i;
comperssedArray[count1][1] = j;
comperssedArray[count1][2] = array[i][j];
count1++; //换行存下一个特殊元素信息
}
}
}
return comperssedArray;
}
//解压方法的实现 稀疏数组转化为 普通二维数组
public static int[][] decompressed(int[][] array) {
int[][] decompressedArray = new int[array[0][0]][array[0][1]]; //稀疏数组第一行储存的数据:行 列 重复数据个数,由此创建成原来的数组
//原数组特殊数据还原
for (int i = 1; i < array.length; i++) {
decompressedArray[array[i][0]][array[i][1]] = array[i][2];
}
return decompressedArray;
}
}