JAVA数据结构与算法-稀疏数组

  实际需求 

  • 分析问题

  因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组

  1.基本介绍  

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

  1.记录数组一共有几行几列,有多少不同的值

  2.把具有不同的值的元素的行列及值记录在一个小规模的数组中,从而去缩小程序规模

稀疏数组说明

  2.应用实例

  1. 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
  2. 把稀疏数组存盘,并且可以从新恢复原来的二维数组数
  3. 整体思路分析

3.加了比较多的注释方便理解

 1  public static void main(String[] args) {
 2         //创建一个原始的二维数组11*11
 3         //0:表示没有棋子 1 表示黑子 2表示篮子
 4         int chessArr1[][] = new int[11][11];
 5         chessArr1[1][2] = 1;
 6         chessArr1[2][3] = 2;
 7
 8         //输出原始二维数组
 9         for (int[] row : chessArr1){
10             for (int data : row){
11                 System.out.printf("%d\t",data);
12             }
13             System.out.println();
14         }
15
16         //将二维数组 转 稀疏数组
17         //1.先遍历二维数组 得到有效数据的个数
18         int sum = 0;
19         for (int i = 0; i<11; i++){
20             for (int j = 0; j<11; j++){
21                 if (chessArr1[i][j] != 0){
22                     sum++;
23                 }
24             }
25         }
26         System.out.println(sum);
27         //创建对应的稀疏数组  多少行等于有效数据个数+1
28         int sparseArr[][]  = new int[sum+1][3];   //列是固定的 第一个值行 第二个值 列 第三个值 有效值
29         // 给稀疏数组赋值
30         sparseArr[0][0] = 11; //行为11
31         sparseArr[0][1] = 11;  //列为11
32         sparseArr[0][2] = sum; //第一行第三列值为有效个数
33
34         //遍历二维数组 将非0的值存放(有效) sparseArr 稀疏数组中
35         int count = 0;//用于·记录第几个非0数据
36         for (int i = 0; i<11; i++){//11行
37             for (int j = 0; j<11; j++){
38                 if (chessArr1[i][j] != 0){ //二维数组中值不等于0
39                     count++;
40                     sparseArr[count][0] = i;//行
41                     sparseArr[count][1] = j;//列
42                     sparseArr[count][2] =  chessArr1[i][j]; //第三列就是值
43                 }
44             }
45         }
46     //输入稀疏数组的形式
47         System.out.println();
48         System.out.println("得到的稀疏数组为~~~~~");
49         for (int i = 0; i<sparseArr.length; i++){
50             //第一个列值为行 第二 列   第三个值为有效对应值
51             System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
52         }
53
54
55         //将稀疏数组--->恢复成原始的二维数组
56         /**
57          * 1.先读取稀疏数组的第一行根据第一行的数据 创建原始的二维数组 比如上面 chessArr2
58          * 2.在读取稀疏数组后几行的数据 并赋给原始的二维数组即可
59          */
60        // 1.先读取稀疏数组的第一行根据第一行的数据 创建原始的二维数组 比如上面 chessArr2
61         /** 稀疏数组结构是这样
62          * 11 11 2
63          * 1 2 1
64          * 2 3 2
65          */
66         int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; //第一个值 行 第二个值 列
67         //2.在读取稀疏数组后几行的数据 从第二行开始 并赋值给 原始二维数组
68         //从二行开始 为什么? 因为第一行是行和值
69         for(int i=1;i<sparseArr.length; i++){
70             chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
71             chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
72         }
73         //3.输出恢复后的二维数组
74         System.out.println();
75         System.out.println("恢复后的二维数组");
76
77         for (int[] row : chessArr1){
78             for (int data : row){
79                 System.out.printf("%d\t",data);
80             }
81             System.out.println();
82         }
83
84     }
1 int row=sparsearr[i][0]
2 int col=sparsearr[i][i]
3 chessarr[row][col]=sparsearr[i][2]
4 重点在于列和行 把sparsearr的值得行和列给chessarr
5 chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; 

4.对应执行效果

原文地址:https://www.cnblogs.com/Jack-GUO/p/12523611.html

时间: 2024-09-30 19:02:56

JAVA数据结构与算法-稀疏数组的相关文章

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构与算法之数组

数组特点: 1.大小固定 2.同一数据类型 3.下标访问 4.数据项可重复 Java数据类型:基本类型(int和double)和对象类型.在许多编程语言中,数组也是基本类型.但在Java中把它们当作对象来对待,因此在创建数组时必须使用new操作符. 有序数组与无序数组比较:最主要的好处是查找速度比无序数组快多了.不好的方面是在插入操作中由于所有靠后的数据都需要移动以疼开空间,所以速度较慢.有序数组和无序数组数据中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的空洞. 数据访问:从

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的

数据结构与算法—稀疏数组和队列

目录 稀疏数组和队列 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 稀疏数组和队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据.OK,如果你不明白,那我们来看一个例子. ? 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多

Java数据结构预算法之稀疏数组

Java稀疏数组 定义 稀疏数组:数组中的大部分元素值都没有使用(或者都为0),在数组中仅有少部分的空间使用,造成了内存空间的浪费. 使用新的压缩的方式表示原来数组的方式为稀疏数组. 为什么要使用稀疏数组? 为了节省内存空间. 稀疏数组实现原理 引入应用场景 开发人员需要开发一个五子棋的游戏,为了实现存档.悔棋和判断棋局胜负,需要对这些棋子的位置进行存储,由于棋盘是一个矩形的,所以可以使用二维数组. 但是想象下棋过程,我们可能会给许多没有使用的位置分配内存(即数组中大部分数据是0或者为同一个值)

《Java数据结构和算法》- 哈希表

Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计算机内存都可以满足. 为了尽可能地存取每个员工的记录,使用工号从1(公司创业者)到1000(最近雇佣的工人).将工号作为关键字(事实上,用其他作为关键字完全没有必要).即使员工离职不在公司,他们的记录也是要保存在数据库中以供参考,在这种情况下需要使用什么数据结构呢? A: 一种可能使用数组,每个员工

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set