[数据结构01]JAVA语言 稀疏数组

转载自CSDN博主「飒飒蝴蝶谷」的原创文章
原文链接:https://blog.csdn.net/qq_42435377/article/details/107425298

稀疏数组

概述

当一个数组中重复元素居多的时候,可以使用稀疏数组保存。

比如:五子棋,白子为1、黑子为2、无子为0,大多数数据都是0,则可以使用稀疏数组进行保存。

原理

将二维数组中的有效数据转换为稀疏数组保存
稀疏数组记录的数据有:

编号
0共有几行共有几列共几个有效值
1第几行第几列值为多少

如:

              0 0 0 0 0 0 0 0 0 0 0
              0 0 1 0 0 0 0 0 0 0 0
              0 0 0 2 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0 0 0 0
				#	共11行,11列

以上二维数组保存为稀疏数组:

11	11	2	# 	共十一行十一列两个有效值
1	2	1	#	第1行第2列值为1	从0列开始
2	3	2	#	第2行第3列值为2

实现

public class SparseArray {
    public static void main(String[] args) {
        //创建初二维数组
        int array[][] = new int[11][11] ;
        //赋值
        array[1][2] = 1;
        array[2][3] = 2;
        array[3][4] = 3;
        //遍历输出
        for (int[] ints : array) {
            for (int anInt : ints) {
                System.out.print(anInt);
            }
            System.out.println();
        }
        System.out.println("========转换成稀疏数组=======");
        //转换成稀疏数组
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0) {
                    sum++;//记录有多少个有效数据
                }
            }
        }
        System.out.println("sum=" + sum);
        //创建稀疏数组
        int sparseArray[][] = new int[sum+1][3];
        //给稀疏数组第一行赋值
        sparseArray[0][0] = array.length;
        sparseArray[0][1] = array[0].length;
        sparseArray[0][2] = sum;
        //给稀疏数组其他行赋值
        int count = 0;//count记录这是第几个有效数据
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0){
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = array[i][j];
                }
            }
        }
        for (int[] ints : sparseArray) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        System.out.println("=======转换成普通二维数组======");
        //转换成普通二维数组
        //创建数组
        int array2[][] = new int[ sparseArray[0][0] ] [ sparseArray[0][1] ] ;
        //将有效数据赋值给普通二维数组
        for (int i = 1; i < sparseArray[0][2] + 1; i++) {
            array2[ sparseArray[i][0] ][ sparseArray[i][1] ] = sparseArray[i][2];
        }
        //遍历输出
        for (int[] ints : array2) {
            for (int anInt : ints) {
                System.out.print(anInt);
            }
            System.out.println();
        }
    }
}

执行结果:

00000000000
00100000000
00020000000
00003000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
========转换成稀疏数组=======
11	11	3	
1	2	1	
2	3	2	
3	4	3	
=======转换成普通二维数组======
00000000000
00100000000
00020000000
00003000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值