稀疏数组的超细详解

一个含有大量重复元素的二维数组,我们可以提取其有效元素,压缩空间,整合为一个稀疏数组。

例如一个五子棋棋盘,我们将棋盘看作为一个二维数组,没有棋子的位置为0;黑棋为1;白棋为2;

0 0 0 0 0 0 0 0 0 0 0

0 0 1 0 0 0 0 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 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 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 0 0 0 0 0 0 0 0

我们可以将这个棋盘上有棋子的地方进行提取,整合为一个稀疏数组

[0] 11 11 2
[1] 1 2 1
[2] 2 3 2

该稀疏数组意为有一个11行11列的二维数组,有效元素为2个;第1行,第2列元素值为1;第2行,第3列的元素值为2;

接下来我们将五子棋转为二维数组,再整合为稀疏数组,再将稀疏数组还原为二维数组

//打印五子棋盘的二维数组
public class Demo{
public static void main(String[] args){
//将上面的五子棋盘转为二维数组
int[][]a=new int[11][11];//建立一个二维数组有11行11列
a[1][2]=1;
a[2][3]=2;//将有效元素对应的位置进行赋值
//打印二维数组
for(int[]b:a){//增强for循环的使用,因为a是二维数组,要先将二维数组中的一维数组遍历出去
for(int c:b){//此时b是a的元素,为一维数组,再次遍历,可以得到b中的每一个元素了
System.out.print(c+"\t");
}
System.out.println();//每一组元素遍历后换行
}
System.out.println("========================================"); //提取有效元素,整合为稀疏数组
//稀疏数组也是一个数组,我们可以根据上面表格进行模仿打印
//首先我们先将有效个数先提取出来
int sum=0;//先建立一个计数的变量;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(a[i][j]!=0){
sum++;//当if执行一次,则计数一次;理解为当发现一个有效元素则计数一次
}
}
}System.out.println("有效元素的个数为:"+sum);
//有效个数得到后,我们可以开始建立稀疏数组了
int count=0;//建一个计数变量
int[][] array=new int[sum+1][3];//观察稀疏数组,行数为有效元素的个数加1,列数为3;
array[0][0]=11;
array[0][1]=11;
array[0][2]=2;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
if(a[i][j]!=0){
count++;//发现有效元素则计数
array[count][0]=i;//将发现的有效元素的行坐标赋值给稀疏数组该放的地方
array[count][1]=j;//将发现的有效元素的列坐标赋值给稀疏数组该放的地方
array[count][2]=a[i][j];//将发现的有效元素的值赋值给稀疏数组该放的地方
}
}
}//此时棋盘中的数组将位置、值的信息全部赋值给了稀疏数组array
//将稀疏数组打印出来,还是一样,用遍历的方式打印出来
//第一种打印方式:在列数很少的情况下,可以按行打印,一行一行打印出来
for(int i=0;i<array.length;i++){
System.out.println(array[i][0]+"\t"+array[i][1]+"\t"+array[i][1]);
}
//第二种方式:利用两个for循环将元素遍历出来
System.out.println("打印稀疏数组:");
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
System.out.ptint(array[i][j]+"\t");
}
System.out.println();//每一行打印完后换行
}
System.out.println("===================================================="); //我们在尝试将稀疏数组还原成二维数组
//还是一样,先建立一个数组作为还原后的二维数组
int[][] array1=int[array[0][0]][array[0][1]];//稀疏数组array的第0行的0、1列分别记录的的是二维数组的行列大小
//再将稀疏数组的有效元素记录的信息赋值给二维数组
for(int i=1;i<array.length;i++){//i从1开始是因为在稀疏数组中第二行是有效元素的信息
array1[array[i][0]][array[i][1]]=array[i][2];
//array[i][0]记录的是第一个有效元素在二维数组中的行;
//array[i][1]记录的是第一个有效元素在二维数组中的列;
//array[i][2]记录的是第一个有效元素二维数组中的值
}
//循环结束后,我们希望还原的二维数组array1已经赋值完了
//打印二维数组
System.out.println("还原后的二维数组:");
for(int[] i=0:array1){//二维数组将其一维数组遍历出来
for(int s:i){//将一维数组的元素遍历出来
System.out.print(s+"\t");
}
System.out.println();
} }
}

