なぜ2次元配列をスパース配列に変換するのですか?
実際に配列を使用する場合、ほとんどの配列はすべてのスペースを埋めるわけではないため、有効なデータを照会するときにすべての位置をトラバースする可能性があります。明らかに、必要な消費がないため、これは場合によっては、変換を実行するためにスパースである必要があります。
図から、左側の元の2次元配列は6 * 7 = 42で、右側の疎配列は9 * 3 = 27であることがわかります。明らかに、27をトラバースするのにかかる時間は、42をトラバースするよりもはるかに短いです。スパース配列の役割が示されています
スパース配列とは何ですか?
配列のほとんどの要素が0または同じ値の配列である場合、スパース配列を使用して配列を保存できます。
スパース配列処理方法は、
次のとおりです。レコード配列の最初の行には合計でいくつかの行と列
があり、さまざまな値がいくつあり、値が異なる要素の行、列、および値を小規模な配列に記録することで、プログラムのサイズを削減します。
2次元配列とスパース配列を相互に接続する方法は?
2次元配列->スパース配列
1.元の2次元配列をトラバースして有効なデータの数を取得しますSum
2. Sumに基づいて疎配列を作成しますsparseArr = int [sum + 1] [3]
3.元の2次元配列の有効なデータを疎配列に格納します
スパース配列-> 2次元配列
1.スパース配列の最初の行を読み取り、最初の行のデータに基づいて2次元配列を作成します
。2 . スパース配列の2番目以降の行のデータを2 次元配列に割り当てます
まあ、それほどゴシップではなく、コードに移動してください!
package com.xiaozhao.datastructure;
import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks;
/**
* @author : Carson-Zhao
* @date : 2020/7/15 21:49
*/
public class SparseArray {
public static void main(String[] args) {
/**
* 创建一个原始的二维数组 11*11
* 0:表示没有棋子
* 1:表示黑子
* 2:表示白子
*
*/
int[][] chessArray = new int[11][11];
chessArray[1][2] = 1;
chessArray[2][3] = 2;
chessArray[5][8] = 9;
for(int[] c : chessArray){
for (int data : c){
System.out.printf("%d\t",data);
}
System.out.println();
}
/**
* 将二维数组转换为稀疏数组
* 1.遍历原始二位数数组,得到非零数据的个数
* 2.创建稀疏数组
* 3.将原始数组的有效数据赋值给稀疏数组
*/
int sum = 0;
for(int i = 0;i < chessArray.length;i++){
for (int j = 0; j < chessArray.length; j++) {
if(chessArray[i][j] != 0){
sum++;
}
}
}
int[][] sparseArray = new int[sum+1][3];
//给稀疏数组赋值
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = sum;
//遍历二维数组,拿到有效数据
int count = 0;//用于记录第几个非零数据
for(int i = 0;i < chessArray.length;i++){
for (int j = 0; j < chessArray.length; j++) {
if(chessArray[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = chessArray[i][j];
}
}
}
System.out.println();
//输出转换后的稀疏数组
System.out.println("输出转换后的稀疏数组");
System.out.println();
for (int i = 0; i < sparseArray.length; i++) {
System.out.printf(
"%d\t%d\t%d\t",
sparseArray[i][0],
sparseArray[i][1],
sparseArray[i][2]
);
System.out.println();
}
System.out.println();
System.out.println("将稀疏数组恢复成二维数组");
System.out.println();
//将稀疏数组恢复成二维数组
int N = sparseArray[0][0];
int M = sparseArray[0][1];
int[][] array = new int[N][M];
for (int i = 1; i < sparseArray.length; i++) {
array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
for(int[] c : array){
for (int data : c){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
実装効果は次のとおりです。
D:\Environment\Java\jdk1.8.0_251\bin\java.exe "
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 9 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 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 3
1 2 1
2 3 2
5 8 9
将稀疏数组恢复成二维数组
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 9 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 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
特定の実装にはコードで注釈が付けられているので、最後に詳しく説明することはしません。。。。。
私は食べ物のために学びます、私はシャオ・チャオです、私はお互いを励ますことを望みます!