稀疏数组的超细详解

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

例如一个五子棋棋盘,我们将棋盘看作为一个二维数组,没有棋子的位置为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. FFT/NTT 学习笔记

    0. 前置芝士 基础群论 复数 \(\mathbb C = \mathbb R[x^2+1]\) 则有 \(i^2+1=(-i)^2+1=0\),\(i \in \mathbb C - \mathbb ...

  2. 餐饮行业SRM案例:方正璞华"采云链"携手和府捞面

    ​ 方正璞华在与和府捞面的项目中,帮助整合采购系统,系统化管理供应商,优化采购流程和数据分析,建立储备知识库. 项目背景 企业介绍 ◇ 和府捞面成立于2012年,是国内中式面食头部品牌.自2013年首 ...

  3. 批量修改DNS记录的TTL值

    最近有个需求,需要修改Windows DNS服务器上区域下所有A记录的TTL值.原先默认的TTL是1小时.也就是说,其它DNS服务器会缓存查询到的记录1个小时.对于近期需要大量修改记录的情况来说这样生 ...

  4. Python数据科学手册-机器学习介绍

    机器学习分为俩类: 有监督学习 supervised learning 和 无监督学习 unsupervised learning 有监督学习: 对数据的若干特征与若干标签之间 的关联性 进行建模的过 ...

  5. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  6. Alermanager_template,email

    default.tmpl {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing ...

  7. 7.nexus版本升级

    nexus-3.14.0升级到3.15.2 首先来看下原来的服务目录: nexus-3.14.0-04 sonatype-work 注意:nexus-3.14.0-04是应用程序包,sonatype- ...

  8. Flink的异步算子的原理及使用

    1.简介 Flink的特点是高吞吐低延迟.但是Flink中的某环节的数据处理逻辑需要和外部系统交互,调用耗时不可控会显著降低集群性能.这时候就可能需要使用异步算子让耗时操作不需要等待结果返回就可以继续 ...

  9. python-D3-语法入门1

    Python语法注释 什么是注释 注释其实就是对一段代码的解释说明(注释是代码之母) 如何编写注释 方式1:解释说明文字前加警号 (pycharm中有快捷键ctrl+?) # 注释(单行注释) 方式2 ...

  10. dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言

    相信有很多伙伴都很喜欢自己造编程语言,在有现代的很多工具链的帮助下,实现一门编程语言,似乎已不是一件十分困难的事情.我利用 SourceGenerator 源代码生成技术实现了一个简易的中文编程语言, ...