Java データ構造とアルゴリズム: スパース配列 (SparseArray)

コンパイル ソフトウェア: IntelliJ IDEA 2019.2.4 x64
オペレーティング システム: win10 x64-bit Home Edition



ここに画像の説明を挿入


1. スパース配列とは何ですか?

1.1 基本的な概要

配列内のほとんどの要素が 0 であるか、同じ値の配列である場合、スパース配列を使用して配列を保存できます。

1.2 スパース配列の処理方法

  1. レコード配列には行と列が何行あり、異なる値が何個ありますか?
  2. 行、列、および異なる値を持つ要素の値を小規模な配列に記録することで、プログラムのサイズを削減します

1.3 例

ここに画像の説明を挿入


2. スパース配列を使用する理由は何ですか?

2.1 まずこの特定のアプリケーション要件を確認してください

質問

作成したバックギャモン プログラムには、次の図に示すように、保存、終了、再読み込みの機能があります。

ここに画像の説明を挿入

上述の 11X11 バックギャモン ボードでは、保存、終了、および再ロードの機能を実行する必要がある場合、現在のチェス盤の状態情報をローカルにダウンロードするか、最後に保存されたチェス盤の状態情報をプログラムにアップロードする必要があります。そしてこのとき、対戦の碁盤の状態情報を保存するためのデータ構造が必要となります。

通常は、ネイティブの 2 次元配列を使用してチェス盤の状態情報を記録しますが、これでは問題が発生します。二维数组的很多值如果不赋值,那么会被程序主动赋默认值,比如int类数组会被赋值为0,因此二维数组中会记录了很多没有意义的数据,造成内存空间的极大浪费。

解決

現時点では、スパース配列を使用して元の 2 次元配列内のすべてのデータを「圧縮」することを検討できます。これにより、元の 2 次元配列のスペース利用率が向上します。

2.2 スパース配列を使用する利点と欠点

アドバンテージ

  • 提高空间利用率:スパース配列には、デフォルト以外の値を持つ要素情報のみが格納されるため、占有されるストレージ領域が大幅に削減されます。
  • 方便进行压缩和解压缩:スパース配列は簡単に圧縮および解凍できるため、大規模なスパース行列の保存と送信に非常に役立ちます。
  • 提高运算效率:スパース配列に対して演算を実行する場合、すべての要素に対する無効な演算を回避するために、デフォルト値以外の要素のみを処理できるため、演算効率が向上します。

欠点がある

  • 降低数组的访问速度:スパース配列内のデフォルト値以外の要素の位置情報には追加のストレージが必要なため、特に大規模なスパース行列では、これらの要素へのアクセスは比較的遅くなります。
  • 需要进行额外的处理:スパース配列を使用するには、要素の位置情報の追加処理が必要となり、コードが複雑になり、メンテナンスのコストが増加します。

要約すると、スパース配列は、ほとんどの要素がデフォルト値または繰り返し値である状況に適しており、占有されるストレージ領域を大幅に削減できますが、同時に、そのアクセス速度とコードには特別な注意を払う必要があります。複雑さ


3. スパース配列の使用方法は?

3.1 応用例

  1. スパース配列を使用して、以前の配列 (チェス盤、マップなど) のような 2D 配列を保存します。

  2. スパース配列をディスクに保存し、元の 2 次元配列データを復元します

  3. 全体的な考え方分析

    ここに画像の説明を挿入
    2次元配列を疎配列に変換する考え方

    1.遍历原始的二维数组,得到有效数据的个数sum

    2.根据sum就可以创建稀疏数组sparseArr int[sum+1)][3]

    3.将二维数组的有效数据数据存入到稀疏数组

    ②疎な配列を本来の二次元配列に変換するという考え方

    1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11]

    2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可

3.2 アプリケーションコードは次のとおりです

//稀疏键盘
public class t2 {
    
    

    public static void main(String[] args) {
    
    
        //定义原始棋盘的落子情况【二维数组】
        int[][] arr=new int[11][11];
        //1 -> 黑子,2 -> 篮子,0 -> 无子
        arr[1][2]=1;
        arr[2][3]=2;
        arr[5][2]=3;
        int sum=0;
        System.out.println("二维数组:" );
        for (int[] ints : arr) {
    
    
            for (int data : ints) {
    
    
                if (data!=0){
    
    
                    sum++;
                }
                System.out.print(data+"\t");
            }
            System.out.println();
        }

        //二维数组转为稀疏数组
        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 < arr.length ; i++) {
    
    
            for (int j = 0; j < arr[i].length; j++) {
    
    
                if (arr[i][j]!=0){
    
    
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=arr[i][j];
                }
            }
        }

        System.out.println("稀疏数组:");
        for (int[] ints : sparseArr) {
    
    
            for (int data : ints) {
    
    
                System.out.print(data+"\t");
            }
            System.out.println();
        }

        //将稀疏数组恢复为二维数组newArr
        //1。先读取稀硫数组的第一行,根据第一行的数据,创建原始的二维数组
        int[][] newArr=new int[sparseArr[0][0]][sparseArr[0][1]];
		
		//2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
        for (int i = 1; i < sparseArr.length ; i++) {
    
    
            for (int j = 0; j < sparseArr[i].length ; j++) {
    
    
                if (j>1){
    
    
                    int row=sparseArr[i][j-2];
                    int col=sparseArr[i][j-1];
                    newArr[row][col]=sparseArr[i][j];
                }
            }
        }

        //打印恢复后的二维数组newArr
        System.out.println("打印新二维数组newArr:");
        for (int[] ints : newArr) {
    
    
            for (int data : ints) {
    
    
                System.out.print(data+"\t");
            }
            System.out.println();
        }

    }
}

ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/siaok/article/details/131733364
おすすめ