Java数据结构和算法(2)之稀疏数组

1.定义

稀疏数组可以看做是普通二位数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组,关于稀疏数组的运用有五子棋盘,地图等..

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

2.好处

* 原数组中存在大量的无效数据占据了大量的存储空间,真正有用的数据却少之又少

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

* 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率

3.稀疏数组的结构

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

* 第一行存储原始数据总行数,总列数,总的非0数据个数

* 接下来每一行都存储非0数所在行,所在列,和具体值(如下图)

行列都是11的二位数组

把上面的二维数组转化为稀疏数组

备注:因为数组的下标是从0开始的,所以他们的标号也是从0开始的(重要)

4.二维数组 转 稀疏数组的思路

*遍历原始的二维数组,得到有效数据的个数 sum

*根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]

*将二维数组的有效数据数据存入到 稀疏数组

5.稀疏数组转原始的二维数组的思路

*先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,

比如上面的 chessArr2 = int [11][11]

*在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.

6.代码实现

 1 public class Sparsearray {
 2
 3     public static void main( String[] args) {
 4         System.out.println("===========二维数组转换稀疏数组============");
 5         int[][] array=new int[11][11];
 6         array[1][2]=1;
 7         array[2][3]=2;
 8         System.out.println("============转换前的二维数组============");
 9         forToarray(array);
10         System.out.println("============转换后的二维数组============");
11         int[][] sparsearry = arrayToSparsearry(array);
12         forToarray(sparsearry);
13         System.out.println("===========将稀疏数组转化为原始数组============");
14         array = sparsearryToArray(sparsearry);
15         forToarray(array);
16
17     }
18     /**
19      *二维数组转换稀疏数组
20      * @param array
21      */
22     private static int [][] arrayToSparsearry(int[][] array) {
23         int sum=1;
24         for (int i = 0; i < array.length; i++) {
25             int[] datas=array[i];
26             for (int j = 0; j < datas.length; j++) {
27                 if (array[i][j]!=0) {
28                     sum++;
29                 }
30             }
31         }
32
33         int [][] sparse=new int[sum][3];
34         int s=0;
35         sparse[s][0]=array.length;
36         sparse[s][1]=array[0].length;
37         sparse[s][2]=sum-1;
38         for (int i = 0; i < array.length; i++) {
39             int[] datas=array[i];
40             for (int j = 0; j < datas.length; j++) {
41                 int a=array[i][j];
42                 if (a!=0) {
43                     s++;
44                     sparse[s][0]=i;
45                     sparse[s][1]=j;
46                     sparse[s][2]=a;
47                 }
48             }
49         }
50
51         return sparse;
52     }
53     /**
54      *遍历数组
55      * @param array
56      */
57     private static void forToarray(int[][] array) {
58         for (int i = 0; i < array.length; i++) {
59             int [] ints=array[i];
60             for (int j = 0; j < ints.length; j++) {
61                 System.out.print("  "+array[i][j]);
62             }
63             System.out.println("");
64         }
65     }
66      /*
67       * 稀疏数组转化为原始数组
68      * @param array
69      */
70     private static int [][] sparsearryToArray(int[][] array) {
71         int [] [] arrays=new int [array[0][0]][array[0][1]];
72             for (int i = 1; i < array.length; i++) {
73                 int[] js = array[i];
74                 for (int j = 0; j < js.length; j++) {
75                     arrays[array[i][0]][array[i][1]]=array[i][2];
76                 }
77
78             }
79         return arrays;
80     }
81 }

*执行后的结果如下

===========二维数组转换稀疏数组============
============转换前的二维数组============
  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
============转换后的二维数组============
  11  11  2
  1  2  1
  2  3  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

原文地址:https://www.cnblogs.com/gzxg/p/12687975.html

时间: 2024-10-10 20:12:56

Java数据结构和算法(2)之稀疏数组的相关文章

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

上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖——数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要的数据结构,当然每种语言对数组的实现和处理也不相同,但是本质是都是用来存放数据的的结构,这里我们以Java语言为例,来详细介绍Java语言中数组的用法. 1.Java数组介绍 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. ①.数组的声明 第一种方式: 数据类型 []

数据结构与算法学习之(稀疏数组)

稀疏数组 实际需求 二维数组很多值为0,记录了很多没有意义的数据,故引出稀疏数组 基本介绍 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存数组 稀疏数组的处理方法: 记录数组一共有几行几列,有多少个不同的值 把具有不同的元素的行列及值记录在一个小规模的数组中,从而缩小规模 二维数组转稀疏数组思路 遍历原始二维数组,得到有效的数据个数sum 根据sum就可以创建稀疏数组sparseArr intsum - 1 将二维数组的有效数据存入到稀疏数组 稀疏数组转二维数组的思路

Java数据结构与算法(第二章数组)

数组是应用最广泛的数据存储结构.它被植入到大部分编程语言中. Java中数组的基础知识     创建数组 在Java中把它们当作对象来对待,因此在创建数组是必须使用new操作符:     int[] intArray;            //defines a reference to an array     ingArray = new int[100];    //creates the array, and                                  //set

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

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

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

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

Java数据结构与算法之数组

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

《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 或使用等价的

《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