稀疏数组

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

稀疏数组的处理方法是:

  • 记录数组一共有几行几列,有多少个不同的值

  • 把具有不同值的元素行列及值记录在一个小规模的数组中(稀疏数组),从而缩小程序的规模。

  • row col val
    原始数组行 原始数组列 一共多少个不同值

二维数组转稀疏数组的思路:

  • 遍历原始的二维数组,得到有效数据的个数sum
  • 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
  • 将二维数组的有效数据存入到稀疏数组

稀疏数组转原始数组的思路:

  • 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
  • 再读取稀疏数组后几行的数据,并赋值给原始的二维数组即可。
package sparsearray;

/**
* @author Forrestyu
* @create 2021-02-08 15:46
*/
public class sparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组11*11
//0表示没有旗子,1表示黑子,2表示蓝子
int chessArr[][] = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//输出原始的二维数组
System.out.println("原始的二维数组~~~");
for (int[] row : chessArr) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
} //原始数组-->稀疏数组
//记录一共有多少个非0值
int sum = 0;
//1、遍历原始数组,获得sum值
for (int i = 0;i < chessArr.length;i++){
for (int j = 0;j < chessArr[i].length;j++){
if (chessArr[i][j] != 0){
sum++;
}
}
}
//2、创建稀疏数组,要先获得sum才能创建
int sparseArr[][] = new int[sum+1][3];
//3、赋值
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length;
sparseArr[0][2] = sum;
int count = 0;//记录是第几个非零值
for (int i = 0;i < chessArr.length;i++){
for (int j = 0;j < chessArr[i].length;j++){
if (chessArr[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
//4、输出稀疏数组
System.out.println("稀疏数组~~~~");
//这样是双层循环,可以换一种写法
// for (int[] row:sparseArr
// ) {
// for (int data:row
// ) {
// System.out.printf("%d\t",data);
// }
// System.out.println();
// }
for (int i = 0;i < sparseArr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
} //稀疏数组-->原始数组
//1、读取稀疏数组第一行,创建原始数组
int chessRow = sparseArr[0][0];
int chessCol = sparseArr[0][1];
int chessArr1[][] = new int[chessRow][chessCol];
//2、赋值
for (int i = 1;i < sum+1;i++){
int j = sparseArr[i][0];
int k = sparseArr[i][1];
chessArr1[j][k] = sparseArr[1][2];
}
//3、遍历输出恢复的数组
System.out.println("恢复的二维数组~~~");
for (int[] row : chessArr1) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}

最新文章

  1. while(cin.eof)出错 poj
  2. Codeforces Round #376A (div2)
  3. 【Oracle】多次提交造成性能慢及处理方法
  4. 传统MySQL+ Memcached架构遇到的问题
  5. Linux下的内核测试工具——perf使用简介
  6. c语言,数组和字符串
  7. 为实施了IFD的Dynamics 365更换自签名的SSL证书以符合Chrome的要求
  8. Python3常用学习网站总结(随时更新)
  9. 微信小程序开发03-这是一个组件
  10. Java解析json字符串和json数组
  11. transition属性值
  12. CodeGear RAD 2007 SP4 最新下载及破解
  13. DDOS攻击详解
  14. Centos 7 部署Kubernetes(K8S)集群
  15. iOS 开发学习-类的创建与实现,与java语言的对比
  16. HDU 6249
  17. 1019 General Palindromic Number (20)(20 point(s))
  18. hadoop deployment
  19. 【BZOJ2756】奇怪的游戏(二分,网络流)
  20. Flash Sort

热门文章

  1. webpack + ts 配置路径别名无死角方法总结
  2. [转]ubuntu系统重新分区、根目录扩容
  3. 微信小程序:自定义组件
  4. Cannot resolve MVC View
  5. Svelte v2 已经过时了!
  6. Redis数据结构和对象三
  7. Elasticsearch常用API
  8. 后端程序员之路 37、Akka、Actor、Scala初窥
  9. 00.从0实现一个JVM语言系列
  10. Synchronized 轻量级锁会自旋?好像并不是这样的。