稀疏矩阵

稀疏矩阵

因为二维数组很多值默认为零,因此记录了很多没有意义的数据。

使用二维数组(三元组)来解决这种问题

源代码
import java.util.Arrays;

public class Demo05 {
    public static void main(String[] args) {
        // 创建二维数组 11*11 0没有棋子, 1为黑棋 2为白棋
        int[][] a = new int[11][11];
        a[1][2] = 1;
        a[2][3] = 2;
        //输出原始数组(增强型数组方法)
        for (int[] ints : a) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
        System.out.println("=============================");
        //转换为稀疏数组
        //统计三元组里有效元素个数
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                if (a[i][j]>0)
                {
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数: " + sum);

        //创建一个稀疏数组的数组
        int [][] a2 = new int[sum+1][3];
        a2[0][0] = a.length;    //第一个数是行数
        a2[0][1] = a[0].length; //第二个数是列数
        a2[0][2] = sum;         //有效元素的个数

        //遍历二维数组,将非零值存放在稀疏数组中
        int count = 0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                if (a[i][j] > 0)
                {
                    count++;         //遍历到有效值就跳转到行
                    a2[count][0] = i;//行
                    a2[count][1] = j;//列
                    a2[count][2] = a[i][j];//元素值
                }
            }
        }

        //输出稀疏矩阵(使用Arrays工具类的toString方法)
        for (int i = 0; i < a2.length; i++) {
            System.out.println(Arrays.toString(a2[i]));
        }
        System.out.println("=============================");
        //还原稀疏矩阵
        //读取稀疏矩阵
        int a3[][] = new int[a2[0][0]][a2[0][1]];//用稀疏矩阵的第一行 也就是存原数组的行和列的数量来定义原数组大小
        //给原数组还原他的值
        for (int i = 1; i < a2.length; i++) {
            a3[ a2[i][0] ][ a2[i][1] ]=a2[i][2]; // 行列值
        }
        //输出还原数组
        for (int[] ints : a3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

    }
}


运行结果

1-1663752051332