稀疏数组(java实现)
1.稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是:
1.1记录数组一共有几行几列,有多少个不同的值
1.2把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 I
2.二维数组转稀疏数组的思路
2.1.遍历原始的二维数组,得到有效数据的个数sum
2.2.根据sum 就可以创建稀疏数组sparseArr intsum+1
2.3.将二维数组的有效数据数据存入到稀疏数组
3.稀疏数组转原始的二维数组的思路
3.1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如 上面的chessAr2=int11
3.2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可.
4.应用实例
使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)把稀疏数组存盘,并且可以从新恢复原来的二维数组数整体思路分析
public class SparseArray {
public static void main(String[] args) {
//创建二维数组 1表示黑色的 2表示蓝色的 0表示空
int chessarr1[][] = new int[11][11];
chessarr1[1][2] = 1;
chessarr1[2][3] = 2;
//遍历循环二维数组
System.out.println("原始二维数组为");
for (int[] row : chessarr1) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
//遍历原始二维数组,从而得到非0的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessarr1[i][j] != 0) {
sum++;
}
}
}
//创建对应的稀疏数组
int sparsearr[][] = new int[sum + 1][3];
//给稀疏数组复制
sparsearr[0][0] = 11;
sparsearr[0][1] = 11;
sparsearr[0][2] = sum;
//遍历二维数组 将非0的值放在 sparsearr中
int count=0;//用于记录第几个非0数据
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(chessarr1[i][j]!=0){
count++;
sparsearr[count][0]=i;
sparsearr[count][1]=j;
sparsearr[count][2]=chessarr1[i][j];
}
}
}
//输出稀疏数组的形式
System.out.println();
System.out.println("稀疏数组为");
for(int i=0;i<sparsearr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparsearr[i][0],sparsearr[i][1],sparsearr[i][2]);
}
System.out.println();
//将稀疏数组转换为二维数组
int chessarr2[][]=new int[sparsearr[0][0]][sparsearr[0][1]];
//从第二行开始遍历稀疏数组
for(int i=1;i<sparsearr.length;i++){
chessarr2[sparsearr[i][0]][sparsearr[i][1]]=sparsearr[i][2];
}
//恢复后的稀疏数组为
for (int[] row : chessarr2) {
for (int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
}
}
稀疏数组(java实现)的更多相关文章
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
- 图解Java数据结构之稀疏数组
在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...
- 【学习总结】java数据结构和算法-第三章-稀疏数组和队列
相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- Java数组声明创建和使用以及多维数组、Arrays类、稀疏数组
目录 数组概述 数组声明创建 内存分析 java内存分析 堆 栈 方法区 三种初始化 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 小结: 数组使用 数组基础使用 For E ...
- Java的稀疏数组的简单代码实现
目录 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 二.稀疏数组的Java代码实现思路 三.稀释数组的Java代码实现 四.结语 Java的稀疏数组的简单代码实现 一.稀疏数组的基本概念 ...
- 数据结构(1):稀疏数组使用java实现
主要是用于数组压缩,去除无效的数组内容: 原数组内容: 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 转换成 稀疏数组 5 5 2 1 1 1 2 ...
- java基础——多维数组和稀疏数组
多维数组 多维数组可以堪称数组的数组,比如二维数组就是一个特殊的一维数组,其中每一个元素都是一个以为数组 而且数组 int a[][]= new int[2][3]; public class Arr ...
- Java数组07——稀疏数组
稀疏数组 总结: 记录有效的坐标: 记录原始做表的大小和有效值的个数 记录每一个有效值的坐标 ,变成一个新的数组 age: package array; public class ArrayDe ...
- java基础-冒泡排序以及稀疏数组
java基础 以下内容为本人的学习笔记,如需要转载,请声明原文链接 https://www.cnblogs.com/lyh1024/p/16720908.html Ø 冒泡排序原理: 比较数组中, ...
随机推荐
- simplec与simple【转载】
转载自:http://blog.163.com/wu_yangfeng/blog/static/161897379201041581144971/ 在FLUENT中,可以使用标准SIMPLE算法和SI ...
- 【Python 代码】CS231n中Softmax线性分类器、非线性分类器对比举例(含python绘图显示结果)
1 #CS231n中线性.非线性分类器举例(Softmax) #注意其中反向传播的计算 # -*- coding: utf-8 -*- import numpy as np import matplo ...
- 简要介绍 X Window System (又称为X11 or X)
X11是一个应用程序,而不是一个操作系统,主要功能是提供图形界面,实现架构和网络架构相同,有X Client和X Server组件,另外还有Window Manager和Display Manager ...
- Java设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
- 第十六周助教工作总结——NWNU李泓毅
助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:团队项目设计完善&编码:https://www.cnblogs.com/nwnu-daizh/ ...
- Vue学习手记08-vue-cli的启动过程
分两种情况---无路由和有路由 无路由 看到启动页面 在文件main.js( vue项目的入口文件)中 这里可以看到,生成了一个全局的vue实例,绑定在了#app上面,也就是在文件index.html ...
- vmWare安装centos7之后使用yum安装提示there are on enabled repos(修改yum源)
可以使用这个命令修改yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.rep ...
- Binder 原理剖析***
一. 前言 希望更加深入理解 Binder 实现机制的,可以阅读文末的参考资料以及相关源码. 二. Binder 概述 简单介绍下什么是 Binder.Binder 是一种进程间通信机制,基于开源的 ...
- .net Core 中DateTime在Linux Docker中与Windows时间不一致
最近写了一个.net core项目,部署到CentOS并在docker上运行的时候,发现DateTime.Now获取的时间与Windows不一致(定时执行的任务,晚了8个小时),在Windows中可以 ...
- 微信小程序-收货地址左滑删除
我参照了其中的部分代码,如:bindtouchstart,bindtouchmove,bindtouchend事件多数组中偏移值的更改, 在结合微信 movable-area 和 movable-vi ...