使用Java 将二维数组转化为稀疏矩阵

本文介绍如何使用Java实现二维数组到稀疏矩阵的转换,通过遍历原数组获取非零元素并将其行列及值存入稀疏矩阵,再还原为二维数组。

使用Java 将二维数组转化为稀疏矩阵
先说一下思路.
在传统的二维数组进行信息存储时,如果有大量的零,也需要进行存储,这就造成了内存空间的浪费,稀疏矩阵可很好弥补该缺点.

在稀疏矩阵中,第一行为属性信息,一次表示原数组的行 列 总存储个数
如图红框所示:
属性

在上述稀疏矩阵中
第一行的1 3 表示该元素为 原数组中 一行三列(注意数组下标从0开始),而最后的 1 则表示该位置上存放的值为1.
稀疏矩阵中内层数组的大小是固定的 为3, 既为稀疏矩阵的三个属性

而外层数组的大小则取决于 原数组的 非零数值个数 也就是下文中sum的值

大小问题解决后就是矩阵的填充,

在这里可以通过对二维数组进行遍历,通过if语句筛选出非零值,

然后将非零值以及非零值的行列数填入稀疏矩阵 此处注意i j可赋值给矩阵的第一二列

由于第0行表示了属性 所以要从第一行开始填写 这里可以设置计数器控制行数

最近在学习数据结构有关知识,代码技术仍有待提高,仅提供解决代码以供参考.


/**
 *
 * 二维数组--->稀疏数组
 */

import org.junit.Test;
public class Demo0318 {
    @Test
    public void test01(){
        //创建一个原始的二维数组11*11
        //0:表示没有棋子 1表示黑子 2 表白子
        int chessArr1[][] = new int[11][11];
        chessArr1[1][3] = 1;
        chessArr1[2][8] = 2;
        chessArr1[5][10] = 2;
        int sum = 0;//记录非零值
        
        System.out.println("二维数组:");
        for (int[] arr:chessArr1
             ) {
            for (int element:arr
                 ) {
                if (element!=0){
                    sum++;//遍历找到数组中的非零值
                }
                System.out.print(element+"\t");
            }
            System.out.println();
        }
        System.out.println(sum);

        //将二维数组转化为稀疏矩阵
        //确定新矩阵的行数以及列数
        
        int[][] arr_2 = new int[sum+1][3];
        int count = 0;
        arr_2[0][0] = chessArr1.length;
        arr_2[0][1] = chessArr1.length;
        arr_2[0][2] = sum;
        System.out.println("稀疏数组为:");
        System.out.println(arr_2[0][0]+"\t"+arr_2[0][1]+"\t"+arr_2[0][2]+"\t");
        for (int i = 0; i < chessArr1.length ; i++) {
            for (int j = 0; j <chessArr1.length ; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    arr_2[count][0] = i;
                    arr_2[count][1] = j;
                    arr_2[count][2] = chessArr1[i][j];
                    System.out.println(arr_2[count][0]+"\t"+arr_2[count][1]+"\t"+arr_2[count][2]+"\t");
                }
            }
        }
        //稀疏矩阵--->二维数组
        System.out.println("二维数组:");
        int[][] arr_3 = new int[arr_2[0][0]][arr_2[0][1]];
        for (int i = 1;i< arr_2.length;i++){
            arr_3[arr_2[i][0]][arr_2[i][1]] = arr_2[i][2];
        }
        for (int[] arr_4:arr_3
             ) {
            for (int element:arr_4
                 ) {
                System.out.print(element+"\t");
            }
            System.out.println();
        }

    }
}

本人在转化稀疏矩阵时,在匹配位置信息时花费较长时间,没有将二维数组与稀疏矩阵之间的联系找清楚,应注意对二维数组进行遍历时,可通过 for循环中的 i j 确定二维数组中各项元素的位置信息.
附结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值