java实现稀疏数组/稀疏矩阵(基础)

百度百科:
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;
与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。
定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。
定义
矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵(sparse matrix),该比值称为这个矩阵的稠密度;与之相区别的是,如果非零元素的分布存在规律(如上三角矩阵、下三角矩阵、对角矩阵),则称该矩阵为特殊矩阵。
比较基本的定义是矩阵中的大多数元素为零,并且可以利用零元素节约大量存储、运算和程序运行时间。
本文章示例稀疏数组转换:
数组
数组2

主方法:

public class Application {
    
    
    /**
     * 假设要将如下数据保存至一数组当中:
     * 00000
     * 00100
     * 30000
     * 00070
     * 12300
     */
    public static void main(String[] args) {
    
    
        //创建二维数组,并按题目中要求数字存入数组中
        int[][] arr = new int[5][5];
        arr[1][2] = 1;
        arr[2][0] = 3;
        arr[3][3] = 7;
        arr[4][0] = 1;
        arr[4][1] = 2;
        arr[4][2] = 3;
        SparseArray sa = new SparseArray();
        sa.calculate(arr);
    }
}

稀疏数组方法

public class SparseArray {
    
    
    /**
     * 假设要将如下数据保存至一数组当中:
     * 00000
     * 00100
     * 30000
     * 00070
     * 12300
     */
    public void calculate(int[][] arr) {
    
    
        System.out.println("输入的数组是:");
        for (int[] ints : arr) {
    
    
            for (int anInt : ints) {
    
    
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        System.out.println("========我是分割线========");
        //转换为稀疏数组:
        //计数(arr矩形数组之中的有效数字)
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
    
    
            for (int j = 0; j < arr.length; j++) {
    
    
                if (arr[i][j] != 0) {
    
    
                    sum++;
                }
            }
        }
        //新建数组作为稀疏数组
        int[][] arr1 = new int[sum + 1][3];
        //第0行储存数据为: 共有_行 共有_列 共有_个有效数组
        arr1[0][0] = arr.length;
        arr1[0][1] = arr[1].length;
        arr1[0][2] = sum;
        //遍历第二遍数组,将非零数值存入新数组当中
        int rows = 1;
        for (int i = 0; i < arr.length; i++) {
    
    //arr.length是arr[][]的行数
            for (int j = 0; j < arr[i].length; j++) {
    
    //arr[][].length是arr[][]的列数
                if (arr[i][j] != 0) {
    
    
                    arr1[rows][0] = i;
                    arr1[rows][1] = j;
                    arr1[rows][2] = arr[i][j];
                    rows++;
                }
            }
        }
        System.out.println("输出稀疏数组:");
        for (int[] ints : arr1) {
    
    
            for (int anInt : ints) {
    
    
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        System.out.println("========我是分割线========");
        //还原数组:
        int[][] arr2 = new int[arr1[0][0]][arr1[0][1]];
        //还原数组中元素的值
        for (int i = 1; i < arr1.length; i++) {
    
    
            arr2[arr1[i][0]][arr1[i][1]] = arr1[i][2];
        }
        System.out.println("打印还原数组:");
        for (int[] ints : arr2) {
    
    
            for (int anInt : ints) {
    
    
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45380885/article/details/109137948