Java 稀疏数组
稀疏数组是一种数组结构,这是一种压缩算法。
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是指无效数据量远大于有效数据量的数组
1 概述
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
如下图:左边是原始数组,右边是稀疏数组
2 实例
需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
问题:因为二维数组中很多值是默认值0,因此记录了很多无意义的数组。
解决方案:稀疏数组
2.1 原始数组
package com.study;
import java.util.Arrays;
public class T {
public static void main(String[] args) {
//创建一个 11*11 的二维数组
//0:无棋子 1:黑棋 2:白棋
int[][] arr = new int[11][11];//棋盘
arr[1][2] = 1; //黑棋
arr[2][3] = 2; //白棋
//1 输出原始数组
int sum = 0;//有效值
System.out.println("原始数组:");
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
//统计有效值个数
if (anInt != 0) {
sum++;
}
}
System.out.println();
}
System.out.println("有效值个数:"+sum);
}
}
2.2 稀疏数组
package com.study;
import java.util.Arrays;
public class T {
public static void main(String[] args) {
//创建一个 11*11 的二维数组
//0:无棋子 1:黑棋 2:白棋
int[][] arr = new int[11][11];//棋盘
arr[1][2] = 1; //黑棋
arr[2][3] = 2; //白棋
//1 输出原始数组
int sum = 0;//有效值
System.out.println("原始数组:");
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
//统计有效值个数
if (anInt != 0) {
sum++;
}
}
System.out.println();
}
System.out.println("===================================");
System.out.println("有效值个数:" + sum);
//2 创建一个稀疏数组
//第一行记录该稀疏数组是 11 行 11列 共 sum 个有效值
int[][] arr2 = new int[sum + 1][3];
arr2[0][0] = 11;
arr2[0][1] = 11;
arr2[0][2] = sum;
//遍历二维数组,将非0值,存放到稀疏数组中
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
count++;
arr2[count][0] = i;
arr2[count][1] = j;
arr2[count][2] = arr[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for (int i=0;i<arr2.length;i++){
for (int j=0;j<arr2[i].length;j++){
System.out.print(arr2[i][j]+"\t");
}
System.out.println();
}
}
}
2.3 稀疏数组还原
package com.study;
import java.util.Arrays;
public class T {
public static void main(String[] args) {
//创建一个 11*11 的二维数组
//0:无棋子 1:黑棋 2:白棋
int[][] arr = new int[11][11];//棋盘
arr[1][2] = 1; //黑棋
arr[2][3] = 2; //白棋
//1 输出原始数组
int sum = 0;//有效值
System.out.println("原始数组:");
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
//统计有效值个数
if (anInt != 0) {
sum++;
}
}
System.out.println();
}
System.out.println("===================================");
System.out.println("有效值个数:" + sum);
//2 创建一个稀疏数组
//第一行记录该稀疏数组是 11 行 11列 共 sum 个有效值
int[][] arr2 = new int[sum + 1][3];
arr2[0][0] = 11;
arr2[0][1] = 11;
arr2[0][2] = sum;
//遍历二维数组,将非0值,存放到稀疏数组中
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
count++;
arr2[count][0] = i;
arr2[count][1] = j;
arr2[count][2] = arr[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j < arr2[i].length; j++) {
System.out.print(arr2[i][j] + "\t");
}
System.out.println();
}
System.out.println("=========================");
//3.稀疏数组还原
System.out.println("稀疏数组还原:");
//3.1 读取稀疏数组
int[][] arr3 = new int[arr2[0][0]][arr2[0][1]];
//3.2 给其中的元素还原它的值
// System.out.println(arr2.length);3
for (int i = 1; i < arr2.length; i++) {
arr3[arr2[i][0]][arr2[i][1]] = arr2[i][2];
}
//3.3 打印
for (int[] ints : arr3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!