Java数据结构与算法_02_稀疏数组和队列
稀疏数组和队列
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
稀疏数组:
第一行:记录了原始数组的大小,一共有多少行多少列吗,有效数据的个数。
第二行及以后:记录了各个非0数据的位置坐标。
代码:
package org.example;
public class d01 {
public static void main(String[] args) {
// 创建数组
int[][] intArrays = getIntArrays(11, 11);
// 设置棋子
intArrays = setValue(1, 2, 1, intArrays);
intArrays = setValue(2, 4, 2, intArrays);
// 查看数组
selectArray(intArrays);
// 转为稀疏数组
int[][] tosparsearray = tosparsearray(intArrays);
//
System.out.println();
System.out.println();
System.out.println();
System.out.println();
// 查看稀疏数组
selectArray(tosparsearray);
// 恢复二维数组
int[][] intArrays1 = toIntArrays(tosparsearray);
selectArray(intArrays1);
}
/**
* 获取一个长度为x,内部长度为y的二维数组
*
* @param x
* @param y
* @return
*/
public static int[][] getIntArrays(int x, int y) {
int[][] ints = new int[x][];
for (int i = 0; i < ints.length; i++) {
ints[i] = new int[y];
}
return ints;
}
/**
* 根据传入的坐标写入数据
*/
public static int[][] setValue(int x, int y, int value, int[][] arrays) {
arrays[x][y] = value;
return arrays;
}
/**
* 查看数组
*
* @param array
*/
public static void selectArray(int[][] array) {
for (int[] ints : array) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
}
/**
* 转为稀疏数组
*
* @param intArrays
* @return
*/
public static int[][] tosparsearray(int[][] intArrays) {
// 设置第一行数据
int[] ints = new int[3];
ints[0] = intArrays.length;
ints[1] = intArrays[0].length;
ints[2] = getsum(intArrays);
// 设置返回结果集
int[][] ints1 = new int[ints[2] + 1][];
ints1[0] = ints;
// 设置后面的数据
int f = 0;
for (int x = 0, intArraysLength = intArrays.length; x < intArraysLength; x++) {
int[] intArray = intArrays[x];
for (int y = 0, intArrayLength = intArray.length; y < intArrayLength; y++) {
int i = intArray[y];
if (i != 0) {
f++;
int[] ints2 = new int[3];
ints2[0] = x;
ints2[1] = y;
ints2[2] = i;
ints1[f] = ints2;
System.out.println("(" + x + "," + y + ")");
}
}
}
return ints1;
}
/**
* 查询数组中有效数据的个数。
*
* @param intArrays
* @return
*/
public static int getsum(int[][] intArrays) {
int sum = 0;
for (int x = 0, intArraysLength = intArrays.length; x < intArraysLength; x++) {
int[] intArray = intArrays[x];
for (int y = 0, intArrayLength = intArray.length; y < intArrayLength; y++) {
int i = intArray[y];
if (i != 0) {
sum++;
}
}
}
return sum;
}
/**
* 恢复二维数组
*
* @param arrays
* @return
*/
public static int[][] toIntArrays(int[][] arrays) {
int[][] intArrays = getIntArrays(arrays[0][0], arrays[0][1]);
for (int i = 1; i <= arrays[0][2]; i++) {
setValue(arrays[i][0], arrays[i][1], arrays[i][2], intArrays);
}
return intArrays;
}
}
输出结果:
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 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
(1,2)
(2,4)
11 11 2
1 2 1
2 4 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 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
PS:
- 该笔记为网络课程笔记,课程地址:https://www.bilibili.com/video/BV1E4411H73v/?spm_id_from=333.337.search-card.all.click
- 如有疑问或有错误之处,欢迎讨论指正;