稀疏数组的超细详解

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

例如一个五子棋棋盘,我们将棋盘看作为一个二维数组,没有棋子的位置为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. 金九银十,收下这份 Java String 面试题

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭 ...

  2. KingbaseES例程之拥有大量索引的表导入数据

    概述 如何快速插入大量数据比如几千万上亿的带索引的数据表. 数据准备 准备一个拥有二十个索引的数据表. kingbase=# \d+ bigtab Table "kingbase.bigta ...

  3. IDEA 修改注释的颜色

  4. day39-网络编程01

    Java网络编程01 1.网络相关的概念 1.1网络通信和网络 网络通信 概念:两台设备之间通过网络实现数据传输 网络通信:将数据通过网络从一台设备传输到另一台设备 java.net包下提供了一系列的 ...

  5. 【Java UI】HarmonyOS添加日历事件

    ​参考资料 CalendarDataHelper Events Reminders api讲解 添加权限 在config.json添加权限代码如下 "reqPermissions" ...

  6. 第一章:模型层 - 10:不返回QuerySets的API

    以下的方法不会返回QuerySets,但是作用非常强大,尤其是粗体显示的方法,需要背下来. 方法名 解释 get() 获取单个对象 create() 创建对象,无需save() get_or_crea ...

  7. 1_Linux

    一. Linux介绍 1.1 引言 在学习Linux之前, 大家先了解开发环境,生产,测试环境 开发环境: 平时大家大多是在Windows或者Mac操作系统下去编写代码进行开发,在开发环境中安装大量的 ...

  8. 驱动通信:通过PIPE管道与内核层通信

    在本人前一篇博文<驱动开发:通过ReadFile与内核层通信>详细介绍了如何使用应用层ReadFile系列函数实现内核通信,本篇将继续延申这个知识点,介绍利用PIPE命名管道实现应用层与内 ...

  9. .NET下数据库的负载均衡(有趣实验)(续)

    .NET下数据库的负载均衡(有趣实验)这篇文章发表后,受到了众多读者的关注与好评,其中不乏元老级程序员. 读者来信中询问最多的一个问题是:它是否能支持"异种数据库"的负载均衡?? ...

  10. HDU3001 Travelling (状压DP)

    题目没有起点限制,且每个节点至少访问1次,最多访问2次,所以用三进制数表示节点的状态(选取情况). 因为三进制数的每一位是0或1或2,所以预处理z状态S的第j位的数是有必要的. 边界条件:dp[tri ...