稀疏数组

当一个数组中大部分元素为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.稀疏数组_java实现的更多相关文章

  1. new Array(n) 的坑 密集数组和稀疏数组

    今天写Vue时遇到一个奇怪问题,需要监控网页上的input 是否都有值 // var blanks = new Array(number); // blanks的监控属性 var emptyNumbe ...

  2. javascript中的稀疏数组(sparse array)和密集数组

    学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...

  3. SparseArray HashMap 稀疏数组 二分法

    简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...

  4. [undefined,1] 和 [,1]的区别在哪里--认识js中的稀疏数组

    事情是这样的 今天我想写一个能快速生成一个自然数数组的函数,就是[0,1,2,3]这样的,然后我写了下面的代码: new Array(10).map((item, index) => { ret ...

  5. 读lodash源码之从slice看稀疏数组与密集数组

    卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...

  6. js中的稀疏数组和密集数组

    原文地址: http://www.2ality.com/2012/06/dense-arrays.html 一般来说JavaScript中的数组都是稀疏的,也就是说数组中的元素与元素之间是由空格的,因 ...

  7. 理解JS里的稀疏数组与密集数组

    一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...

  8. js里的稀疏数组

    今天在逛掘金网站的时候,在一篇文章里学到一个新名字,稀疏数组,特此记录一下. 稀疏数组就是包含从0开始的不连续索引的数组.也就是说数组中大部分的内容值都未被使用(或都为零). var arr = ne ...

  9. 稀疏数组 python描述

    什么是稀疏矩阵? 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵. 作用: 在这种情况下,很多0值无疑是很浪费空间的,当我们要把数组存储在磁盘中 ...

随机推荐

  1. Windows Server2012 r2 nginx反向代理图片服务器

    1.下载nginx  http://nginx.org/en/download.html,本人下载的1.18.0版本 2.下载 Windows Service Wrapper(winsw.exe) v ...

  2. redis缓存穿透穿透解决方案-布隆过滤器

    redis缓存穿透穿透解决方案-布隆过滤器 我们先来看一段代码 cache_key = "id:1" cache_value = GetValueFromRedis(cache_k ...

  3. 19_MySQL表的内连接

    本节所涉及的SQL语句: -- 表连接查询 -- 查询每名员工(员工名字,编号)的部门信息(部门编号,部门名称) SELECT e.empno,e.ename,d.dname FROM t_emp e ...

  4. synchronized语法

    synchronized( ){ } synchronized 关键字是加锁的意思,用它来修饰方法就表示给该方法加了锁,从而达到线程同步的效果;用它来修饰代码块就表示给该代码块加了锁,从而达到线程同步 ...

  5. Eclipse和MyEclipse光标变成黑色块解决办法

    今天偶然发现了一个小技巧,O(∩_∩)O~暂且可以这样说吧,我认为喽. 以前经常在编写程序是不知到碰到键盘上的那个键了,或是那几个组合键了,使得Eclipse里的代码光标变成一个黑色块:在这个状态下, ...

  6. TERSUS无代码开发(笔记01)-按装下载和基础语法

    1.中国官网 https://tersus.cn/ 2.下载:https://tersus.cn/download/ 3.开发文档:https://tersus.cn/docs/ 4.基本元件说明 图 ...

  7. 微信小程序(五)-常见组件(标签)

    常见组件(标签) https://developers.weixin.qq.com/miniprogram/dev/component/ 1.view 代替以前的div标签 2.text 1.文本标签 ...

  8. eclipse中lombok注解不生效

    现象:eclipse中在对象上使用lombok的@Data,引用get方法时,没有set.get方法. 解决办法: 1.在lombok官网(https://www.projectlombok.org/ ...

  9. Linux下搭建ZooKeeper集群

    摘要 Zookeeper是针对大型分布式系统的高可靠的协调系统.它基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题. ...

  10. JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...