[자료구조] 2. 배열과 희소 배열의 사용

1. 어레이 개념

배열은 저장 공간이 연속적인 데이터 구조입니다. 따라서 배열은 요소를 제거하기가 복잡하고 요소를 쿼리하는 데 매우 빠릅니다. 삭제 논리는 기본적으로 재정의입니다.

동시에 배열은 동일한 데이터 유형의 요소만 저장할 수 있는 가장 단순한 컨테이너이기도 하며 배열의 용량이 결정되면 변경할 수 없습니다.

배열은 1차원 배열과 다차원 배열로 나눌 수 있습니다. 일반적으로 행렬은 2차원 배열입니다.

배열을 선언하는 방법:

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

배열 초기화 방법에는 정적 초기화와 동적 초기화가 있습니다.

2. 자바의 배열

java.util.Arrays클래스는 배열을 쉽게 조작할 수 있으며 제공하는 모든 메서드는 정적입니다.

일반적인 작업에는 다음이 포함됩니다.

  • 채우기 방법을 통해 배열에 값을 할당합니다.
  • 배열 정렬: 정렬 방법에 따라 오름차순으로 정렬합니다.
  • 배열 비교: equals 메서드를 통해 배열의 요소가 동일한지 비교합니다.
  • 배열 요소 찾기: 이진 검색 방법은 정렬된 배열에서 이진 검색 작업을 수행하는 데 사용할 수 있습니다.

3. 희소 배열

희소 배열, 즉 배열에 0 값(또는 동일한 값)이 많을 때 배열을 직접 저장하면 공간이 낭비되고 특정 압축 전략을 사용해야 하며 압축 후 손실 없이 복원할 수 있습니다. .

이 때의 상황은 대부분의 체스판이 비어 있는 상태인데, 기본값은 0인데, 최대한 공간을 절약하기 위해 어떻게 보관해야 할까요?

희소 배열을 위한 구성 전략:

1. 순회하고 배열에 얼마나 많은 행과 열이 있는지, 얼마나 많은 다른 값이 있는지 기록하십시오. n;

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