Javaのスパース配列
定義
疎な配列:配列内の要素のほとんどの値が使用される(または両方0)されていない、メモリ空間の浪費をもたらす配列内の空間の使用のほんの一部。
元の配列の新しい圧縮方式の表現を使用して疎な配列です。
なぜ、スパース配列を使うのか?
メモリ空間を節約するために。
原則スパース配列
アプリケーションシナリオの導入
開発者は、ボードが長方形であるので、あなたは2次元配列を使用することができ、アーカイブを実現するために、アンドゥをバックギャモンのゲームを開発し、チェスのゲームの結果を決定する必要がある、あなたはこれらの作品の場所を格納する必要があります。
しかし、我々は未使用のたくさん持っている可能性がメモリ位置を割り当て、チェスのプロセスをプレイ想像ので、ここでは、スパース配列の導入(すなわち、データ配列のほとんどが0または同じ値です)。
スパース配列を達成
スパース配列が作られた二次元配列で形質転換されていることを強調しなければなりません。
スパースアレイの列の数が値(2次元配列に対応する値)に対応する、三つ、即ち、行、列の合計が固定されています。
最初の行は、二次元アレイのまばらなアレイに対応するレコードが複数の奇数行と有効な値の数です。
各行の値とランクの対応する二次元アレイに記録次の有効な値です。
次に、我々は表現するために例を使用して、例えば、二次元アレイがある:上記の方法によれば、疎アレイに変換することができます。
Javaでスパース配列
2次元配列のスパース配列だから、どのように変換するには?
スパース配列に二次元配列
- 元の2次元アレイを横断する、有効なデータの数は、合計を得ます
- 合計は、疎な配列INT [和+ 1] [3]を作成します
- 有効なデータは2桁のグループスパースアレイ(RMSランク二次元アレイの第一の行為の数)に格納されています
public static int[][] twoToSparse(int[][] two){
int sum = 0;
// 第一步 计算非零值的个数
int row = two.length;
int col = two[0].length;
for (int i=0;i<row;i++){
for (int j=0;j<col;j++){
if(two[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
// 遍历二维数组,把非零的数据填充进去
int count = 0;
for (int i=0;i<row;i++){
for (int j=0;j<col;j++){
if(two[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = two[i][j];
}
}
}
return sparseArr;
}
疎アレイは、二次元アレイに変換されます
- 最初の行疎によれば、元の2桁のグループを作成します
- そして、元の2次元アレイに、読み出しデータバックを割り当てることとすることができます
public static int[][] sparseToTwo(int[][] sparse){
// 将稀疏数组恢复成二维数组
int rows = sparse[0][0];
int cols = sparse[0][1];
int myCount = sparse[0][2];
int[][] reArr = new int[rows][cols];
for(int i=1;i<sparse.length;i++){
int arrrow = sparse[i][0];
int arrcol = sparse[i][1];
int arrNum = sparse[i][2];
reArr[arrrow][arrcol] = arrNum;
}
return reArr;
}
完全なコード
package com.folm.dataStructure.SparseArray;
import java.io.*;
import java.util.Arrays;
public class SparseArray {
public static int[][] twoToSparse(int[][] two){
int sum = 0;
// 第一步 计算非零值的个数
int row = two.length;
int col = two[0].length;
for (int i=0;i<row;i++){
for (int j=0;j<col;j++){
if(two[i][j]!=0){
sum++;
}
}
}
//创建稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
// 遍历二维数组,把非零的数据填充进去
int count = 0;
for (int i=0;i<row;i++){
for (int j=0;j<col;j++){
if(two[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = two[i][j];
}
}
}
return sparseArr;
}
public static int[][] sparseToTwo(int[][] sparse){
// 将稀疏数组恢复成二维数组
int rows = sparse[0][0];
int cols = sparse[0][1];
int myCount = sparse[0][2];
int[][] reArr = new int[rows][cols];
for(int i=1;i<sparse.length;i++){
int arrrow = sparse[i][0];
int arrcol = sparse[i][1];
int arrNum = sparse[i][2];
reArr[arrrow][arrcol] = arrNum;
}
return reArr;
}
public static void main(String[] args){
// 创建一个原始的二维数组 11 * 11
// 0:表示没有棋子 1 表示黑色 0 表示蓝色
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][5] = 2;
// 输出原始的二维数组
System.out.println("原始的二维数组");
for(int[] row:chessArr1){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
int sparseArr[][] = twoToSparse(chessArr1);
// 输出稀疏数组的形式
System.out.println();
System.out.println("得到的稀疏数组的形式:");
for(int i=0;i<sparseArr.length;i++){
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
int[][] newTwo = sparseToTwo(sparseArr);
System.out.println("之后的二维数组:");
for(int[] row:newTwo){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
がんばろう!