Day17:稀疏数组的超细详解
稀疏数组的超细详解
一个含有大量重复元素的二维数组,我们可以提取其有效元素,压缩空间,整合为一个稀疏数组。
例如一个五子棋棋盘,我们将棋盘看作为一个二维数组,没有棋子的位置为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:稀疏数组的超细详解的更多相关文章
- GoLang基础数据类型--->数组(array)详解
		
GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...
 - 超全详解Java开发环境搭建
		
摘自:https://www.cnblogs.com/wangjiming/p/11278577.html 超全详解Java开发环境搭建 在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必 ...
 - 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
		
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
 - js数组的sort排序详解
		
<body> <div> sort()对数组排序,不开辟新的内存,对原有数组元素进行调换 </div> <div id="showBox" ...
 - JavaScript数组的reduce方法详解
		
数组经常用到的方法有push.join.indexOf.slice等等,但是有一个经常被我们忽略的方法:reduce,这个方法简直强大的不要不要的. 我们先来看看这个方法的官方概述:reduce() ...
 - C语言数组空间的初始化详解
		
数组空间的初始化就是为每一个标签地址赋值.按照标签逐一处理.如果我们需要为每一个内存赋值,假如有一个int a[100];我们就需要用下标为100个int类型的空间赋值.这样的工作量是非常大的,我们就 ...
 - GO语言数组和切片实例详解
		
本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...
 - OC中数组类NSArray的详解,数组的遍历(二)
		
数组类的便利 1.for循环(大家都会的...) 2.NSEmunerator 3.for in 首先重点说下 第二种NSEmunerator枚举器,系统声明是 @interface NSEnumer ...
 - OC中数组类NSArray的详解,常用属性和方法(一)
		
数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA
 - 中文分词系列(一) 双数组Tire树(DART)详解
		
1 双数组Tire树简介 双数组Tire树是Tire树的升级版,Tire取自英文Retrieval中的一部分,即检索树,又称作字典树或者键树.下面简单介绍一下Tire树. 1.1 Tire树 Trie ...
 
随机推荐
- KingbaseFlySync ddl变更流程
			
关键字: KingbaseFlySync.Linux.x86_64.mips64el.aarch64.Java 一.ddl变更流程 1. 停掉客户业务,保证没有新数据产生 确认Oracle数据库上所有 ...
 - Spark 读取HDFS csv文件并写入hive
			
package com.grady import org.apache.spark.SparkConf import org.apache.spark.sql.{Row, SaveMode, Spar ...
 - cmake 入门笔记
			
以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16667896.html 1. cmake 是什么? 这些 ...
 - Netty 学习(二):服务端与客户端通信
			
Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...
 - Java SE  7、接口
			
接口 接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来 语法 interface 接口名{  //属性  //方法 } class 类名 imple ...
 - Deployment控制器(pod)更新策略
			
最小就绪时间: 配置时,用户可以使用Deplpoyment控制器的spec.minReadySeconds属性来控制应用升级的速度.新旧更替过程中,新创建的Pod对象一旦成功响应就绪探测即被视作可用, ...
 - Kibana可视化数据(Visualize)详解
			
可视化 (Visualize) 功能可以为您的 Elasticsearch 数据创建可视化控件.然后,您就可以创建仪表板将这些可视化控件整合到一起展示. Kibana 可视化控件基于 Elastics ...
 - JS 模块化- 04 CMD 规范与 Sea JS
			
1 CMD 规范介绍 CMD: Common Module Definition, 通用模块定义.与 AMD 规范类似,也是用于浏览器端,异步加载模块,一个文件就是一个模块,当模块使用时才会加载执行. ...
 - LeetCode - 数组的旋转总结
			
1. 数组的旋转总结 数组的旋转指的是将数组的最后若干个数提前到数组前面,数组的翻转指的是将数组的顺序颠倒.旋转可以通过多次翻转实现. 数组的翻转很简单,通过双指针来实现:交换数组的第一个数和最后一个 ...
 - day04-MySQL常用函数01
			
5.MySQL常用函数 5.1合计/统计函数 5.1.1合计函数-count count 返回行的总数 Select count(*)|count (列名) from table_name [WHER ...