Java基础学习——稀疏数组(小白看完必会)

大家好,我是瑞的居,今天分享的是稀疏数组的学习。本人也仅仅是想记录跟着b站狂神up学习的过程。

一、稀疏数组的举例与概述

稀疏数组举例

需求:编写五子棋游戏中,有存盘退出和还原上一盘的功能。

(先记住这个需求,这是敲代码所需的思路之一 —— 用新建的数组接收原始数组变成稀疏数组、再建一个新数组接收还原的稀疏数组变回原始数组)

分析:棋盘如图所示,如果我们把棋盘看成二维数组,那就是有很多的地方还没有下棋子。

因此,

我们来使用二维数组(11行11列)记录上述的棋盘,无棋是0、黑棋是1、白棋是2,则如下图所示:

稀疏数组概述

  • 当数组中大部分元素为0或者为同一值的元素时,可以使用稀疏数组来保存该数组;

  • 用稀疏数组,当然也是因为它能压缩空间啦!最初的时候空间是很值钱滴。

  • 稀疏数组的处理方法:

  1. 记录数组一共几行几列,有多少个不同的值;

  1. 把具有不同值的元素和行、列及值压缩记录在一个小规模的数组中。

二、原始数组与稀疏数组的转换

如下图所示,我们来理解它们的转换关系:

  1. 稀疏数组中第0行的6、7、8表示:原始数组中有6行、7列、8个非零的数值;

这些都是头部信息而已。

  1. 稀疏数组的第1行才才才才才开始记录原始数组中每一行每一列的具体信息;

如:第1行表示:原始数组的第0行、第3列的数值为22;

如:第2行表示:原始数组的第0行、第6列的数值为15;

如:第3行表示:原始数组的第1行、第1列的数值为11;

以此类推,不再赘述……

三、编写代码

练习第一步:创建一个二维数组代替棋盘

        //1.创建一个二维数组代替棋盘 11*11  0:没有棋子; 1:黑棋子; 2:白棋子
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;

        //输出原始的数组,这是foreach方法;下面我都用不同的遍历方法练习一下,但它们意思一样
        System.out.println("输出原始的数组:");
        for (int[] array11 : array1) {
            for (int a : array11) {
                System.out.print(a+"\t");
            }
            System.out.println();
        }

输出结果如下:

练习第二步:把原始的数组转换为稀疏数组来保存

        //2.转换为稀疏数组来保存
        //算出原始数组里面有效的值(非0的值)并取出;
        
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数:"+sum );

        //创建一个代表稀疏数组的数组
        int[][] array2 = new int[sum+1][3];
        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;
        //通过以上的几步,就把稀疏数组的头部打出来了

        //遍历二维数组,将非零的值,存放到稀疏数组中
        int count = 0;//它代表第几行
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j]!=0){
                    //为什么先count++?因为从第二行开始,第一行(黄色的[0])它是稀疏数组的头部啊!!
                    //为什么知道是[0]、[1]、[2],因为稀疏数组不就三列吗?只会是行数不一样!!  
                    count++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }
        }
        //输出稀疏数组,咱们知道就3列,不必按嵌套循环的套路输出
        System.out.println("稀疏数组");
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0]+"\t"
            +array2[i][1]+"\t"
            +array2[i][2]+"\t");
        }

练习第三步:尝试把稀疏数组还原为原始数组

        //1.建个新数组读取稀疏数组,把新数组还原为原始数组
        //如上述练习第二步所示:array2[0][0] = 11、array2[0][1] = 11,我们本来也清楚知道
        int[][] array3 = new int [array2[0][0]][array2[0][1]];

        //2.把原始数组的元素还原变回它的值,也就是把一些非0的值还原回来;
        //下面的第一个循环:i 为什么从 1 开始,因为第0行是稀疏数组的头部信息!!

        //首先,再次想明白,稀疏数组的具体数据是从第1行开始,第0行还不是!!
        //其次,它也只有3列啊!第0列、第1列、第2列!!
        //最后,它第1列,不就是原始数组第3列的横坐标吗?
        //     它第2列,不就是原始数组第3列的纵坐标吗?
        //这不就是array3[array2[i][0]][array2[i][1]] = array2[i][2];的意思吗?

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

        //3.把还原后的数组打印出来看看
        for (int i = 0; i < array3.length; i++) {
            for (int j = 0; j < array3[i].length; j++) {
                System.out.print(array3[i][j]+"\t");
            }
            System.out.println();
        }

输出结果如下图所示:

四、总结

  • 总体有一点点点绕,本人水平有限,欢迎各位批评指正,一起进步;

  • 特别是array3[array2[i][0]][array2[i][1]] = array2[i][2];

  • 上面的array3[ ][ ],只不过这两个括号里面分别是array2[i][0]、array2[i][1];但它们的值不就是两个数字吗,对不对?

不知道有没有人看,评论区求推荐一些好用的截图工具~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法学习目标:通过学习,学员能掌握主流数据结构算法的实现机制,开阔编程思路,提高优化程序的能力。
做一门精致,全面详细的 java数据结构算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值