Java的稀疏数组的简单代码实现
Java的稀疏数组的简单代码实现
一、稀疏数组的基本概念
当二维数组的很多值是默认值 0,或者有很多相同的值时,记录了很多没有意义的数据,因此,在这里,我们需要引入一个新的概念——稀疏数组
在稀疏数组中,每行分别有三个元素:行,列,值。在稀疏数组的第一行,行表示原数组的行数,列表示原数组的列数,值表示原数组非0数据的个数;接下来的稀疏数组的几行中,行表示非0数据所在原数组的行数,列表示非0数据所在原数组的列数,而值则代表此非0数据的值。
如下面这个数组:
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
用稀疏数组表示为:
5 5 2 (表示原始数组有4行7列,有2个非0的值)
0 3 2 (表示在原始数组的下标为0的行、下标为3的列上有值为2,即在原始数组的1行4列上是2)
3 1 1 (表示在原始数组的下标为3的行、下标为1的列上有值为1,即在原始数组的4行2列上是1)
与原数组相比,稀疏数组变小了很多,原始数组有25个元素,而用稀疏数组表示则只有9个元素。
二、稀疏数组的Java代码实现思路
- 求出原始数组中非0的值的个数
- 创建二维数组,稀疏数组的第一行分别为原始数组的行数、列数、非0值的个数
- 利用for循环找出原始数组中非0值以及非0值的行标和列标,从稀疏数组第二行开始就是原始数组的非0值的坐标,第一列是非0值在原始数组中的下标行数,第二列就是非0值在原始数组中的下标列数,第三列就是非0值
三、稀释数组的Java代码实现
package array;
/*
实现java的稀疏数组
*/
public class arrayDemo_01 {
/*
原数组 5*5 有效值 2
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
可以看出原数组中除了2个值外,其他的都是0
稀疏数组
5 5 2
0 3 2
3 1 1
*/
//因为代码中多次出现for循环,所以定义遍历traversal方法
public static int traversal(int[][] array) {
int sum = 0;
for (int[] ints : array) {
for (int anInt : ints) {
System.out.print(anInt + "\t"); //打印数组
if (anInt != 0) {
sum++; //获取非零值的个数
}
}
System.out.println();
}
return sum;
}
public static void main(String[] args) {
//原始数组
int[][] array1 = new int[5][5];
array1[0][3] = 2;
array1[3][1] = 1;
//输出原始数组
System.out.println("\t\t\t原始数组");
//获取有效值的个数,同时输出原始数组
int sum = traversal(array1);
System.out.println();
System.out.println("==================================");
System.out.println();
//转化为稀疏数组保存
//创建一个稀疏数组的数组
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 5;
array2[0][1] = 5;
array2[0][2] = 2;
int count = 0; //充当稀疏数组的行
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
count++;
array2[count][0] = i; //稀疏数组第一列为原始数组的行
array2[count][1] = j; //稀疏数组第二列为原始数组的列
array2[count][2] = array1[i][j]; //稀疏数组第三列为原始数组非零值
}
}
}
System.out.println("有效值:" + count);
//输出稀疏数组
System.out.println(" 稀疏数组");
for (int[] ints : array2) {
System.out.println(ints[0] + "\t"
+ ints[1] + "\t"
+ ints[2] + "\t");
}
System.out.println("====================");
System.out.println("还原");
//读取稀疏数组,创建数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//还原其他的值
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//打印还原后的数组
System.out.println("\t\t 还原后的数组");
traversal(array3);
}
}
四、结语
在运用稀疏数组时,不一定要是0值,其他值占大多数时也可以用稀疏数组。
本文是本人在学习过程中的笔记分享,欢迎大家指正批评,同时也希望能够帮助到需要的人!
Java的稀疏数组的简单代码实现的更多相关文章
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- Java学习之数组的简单用法
•概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...
- java实现稀疏数组压缩
package sparseArray; public class SparseArray { public static void main(String[] args) { // TODO Aut ...
- [JAVA] Tcp客户端和服务器简单代码
服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...
- java中二维数组求最大值代码。。。。。。不懂呀
总结:二维数组理解不了,,,,求解析... package com.c2; public class Aaa { // 求数组元素中最大的 public static void main(String ...
- 理解JS里的稀疏数组与密集数组
一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...
- javascript中的稀疏数组(sparse array)和密集数组
学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
- 图解Java数据结构之稀疏数组
在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...
随机推荐
- React---路由跳转
最近在开发react的项目中,很多地方都是使用组件式的跳转方式,但是怎么样使用js去控制页面的跳转呢? withRouter withRouter 是一个高阶组件,把 match,location,h ...
- Prometheus监控Kafka
Prometheus监控Kafka 1.Prometheus监控Kafka,Docker方式 Kafka监控优秀博文: 简书:whaike:[监控]Kafka - 详细指标 CSDN:GeekXuSh ...
- centos编译安装vim7.4
./configure --with-features=huge --enable-fontset --enable-gui=gtk2 --enable-multibyte --enable-pyth ...
- 子网划分、变长子网掩码和TCP/IP排错__子网、掩码、网络汇总
1.如何创建子网? 要创建子网,就需要从IP地址的主机部分中借出一定的位,并且保留它们用来定义子网地址.这意味着用于主机的位减少,所以子网越多,可用于定义主机的位越少. 2.子网划分的好处: 1)缩减 ...
- Codeforces Round #654 (Div. 2)
比赛链接:https://codeforces.com/contest/1371 A. Magical Sticks 题意 有 $n$ 根小棍,长度从 $1$ 到 $n$,每次可以将两根小棍连接起来, ...
- uva10891 Game of Sum(博弈+区间dp+优化)
题目:点击打开链接 题意:两个人做游戏,共有n个数,每个人可以任选一端取任意多连续的数,问两个人都想拿最多的情况下,先手最多比后手多拿多少分数. 思路:这题一开始想到的是用dp[i][j]表示区间[i ...
- 【noi 2.6_9290】&【poj 2680】Computer Transformation(DP+高精度+重载运算符)
题意:给一个初始值1,每步操作将1替换为01,将0替换为10.问N步操作后有多少对连续的0. 解法:f[i]表示第i步后的答案.可以直接打表发现规律--奇数步后,f[i]=f[i-1]*2-1;偶数步 ...
- A. Crazy Town
Crazy Town is a plane on which there are n infinite line roads. Each road is defined by the equation ...
- 郁闷的出纳员 HYSBZ - 1503
OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他 ...
- 记录一些Python中不常用但非常好用的函数
zfill(): 方法返回指定长度的字符串,原字符串右对齐,前面填充0. print('Helloworld'.zfill(50))0000000000000000000000000000000000 ...