【データ構造】2.配列とスパース配列の使用

1.アレイの概念

配列は、ストレージスペースが隣接しているデータ構造です。したがって、配列は要素を削除するのが複雑で、要素のクエリを非常に高速に実行します。削除のロジックは本質的にオーバーライドであることに注意してください。

同時に、配列は最も単純なコンテナでもあり、同じデータ型の要素のみを格納できます。配列の容量が決定されると、それを変更することはできません。

配列は、1次元配列と多次元配列に分けることができます。一般的に、行列は2次元配列です。

配列を宣言する方法:

int[] arr = new int{
    
    1,2,3};
String[] arr = new String[3][3];
int[] arr = {
    
    1,2,3};

アレイの初期化方法には、静的初期化と動的初期化が含まれます。

2.Javaの配列

java.util.Arraysクラスは配列を簡単に操作でき、クラスが提供するすべてのメソッドは静的です。

一般的な操作は次のとおりです。

  • 配列に値を割り当てます:fillメソッドを使用します。
  • 配列を並べ替えます:sortメソッドで昇順で並べ替えます。
  • 配列の比較:equalsメソッドを使用して、配列内の要素が等しいかどうかを比較します。
  • 配列要素の検索:バイナリ検索メソッドを使用して、並べ替えられた配列に対してバイナリ検索操作を実行できます。

3.スパース配列

スパース配列、つまり、配列にゼロ値(または同じ値)が多数ある場合、配列を直接格納するとスペースが無駄になり、特定の圧縮戦略を使用する必要があり、圧縮後にロスレスで復元できます。

現時点での状況は、ほとんどのチェス盤が空であり、これがデフォルト値の0です。では、スペースをできるだけ節約するために、どのようにチェス盤を保管するのでしょうか。

スパース配列の構築戦略:

1.トラバースしてから、配列に含まれる行と列の数、および異なる値の数を記録します。

2.(n + 1,3)2次元配列ストレージを作成します。このストレージでは、最初の行に要素の順序と要素番号の情報が記録され、他の行には対応する位置要素の情報が記録されます。

4.スパース配列を使用してチェッカーボード圧縮ストレージを実装します

ケース:3 * 3のチェス盤データは圧縮されてスパース配列に格納され、元の配列に復元できます。(この例はあまり適切ではないため、保存する操作がより複雑になります。明らかに、要素の数が次数よりも多い場合は、行列の圧縮にスパース行列を使用する方が適切です。)

package com.lsk.array;

import java.io.*;

public class SparseArray {
    
    
    public static void main(String[] args) throws IOException {
    
    
        int[][] arr = new int[3][3];
        arr[0][0] = 1;
        arr[1][1] = 2;
        arr[1][2] = 3;
        arr[2][1] = 5;
        System.out.println("原始数组为:");
        printArr(arr);
        int[][] spareArray = spareArray(arr);
        System.out.println("压缩的稀疏数组为:");
        printArr(spareArray);
        saveToDisk(spareArray);
        int[][] orignArr = unSparseArr(spareArray);
        System.out.println("稀疏数组还原为原始数组:");
        printArr(orignArr);
        
    }

    /**
     * 压缩稀疏数组实现方法
     *
     * @param arr 原始数组
     * @return 稀疏数组
     */
    public static int[][] spareArray(int arr[][]) {
    
    
        //计算原始数组非0元素个数
        int sum = 0;
        int row = arr.length;
        int column = arr[0].length;
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < column; j++) {
    
    
                if (arr[i][j] != 0) {
    
    
                    sum++;
                }
            }
        }
        int sparseArr[][] = new int[sum + 1][3];
        sparseArr[0][0] = row;
        sparseArr[0][1] = column;
        sparseArr[0][2] = sum;

        int count = 0;//记录不同值得序号
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < column; j++) {
    
    
                if (arr[i][j] != 0) {
    
    
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr[i][j];
                }
            }
        }
        return sparseArr;
    }

    /**
     * 根据稀疏数组还原为原始数组
     *
     * @param arr
     * @return
     */
    public static int[][] unSparseArr(int arr[][]) {
    
    
        int row = arr[0][0];
        int column = arr[0][1];
        int sum = arr[0][2];
        int orignArr[][] = new int[row][column];
        for (int i = 1; i < sum + 1; i++) {
    
    
                orignArr[arr[i][0]][arr[i][1]] = arr[i][2];
        }
        return orignArr;
    }

    /**
     * 将数组写入到磁盘中
     * @param arr
     * @throws IOException
     */
    public static void saveToDisk(int arr[][]) throws IOException {
    
    
        File file = new File("d:/temp/arr.txt");
        if(!file.exists()){
    
    
            file.createNewFile();
        }
        //创建字符写入流对象
        FileOutputStream fo = new FileOutputStream(file);
        OutputStreamWriter writer = new OutputStreamWriter(fo, "utf8");
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
        for(int i=0;i<arr.length;i++){
    
    
            for(int j=0;j<arr[0].length;j++){
    
    
                bufferedWriter.write(arr[i][j]+"\t");//注意这里需用字符的形式写入,不然会乱码
            }
            bufferedWriter.write("\r\n");
        }
        bufferedWriter.close();
        writer.close();
        fo.close();
        System.out.println("保存成功!");
    }

    /**
     * 打印二维数组方法
     *
     * @param arrs
     */
    public static void printArr(int arrs[][]) {
    
    
        for (int[] arr : arrs) {
    
    
            for (int a : arr) {
    
    
                System.out.print(a + " ");
            }
            System.out.println();
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_40589204/article/details/118607382