java数据结构-稀疏数组 作者:哇塞大嘴好帥
作者:哇塞大嘴好帥(哇塞大嘴好帅)
1.介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
如果在开发中使用这个算法可以节省我们的空间提升效率.
稀疏数组的处理方法是
- 纪律数组一共有就几行几列,有多少个不同的值
- 把具体由不同的值的元素的行列和值纪律在一个小规模的数组中,从而缩小程序的规模
首先观察稀疏数组的第0行第0列他的值是6 意思就是原二维数组的行数 ,
在观察下稀疏数组的第0行第1列他的值是7 意思就是原二维数组的列数
在观察下稀疏数组的第0行第2列他的值是8 意思就是原二维数组有8个非0的数
在观察下稀疏数组的第1列第0列他的值是0 意思就是原二维数组第0行
在观察下稀疏数组的第1列第1列他的值是2 意思就是原二维数组第0行第1列是非零的值
在观察下稀疏数组的第1列第1列他的值是2 意思就是原二维数组第0行第2列的值是2
后面的第三行第四行 … 原理和第一行一样
2.二维数组转换稀疏数组
package com.dazuizui;
/**
* 稀疏数组
*/
public class SpareseArray {
public static void main(String[] args) {
//创建一个原始的二位数组 11 *11
//0表示没有棋子 1表示黑棋 2表示白棋
int chaessArray1[][] = new int[11][11];
//设置棋子
chaessArray1[1][2] = 1;
chaessArray1[2][3] = 2;
System.out.println("最初的二维数组");
for (int[] ints : chaessArray1) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println("");
}
/**
* 转换稀疏数字
*/
System.out.println("\n\n\n=============================");
//先遍历二维数组得到非0数组数据
int sum = 0;
for (int[] ints : chaessArray1) {
for (int anInt : ints) {
if (anInt != 0){
sum++;
}
}
}
System.out.println("非0的数据"+sum);
//2.创建稀疏数组
int sparseArray[][] = new int[sum+1][3];
// 给稀疏数组赋值
// 第一行第一个存放行数,第二个存放列数
sparseArray[0][0] = chaessArray1.length;
sparseArray[0][1] = chaessArray1[0].length;
sparseArray[0][2] = sum;
//计数器 用于计算稀疏数组第几行
int count = 0;
//遍历二维数组将非0的数存到稀疏数组
for (int i = 0 ; i < chaessArray1.length ; i++){
for (int j = 0 ; j < chaessArray1[0].length ; j++){
if (chaessArray1[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chaessArray1[i][j];
}
}
}
for (int[] ints : sparseArray) {
for (int anInt : ints) {
System.out.print(anInt+"\t\t");
}
System.out.println();
}
}
}
打印结果:
最初的二维数组
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
=============================
非0的数据2
11 11 2
1 2 1
2 3 2
3 稀疏数组转换二维数组
已知稀疏数组
11 | 11 | 2 |
---|---|---|
1 | 2 | 1 |
2 | 3 | 2 |
/***
* 转换为二维数组
*/
int array2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1 ;i < sparseArray.length ; i++){
array2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
System.out.println("转二位数组后的数据\n====================");
for (int[] ints : array2) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
第一个for循环一定要从1开始,因为第0行是从记录有几行几列几个非0数值的,第二行才是记录第几列第几行有什么值。
打印结果
====================
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
Process finished with exit code 0