java数据结构-稀疏数组 作者:哇塞大嘴好帥

java数据结构-稀疏数组 作者:哇塞大嘴好帥

作者:哇塞大嘴好帥(哇塞大嘴好帅)

1.介绍

​ 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
如果在开发中使用这个算法可以节省我们的空间提升效率.

稀疏数组的处理方法是

  • 纪律数组一共有就几行几列,有多少个不同的值
  • 把具体由不同的值的元素的行列和值纪律在一个小规模的数组中,从而缩小程序的规模

​ 首先观察稀疏数组第0行第0列他的值是6 意思就是原二维数组的行数 ,

​ 在观察下稀疏数组第0行第1列他的值是7 意思就是原二维数组的列数

​ 在观察下稀疏数组第0行第2列他的值是8 意思就是原二维数组有8个非0的数

​ 在观察下稀疏数组第1列第0列他的值是0 意思就是原二维数组第0行

​ 在观察下稀疏数组第1列第1列他的值是2 意思就是原二维数组第0行第1列是非零的值

​ 在观察下稀疏数组第1列第1列他的值是2 意思就是原二维数组第0行第2列的值是2

​ 后面的第三行第四行 … 原理和第一行一样

2.二维数组转换稀疏数组

package com.dazuizui;

/**
 * 稀疏数组
 */
public class SpareseArray {
    public static void main(String[] args) {
          //创建一个原始的二位数组 11 *11
        //0表示没有棋子  1表示黑棋 2表示白棋
         int chaessArray1[][] = new int[11][11];
         //设置棋子
        chaessArray1[1][2] = 1;
        chaessArray1[2][3] = 2;
        System.out.println("最初的二维数组");
        for (int[] ints : chaessArray1) {
            for (int anInt : ints) {
                System.out.print(anInt+"   ");
            }
            System.out.println("");
        }
        /**
         * 转换稀疏数字
         */
        System.out.println("\n\n\n=============================");
        //先遍历二维数组得到非0数组数据
        int sum = 0;
        for (int[] ints : chaessArray1) {
            for (int anInt : ints) {
                if (anInt != 0){
                    sum++;
                }
            }
        }
        System.out.println("非0的数据"+sum);

        //2.创建稀疏数组
        int sparseArray[][] = new int[sum+1][3];
        // 给稀疏数组赋值
        // 第一行第一个存放行数,第二个存放列数
        sparseArray[0][0] = chaessArray1.length;
        sparseArray[0][1] = chaessArray1[0].length;
        sparseArray[0][2] = sum;

        //计数器 用于计算稀疏数组第几行
        int count = 0;

        //遍历二维数组将非0的数存到稀疏数组
        for (int i = 0 ; i < chaessArray1.length ; i++){
            for (int j = 0 ; j < chaessArray1[0].length ; j++){
                if (chaessArray1[i][j] != 0){
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chaessArray1[i][j];
                }
            }
        }

        for (int[] ints : sparseArray) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t\t");
            }
            System.out.println();
        }
    }
}

打印结果:

最初的二维数组
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   



=============================
非0的数据2
11		11		2		
1		2		1		
2		3		2		

3 稀疏数组转换二维数组

已知稀疏数组

11112
121
232
/***
 * 转换为二维数组
 */
int array2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

for (int i = 1 ;i < sparseArray.length ; i++){
    array2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}

System.out.println("转二位数组后的数据\n====================");
for (int[] ints : array2) {
    for (int anInt : ints) {
        System.out.print(anInt+"  ");
    }
    System.out.println();
}

​ 第一个for循环一定要从1开始,因为第0行是从记录有几行几列几个非0数值的,第二行才是记录第几列第几行有什么值。

打印结果

====================
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  

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值