Day17:稀疏数组的超细详解的更多相关文章

  1. GoLang基础数据类型--->数组(array)详解

    GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...

  2. 超全详解Java开发环境搭建

    摘自:https://www.cnblogs.com/wangjiming/p/11278577.html 超全详解Java开发环境搭建   在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必 ...

  3. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  4. js数组的sort排序详解

    <body> <div> sort()对数组排序,不开辟新的内存,对原有数组元素进行调换 </div> <div id="showBox" ...

  5. JavaScript数组的reduce方法详解

    数组经常用到的方法有push.join.indexOf.slice等等,但是有一个经常被我们忽略的方法:reduce,这个方法简直强大的不要不要的. 我们先来看看这个方法的官方概述:reduce()  ...

  6. C语言数组空间的初始化详解

    数组空间的初始化就是为每一个标签地址赋值.按照标签逐一处理.如果我们需要为每一个内存赋值,假如有一个int a[100];我们就需要用下标为100个int类型的空间赋值.这样的工作量是非常大的,我们就 ...

  7. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  8. OC中数组类NSArray的详解,数组的遍历(二)

    数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 @interface NSEnumer ...

  9. OC中数组类NSArray的详解,常用属性和方法(一)

    数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA

  10. 中文分词系列(一) 双数组Tire树(DART)详解

    1 双数组Tire树简介 双数组Tire树是Tire树的升级版,Tire取自英文Retrieval中的一部分,即检索树,又称作字典树或者键树.下面简单介绍一下Tire树. 1.1 Tire树 Trie ...

随机推荐

  1. KingbaseFlySync V1R6 管控平台Linux命令行安装

    关键字: KingbaseFlySync.KingbaseES.Linux.x86_64.mips64el.aarch64.Java 管控平台: Web管控平台(Manager.Console.Com ...

  2. Elasticsearch7.6.2 RestHighLevelClient查询用法 must should(and or 关系)

    1. 引入jar <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId&g ...

  3. Ansible_playbook

    前言 连接https://galaxy.ansible.com下载相应的roles # 列出已安装的galaxy ansible-galaxy list # 安装galaxy ansible-gala ...

  4. docker学习笔记一-docker安装与卸载

    环境查看 # 1 查询当前centOS的版本,官方要求版本为7以上 uname -r 查询系统内核 cat /etc/os-release 系统版本 安装 # 1.卸载旧版本 yum remove d ...

  5. Redis变慢?深入浅出Redis性能诊断系列文章(二)

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术) 本篇为Redis性能问题诊断系列的第二篇,本文主要从应用发起的典型命令使用上进 ...

  6. Python工具箱系列(四)

    上期描述了如何在Windows下安装官方的Python3.8,本期描述如何安装Anaconda.建立Python环境这个话题,为何要大费周章.不厌其烦的叙述呢,主要的原因是: 所有的语言在设计时,都假 ...

  7. 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

    摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...

  8. uniapp路由守卫

    项目地址:https://hhyang.cn/v2/start/quickstart.html ​ 按照他的方法安装,创建相应的js即可,有点基础的自己捣鼓一下就可以了.我的应用场景是:没有登录痕迹- ...

  9. NSIS安装界面无虚线框移动

    最近很多应用程序都在安装界面的美化上面下足了功夫,一个漂亮流畅的安装界面无疑会给其带来用户体验上的加分,其中一个无虚线框跟随鼠标移动比较有趣,狂翻msdn后终于找到了控制函数SystemParamet ...

  10. 微软出品自动化神器Playwright(Playwright+Java)系列(四) 之 浏览器操作

    写在前面 今天是国庆节的最后一天,明天又要上班了,真的是感觉好像才开始放假一样,还是因为失恋没缓过来吗? 我的国庆七天 第1天,当了近半天的司机,陪家人去各大超市去购物,下午在家躺····· 第2-5 ...