稀疏数组

什么是稀疏数组?

假设有这样的一个二维数组

shape是11x11,但是很多数据都是0,比较浪费空间,我们可以通过一些方法来压缩这个数组,稀疏数组就是一种压缩数组的方法,通过稀疏数组变换后,原数组变为


变成了4X3,节约了很多空间

稀疏数组存储原理

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

稀疏数组处理数据的方法是:

  • 记录数组一共有几行几列,有多少个不同的值
  • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

稀疏数组的实现

1.定义一个SparseArray类

public class SparseArray implements Serializable {private static int[][] array1;public SparseArray(int[][] array1) {this.array1 = array1;}public SparseArray() {}
}

2.向SparseArray类中添加将普通数组变为SparseArray的方法

public  void toself(int[][] sou){int row = sou.length;int col = 0;int count = 0;for (int[] so:sou){col = so.length;for (int s:so){if (s!=0){count++;}}}array1 = new int[count+1][3];array1[0][0] = row;array1[0][1] = col;array1[0][2] = count;int target = 1;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (sou[i][j]!=0){array1[target][0] = i;array1[target][1] = j;array1[target][2] = sou[i][j];target++;}}}}

3.向SparseArray中添加将稀疏数组变为普通数组的方法

public  int[][] toarray(){int[][] result = new int[array1[0][0]][array1[0][1]];for (int[] demp:array1){result[demp[0]][demp[1]] = demp[3];}return result;}

4.为了方便测试,给SparseArray类添加print方法

 public  void print(){System.out.println(array1[0][0]+"---"+array1[0][1]+"---"+array1[0][2]);System.out.println("---------------------------------------");for (int i = 1; i <= array1[0][2]; i++) {System.out.println(array1[i][0]+"---"+array1[i][1]+"---"+array1[i][2]);}}

补充:将SparseArray类存入磁盘和磁盘中读取

1,存盘

public static void save(SparseArray obj,String path){File file = new File(path);OutputStream out;try {out = new FileOutputStream(file);ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);objectOutputStream.writeObject(obj);objectOutputStream.flush();objectOutputStream.close();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

2,读取

public static SparseArray read(String path){File file = new File(path);InputStream in;try {in = new FileInputStream(file);ObjectInputStream objectInputStream = new ObjectInputStream(in);Object o = objectInputStream.readObject();SparseArray res = (SparseArray)o;in.close();return res;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return null;}

JAVA数据结构-稀疏数组相关推荐

  1. java数据结构之数组

    数据结构对我们的程序员也是非常重要的,相当于一个基础学科,从今天开始,咱们再重新学习一下数据结构吧 1,首先我们要定义一下泛型,初始化成员变量,声明构造方法. private T data[];pri ...

  2. Java数据结构-基于数组的栈和泛型

    泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...

  3. Java数据结构与算法学习 目前30170字

    文章借鉴于[尚硅谷]数据结构与算法(Java数据结构与算法),在内容方面会做更改,但是核心依然是他们的学习视频.在这里声明. 1. 线性结构和非线性结构 1.1 线性结构 数据结构包括两大部分,一个叫 ...

  4. 【Java数据结构与算法】第一章 稀疏数组和队列

    第一章 稀疏数组和队列 文章目录 第一章 稀疏数组和队列 一.线性结构和非线性结构 1.线性结构 2.非线性结构 二.稀疏数组 三.队列 1.队列 2.环形队列 一.线性结构和非线性结构 1.线性结构 ...

  5. JAVA数据结构与算法【稀疏数组】

    先看一个实际的需求: 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 记录数组一共有几行几列,有多少个不同的值 把具有不同值的元素 ...

  6. 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现

    文章目录 基本介绍 应用实例 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外) ...

  7. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  8. java 二维数据结构_JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  9. 数据结构与算法————稀疏数组

    引言 数据压缩方面,我们往往可以通过稀疏数组来保存有效数据,节省存储空间. 一.稀疏数组的概念 当一个数组中大部分元素是0,或为同一个值的时候,可以使用稀疏数组来保存数组. 它是一个十分有效的存储结构 ...

最新文章

  1. 关于读取数据库进行数据处理的一些小问题
  2. sublime Text 2 安装Sublime Package Control
  3. react native改变app的图标和名称
  4. (Metro学习三)图片uri保存到本地图片库
  5. Emmet使用-----HTML
  6. python引入模块时import与from ... import的区别
  7. 计算机科学必读书籍_5篇关于数据科学家的产品分类必读文章
  8. vue中refs的使用
  9. XML Schema --simpleType
  10. libvpx在windows下的编译
  11. 管理节点连接不上sql节点_华为云IEF智能边缘平台十万边缘节点管理技术深度解读学习笔记...
  12. Springboot记录
  13. 学习python的语法规则
  14. golang 腾讯通用OCR 文字识别 Api 调用
  15. Word文档标题“多级编号”设置(用于处理 文档二级标题不跟随一级标题序号编号,如 本应该为2.1 结果为1.1)
  16. 标准偏差:评价数据的离散程度
  17. Radare2 框架介绍及使用
  18. 2020李宏毅机器学习笔记-Convolution Netural Network
  19. 沉睡者 - 微信内测一个手机可注册2微信号
  20. 《数据库系统概念》8-选择、投影等关系运算

热门文章

  1. 北京大学计算机研究所所长,北大计算机研究所所长郭宗明:探索新机制,释放科研创新能力...
  2. 链式队列的基本操作(入队、出队、遍历队列、清空队列)
  3. MySql分表、分库、分片和分区知识(转载)
  4. CG CTF WEB md5 collision
  5. Floyed-Warshall算法
  6. 数据库查询近七天的数据
  7. MySQL数据库-笔记01【数据库概念、数据库安装、终端操作数据库】
  8. Android 插件化
  9. Android构建流程——篇四
  10. CKEditor上传视频(java)